아래는 웹 서버를 시작하는 역할을 합니다.
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
App::new()
.service(hello)
.service(echo)
.route("/hey", web::get().to(manual_hello))
})
.bind(("127.0.0.1", 8080))? // localhost:8080 or 127.0.0.1:8080
.run()
.await
}
여기서 #[actix_web::main]
은 Actix 웹 프레임워크에서 제공하는 매크로로, 이를 이용해 비동기 메인 함수를 생성할 수 있습니다.
그리고 HttpServer::new
함수를 호출하여 새로운 HTTP 서버 인스턴스를 만듭니다.
이 함수의 인자로는 클로저가 들어가며, 이 클로저 내부에서 App 인스턴스를 만들고,
우리가 앞서 정의한 hello, echo, 그리고 manual_hello 함수를 각각 서비스로 등록합니다.
또한, /hey
라는 경로는 수동으로 설정된 경로입니다.
web::get().to(manual_hello)
를 통해 get 요청이 들어왔을 때 manual_hello
함수가 호출되도록 설정했습니다.
그 후 .bind(("127.0.0.1", 8080))?
를 통해 서버를 로컬 호스트의 8080 포트에 바인딩하게 됩니다.
만약 바인딩에 실패하면 에러를 반환하며 프로그램은 종료됩니다.
마지막으로 .run().await
를 통해 서버를 실행시키며, 이 서버는 비동기적으로 작동하게 됩니다.
Rust의 'Trait'에 대해 알아보고, 특히 actix-web에서 제공하는 'Responder' Trait에 대해 살펴보겠습니다.
Responder는 웹 응답을 만드는데 굉장히 중요한 역할을 하는 Trait입니다.
Rust에서 Trait는 특정 기능이나 행동을 정의한 것으로,
Trait를 구현하면 해당 구조체나 열거형은 Trait에서 정의된 메소드를 사용할 수 있게 됩니다.
Rust는 상속 대신 Trait를 사용하여 코드의 재사용성과 모듈성을 증가시킵니다.
Responder는 actix-web에서 제공하는 Trait 중 하나로, HTTP 응답을 생성하는 메소드를 제공합니다.
이 Trait를 이용하면 웹 서버가 클라이언트에게 보내는 HTTP 응답을 쉽게 만들 수 있습니다.
Responder Trait은 두 가지 메소드를 정의합니다:
respond_to
: HttpRequest 객체를 받아 HttpResponse를 생성하는 메소드로, 이는 핸들러에서 클라이언트의 요청을 받아 적절한 응답을 생성하는 데 사용됩니다.customize
: 응답을 커스터마이징 할 수 있는 메소드로, 이 메소드는 Responder가 구현되어 있는 경우 사용할 수 있습니다.핸들러 함수에서는 impl Responder
를 리턴 타입으로 사용합니다.
이렇게 하면 어떤 값이든, 그 값이 Responder Trait를 구현하고 있다면 리턴할 수 있게 됩니다.
예를 들어, 'String', 'HttpResponse' 등은 모두 Responder를 구현하고 있습니다.
이를 통해 해당 값을 리턴하는 핸들러를 쉽게 만들 수 있습니다.
Rust의 강력한 타입 시스템 덕분에 컴파일 타임에 각 핸들러가 어떤 타입의 값을 리턴하는지를 확인할 수 있게 되어,
런타임 에러를 사전에 방지하는 데 매우 유용합니다.
결국, Responder는 웹 응답을 만드는 과정을 추상화하고, 다양한 타입의 값을 HTTP 응답으로 쉽게 변환할 수 있게 해주는 역할을 합니다.
이를 통해 강력하면서도 유연한 웹 응답을 만들 수 있게 됩니다.
Responder를 활용하면 웹 서버 개발이 훨씬 편리해집니다.