Axum 시작하기

2023. 6. 20. 17:44Back-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 타입으로 결과가 출력 되는 것을 볼 수 있습니다.