2023. 6. 20. 17:44ㆍBack-End/Axum
개요
Rust로 웹 개발을 하기 위해서는 다양한 프레임워크들이 존재합니다. 그중에서도 요즘 가장 핫한 프레임워크 중 하나는 Axum입니다. Axum은 비동기 웹 애플리케이션을 개발하기 위한 라이브러리이며, Rust의 비동기 프로그래밍 기능을 활용하는 구조로 되어 있습니다.
Rust에서 비동기로 유명한 tokio라는 크레이트가 있는데 tokio에서 만든 웹 프레임워크 입니다.
핵심 기능들
1. 타입 안전성: 모듈 간의 상호작용에서 컴파일 타임에 버그를 최대한 줄여주는 타입 안전성을 제공합니다.
2. 모듈화된 구성: 작은 단위로 쉽게 구성을 나누고 조합할 수 있어 비대해진 웹 서비스를 유지하기 쉽습니다.
3. 익스프레션(objected) 스타일 라우팅: Axum은 간결하고 사용하기 쉬운 라우팅을 위해 신작된 다양한 라우팅 구성 요소들을 제공합니다.
4. 비동기 처리: Axum은 Async/Await 패턴을 사용하여 높은 성능을 지원합니다.
시작하기
Axum을 시작하기 위해서는 Cargo.toml에 먼저 dependencies를 추가합니다.
최신 버전에서는 문법이 변경 되어 main.rs와 연동이 안될 수 있으니 주의 하시기 바랍니다.
[dependencies]
axum = "0.6.4"
tokio = { version = "1.0", features = ["full"] }
serde = { version = "1.0", features = ["derive"] }
그리고 main.rs에 아래와 같이 작성합니다.
use axum::routing::{get};
use axum::{Json, Router};
use serde::{Serialize};
#[derive(Serialize)]
struct Message {
message : String,
}
#[tokio::main]
async fn main() {
let app = Router::new()
.route("/", get(|| async {"Index!!"}))
.route("/api/v1/users", get(get_users));
axum::Server::bind(&"0.0.0.0:3000".parse().unwrap())
.serve(app.into_make_service())
.await
.unwrap()
}
async fn get_users() -> Json<Message>{
Json(Message { message: String::from("Hello, Axum") })
}
serde를 사용해서 Message는 Serialize될 수 있습니다.
#[derive(Serialize)]
struct Message {
message : String,
}
라우팅 하는 부분으로 주소에 따라 http://localhost:3000/ 는 Index!!라는 문자를 출력하고 http://localhost:3000/api/v1/users 는 json 모양으로 Hello, Axum이 출력 되도록 설정하였습니다.
let app = Router::new()
.route("/", get(|| async {"Index!!"}))
.route("/api/v1/users", get(get_users));
0.0.0.0은 모든 IP에 대해 허용한다는 뜻입니다.
실행
이제 실행을 시켜봅니다.
$cargo run을 사용해서 실행 시키고 http://localhost:3000/api/v1/users로 접속해 봅니다.
{
"message": "Hello, Axum"
}
정상적으로 Json 타입으로 결과가 출력 되는 것을 볼 수 있습니다.