1+ <!DOCTYPE html>
2+ < html lang ="ko ">
3+ < head >
4+ < title > Rust 튜토리얼 - 자기주도프로젝트</ title >
5+
6+ < meta charset ="UTF-8 ">
7+ < meta content ="text/html;charset=utf-8 " http-equiv ="Content-Type ">
8+ < meta content ="utf-8 " http-equiv ="encoding ">
9+ < meta name ="viewport " content ="width=device-width, initial-scale=1, maximum-scale=2 ">
10+ < meta name ="keywords " content ="Rust, Programming, Learning ">
11+ < meta name ="description " content ="Rust tutorial website based on tour_of_rust by 최석원 ">
12+ < meta name ="theme-color " content ="#ff6801 "/>
13+ < meta http-equiv ="Cache-Control " content ="max-age=3600 ">
14+
15+ < link rel ="stylesheet " href ="tour.css ">
16+ < link rel ="stylesheet " href ="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/styles/night-owl.min.css ">
17+ < link rel ="stylesheet " href ="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.1/css/all.min.css ">
18+
19+ < link rel ="apple-touch-icon " sizes ="180x180 " href ="/apple-touch-icon.png ">
20+ < link rel ="icon " type ="image/png " sizes ="32x32 " href ="/favicon-32x32.png ">
21+ < link rel ="icon " type ="image/png " sizes ="16x16 " href ="/favicon-16x16.png ">
22+ < link rel ="/manifest " href ="./site.webmanifest ">
23+
24+ < script src ="//unpkg.com/@highlightjs/cdn-assets@11.7.0/highlight.min.js "> </ script >
25+
26+ < script src ="./tour.js " defer > </ script >
27+ <!-- <script>hljs.highlightAll();</script> -->
28+ < script src ="./highlight.badge.min.js "> </ script >
29+ </ head >
30+ < body >
31+ < div class ="tour ">
32+ < div class ="header ">
33+ < span class ="title "> < a href ="index.html "> Rust 튜토리얼</ a > </ span >
34+ < span class ="nav ">
35+ < span class ="toc "> < a href ="TOC_ko.html "> 목차</ a > </ span >
36+ </ div >
37+ < div class ="page ">
38+ < h1 > main() && impl Responder</ h1 >
39+ < h2 id ="actixrsmain "> actix-rs main()</ h2 >
40+ < p > 아래는 웹 서버를 시작하는 역할을 합니다. </ p >
41+ < pre > < code class ="rust "> #[actix_web::main]
42+ async fn main() -> std::io::Result<()> {
43+ HttpServer::new(|| {
44+ App::new()
45+ .service(hello)
46+ .service(echo)
47+ .route("/hey", web::get().to(manual_hello))
48+ })
49+ .bind(("127.0.0.1", 8080))? // localhost:8080 or 127.0.0.1:8080
50+ .run()
51+ .await
52+ }</ code > </ pre >
53+ < p > 여기서 < code > #[actix_web::main]</ code > 은 Actix 웹 프레임워크에서 제공하는 매크로로, 이를 이용해 비동기 메인 함수를 생성할 수 있습니다. </ p >
54+ < p > 그리고 < code > HttpServer::new</ code > 함수를 호출하여 새로운 HTTP 서버 인스턴스를 만듭니다.</ p >
55+ < p > 이 함수의 인자로는 클로저가 들어가며, 이 클로저 내부에서 App 인스턴스를 만들고,</ p >
56+ < p > 우리가 앞서 정의한 hello, echo, 그리고 manual_hello 함수를 각각 서비스로 등록합니다.</ p >
57+ < p > 또한, < code > /hey</ code > 라는 경로는 수동으로 설정된 경로입니다.</ p >
58+ < p > < code > web::get().to(manual_hello)</ code > 를 통해 get 요청이 들어왔을 때 < code > manual_hello</ code > 함수가 호출되도록 설정했습니다.</ p >
59+ < p > 그 후 < code > .bind(("127.0.0.1", 8080))?</ code > 를 통해 서버를 로컬 호스트의 8080 포트에 바인딩하게 됩니다.</ p >
60+ < p > 만약 바인딩에 실패하면 에러를 반환하며 프로그램은 종료됩니다.</ p >
61+ < p > 마지막으로 < code > .run().await</ code > 를 통해 서버를 실행시키며, 이 서버는 비동기적으로 작동하게 됩니다.</ p >
62+ < h2 id ="implresponder "> impl Responder</ h2 >
63+ < p > Rust의 'Trait'에 대해 알아보고, 특히 actix-web에서 제공하는 'Responder' Trait에 대해 살펴보겠습니다.</ p >
64+ < p > Responder는 웹 응답을 만드는데 굉장히 중요한 역할을 하는 Trait입니다.</ p >
65+ < h2 id ="trait "> Trait 이란?</ h2 >
66+ < p > Rust에서 Trait는 특정 기능이나 행동을 정의한 것으로,</ p >
67+ < p > Trait를 구현하면 해당 구조체나 열거형은 Trait에서 정의된 메소드를 사용할 수 있게 됩니다.</ p >
68+ < p > Rust는 상속 대신 Trait를 사용하여 코드의 재사용성과 모듈성을 증가시킵니다.</ p >
69+ < h2 id ="respondertrait "> Responder Trait</ h2 >
70+ < p > Responder는 actix-web에서 제공하는 Trait 중 하나로, HTTP 응답을 생성하는 메소드를 제공합니다.</ p >
71+ < p > 이 Trait를 이용하면 웹 서버가 클라이언트에게 보내는 HTTP 응답을 쉽게 만들 수 있습니다. </ p >
72+ < p > Responder Trait은 두 가지 메소드를 정의합니다: </ p >
73+ < ol >
74+ < li > < code > respond_to</ code > : HttpRequest 객체를 받아 HttpResponse를 생성하는 메소드로, 이는 핸들러에서 클라이언트의 요청을 받아 적절한 응답을 생성하는 데 사용됩니다.</ li >
75+ < li > < code > customize</ code > : 응답을 커스터마이징 할 수 있는 메소드로, 이 메소드는 Responder가 구현되어 있는 경우 사용할 수 있습니다.</ li >
76+ </ ol >
77+ < h2 id ="responder "> Responder 사용하기</ h2 >
78+ < p > 핸들러 함수에서는 < code > impl Responder</ code > 를 리턴 타입으로 사용합니다.</ p >
79+ < p > 이렇게 하면 어떤 값이든, 그 값이 Responder Trait를 구현하고 있다면 리턴할 수 있게 됩니다.</ p >
80+ < p > 예를 들어, 'String', 'HttpResponse' 등은 모두 Responder를 구현하고 있습니다.</ p >
81+ < p > 이를 통해 해당 값을 리턴하는 핸들러를 쉽게 만들 수 있습니다.</ p >
82+ < p > Rust의 강력한 타입 시스템 덕분에 컴파일 타임에 각 핸들러가 어떤 타입의 값을 리턴하는지를 확인할 수 있게 되어,</ p >
83+ < p > 런타임 에러를 사전에 방지하는 데 매우 유용합니다.</ p >
84+ < p > 결국, Responder는 웹 응답을 만드는 과정을 추상화하고, 다양한 타입의 값을 HTTP 응답으로 쉽게 변환할 수 있게 해주는 역할을 합니다.</ p >
85+ < p > 이를 통해 강력하면서도 유연한 웹 응답을 만들 수 있게 됩니다.</ p >
86+ < p > Responder를 활용하면 웹 서버 개발이 훨씬 편리해집니다.</ p >
87+ < div class ="bottomnav ">
88+ < span class ="back "> < a href ="50_ko.html " rel ="prev "> ❮ 이전</ a > </ span >
89+ < span class ="next "> < a href ="52_ko.html " rel ="next "> 다음 ❯</ a > </ span >
90+ </ div >
91+ </ div >
92+ < div class ="code "> < center > < img src ="/8080.png " alt ="Rust Tutorial " width ="80% " height ="100% "> </ center > </ div >
93+ </ div >
94+ < script >
95+ var pres = document . querySelectorAll ( "pre>code" ) ;
96+ for ( var i = 0 ; i < pres . length ; i ++ ) {
97+ hljs . highlightElement ( pres [ i ] ) ;
98+ }
99+ var options = {
100+ loadDelay : 0 ,
101+ copyIconClass : "far fa-clipboard" ,
102+ checkIconClass : "fa fa-check text-success" ,
103+ blogURL : "http://rust-study.ajousw.kr/"
104+ } ;
105+ window . highlightJsBadge ( options ) ;
106+ </ script >
107+
108+ < footer >
109+ < p > < a target ="_blank " rel ="noopener " href ="https://www.youtube.com/c/SoftwareToolTime "> 아주대학교 Software Tool Time</ a > - Rust 튜토리얼 (Basic)</ p >
110+ </ footer >
111+ </ body >
112+ </ html >
0 commit comments