본문 바로가기
Rust/프로젝트

Rust로 백엔드 개발기(feat. 메이플스토리) - 02 GET, POST, JSON 통신

by lms0806 2025. 3. 9.
728x90
반응형

open api를 활용할려면 가장 먼저 해야하는 것은

  1. rest api 통신이 가능한 세팅
  2. Frontend에 원하는 정보를 가져올 수 있는 GET, POST 세팅

프로젝트 생성

가장 먼저 rust 프로젝트를 생성합니다.

cargo new maple

그다음으로 사용하고자 하는 axum을 dependencies에 추가해야 합니다.

2025/03/05 기준 가장 최신 버전인 0.8.1을 추가하겠습니다.

[dependencies]
axum = "0.8.1"

공식 문서에는 다음과 같이 작성되어져 있습니다.

axum is designed to work with tokio and hyper.

axum은 tokio 와 hyper 와 함께 작동하도록 설계되었습니다 .

tokio를 사용하기 위해서는 다음 명령어를 사용하여 dependency에 추가해줍니다.

cargo add tokio --features macros,rt-multi-thread

GET 요청

이후 get 요청이 작성된 코드를 다음과 같이 main.rs에 작성해줍니다.

use axum::{routing::get, Router};

#[tokio::main]
async fn main() {
    // 어떠한 주소로 요청을 만들 것인지
    // 해당 주소는 get인지 post인지 등등
    // 해당 주소에 대한 결과는 어떻게 반환할 것인지
    let app = Router::new().route("/", get(|| async { "Hello, World!" }));

    // 어떤 IP와 PORT를 사용할 것인지
    let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();

    axum::serve(listener, app).await.unwrap();
}

다음 명령어로 실행 후, "localhost:3000"에 접속해보시면 "Hello, World!"가 출력되는 사이트를 볼 수 있습니다.

cargo run

Json 전달 및 파싱

json 파싱을 하기 위해서는 serde_json을 활용할 예정입니다.

 

다음과 같이 Cargo.toml에 추가하시면 활용 가능합니다.

[dependencies]
serde_json = "1.0.120"
  1. 기존의 route에 "/json"을 추가합니다.
let app = Router::new()
        .route("/", get(|| async { "Hello, World!" }))
        .route("/json", get(json));

이러면 GET "/json" 요청을 보낼 경우 json 함수를 통해 json 객체를 전달할 수 있습니다.

json 함수는 다음과 같이 "data":42 형식으로 보내도록 만들 수 있습니다.

async fn json() -> Json<Value> {
    Json(json!({ "data" : 42}))
}

이러고, cargo run을 할 경우, /json 요청을 보낼 경우, 다음과 같은 결과를 받아올 수 있습니다.

{
  "data": 42
}

Post 요청

Post 요청은 Get 요청과 비슷하게 사용 가능합니다.

.route("/user", post(post_data));

해당 post_data 함수는 다음과 같이 작성할 수 있습니다.

async fn post_data(Json(user): Json<userData>) -> String {
    format!("데이터: {}", user.data)
}

여기서 사용하는 user는 post_data에서 사용할 변수명이고, 해당 변수의 타입은 userData라는 객체를 가지고 있습니다.

 

userData라는 객체는 다음과 같이 작성할 수 있습니다.

#[derive(Deserialize)]
struct userData {
    data: String,
}

여기서 작성하는 #[derive(Deserialize)]은 역직렬화로, json으로 받은 데이터를 해당 객체의 값에 맞춰서 할당해주는 역할을 해줍니다.

 

다음과 같이 작성 후, cargo run으로 실행 한 다음과 같이 json 데이터를 전송하면?

{
  "data": "1"
}

결과 창에 다음과 같이 확인 가능합니다.

데이터: 1

json 데이터로 반환

json 데이터로 반환하기 위해서는 앞서 작성해 줬던 #[derive(Deserialize)]을 #[derive(Serialize, Deserialize)]로 변경하여 직렬화, 역직렬화가 모두 가능해야 합니다.

 

이후 이전에 작성했던 post_data도 다음과 같이 변경해주면 됩니다.

async fn post_data(Json(user): Json<userData>) -> Json<userData> {
    let user = userData {
        data: user.data + "1",
    };
    Json(user)
}
{
  "data": "1"
}

다음과 같이 전송했던 데이터의 value에 1을 추가하여 반환하도록 되어 있어 post 요청을 보낼시, 이렇게 반환이 됩니다.

{
  "data": "11"
}

여기까지 기본적인 rest api 통신을 진행할 세팅을 완료하였습니다.

728x90
반응형

댓글