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

Rust로 백엔드 개발기(feat. 메이플스토리) - 09 Main 함수 정리

by lms0806 2025. 4. 2.
728x90
반응형

이번 시간에는 main함수에 선언한 불필요한 내용들을 분리하는 방법에 대해 배워보고자 합니다.

 

현재 개발중인 프로젝트의 main.rs에는 다음과 같이 매우 복잡하게 작성되어져 있습니다.

#[tokio::main]
async fn main() {
    // TODO : VEC 형식으로 가져오는 값 자체가 null인 경우 예외처리 하기
    let app = Router::new()
        .route("/getOcid", post(get_ocid))
        ...
        .layer(Extension(api_key))
        .layer(cors);

    let listener = tokio::net::TcpListener::bind("{ip}:{port}").await.unwrap();
    axum::serve(listener, app).await.unwrap();
}

여기서 정리할 수 있는 것으로는 app 관련 내용들입니다.

let app = Router::new()
        .route("/getOcid", post(get_ocid))
        ...
        .layer(Extension(api_key))
        .layer(cors);

api request가 많아지면 많아질수록 .route의 개수는 많아질 것입니다.

 

그러면 main()의 길이가 엄청 길어져서 복잡해집니다.

함수화

axum의 Router에는 다른 Router의 값과 합치는 .merge라는 기능을 지원합니다.

 

그러면 함수 1개를 만들어서 Router를 반환하는 형식으로 하면 main()에 무지막지하게 작성하지 않아도 되겠죠?

 

다음과 같이 함수를 만들어서 Router를 반환하도록 해줍니다.

fn user_routes() -> Router {
    Router::new()
        .route("/getUserInfo", get(get_user_default_info))
        ...
}

그리고 main()에서는 다음과 같이 .merge()를 통해 해당 함수를 불러와 사용해줍니다.

let app = Router::new()
        .route("/getOcid", post(get_ocid))
        .merge(user_routes())

더 분리?

만약 다음과 같이 만들더라도 user_routes()main.rs에 있기도 하고, api가 더 많아지면 많아질수록 복잡해질 것입니다.

 

그러면 새로운 소스코드를 만들어서 분리해줍시다.

 

src/api/request.rs에 router관련 내용을 모두 정리한 다음 main.rs에 불러와 사용하도록 해보겠습니다.

 

가장 먼저 src/apirequest.rs가 있다는 것을 알려주기 위해, mod.rs를 만든 이후 다음과 같이 작성해줍니다.

pub mod request;

그리고, request.rs에 이전에 작성했건 user_routes를 작성해줍니다.

let app = Router::new()
        .route("/getOcid", post(get_ocid))
        ...
        .layer(Extension(api_key))
        .layer(cors);

이후, main.rs에서 불러와 사용하기 위해 다음과 같이 추가해줍니다.

mod api;

use api::request::user_routes;

이렇게 하면 main.rs에는 main()만 존재하게 됩니다.

더 더 분리?

현재는 사용자 관련 api들만 구현되어 있는 상태입니다.

 

만약 여기서 길드, 랭킹, 공지 등 다양한 api가 추가가 되면 이를 구분하기 더욱 어려워질 것입니다.

 

그런 경우를 대비하기 위해, 다음과 같이 user, guild, notice, union, ranking 관련 route를 분리하여서 .mergeRouter를 반환해줍니다.

pub fn get_routes() -> Router {
    Router::new()
        .merge(user_routes())
        .merge(guild_route())
        .merge(notice_route())
        .merge(union_route())
        .merge(ranking_route())
}

기존에 main.rs에서 사용하던 user_routes()대신 get_routes()를 사용하도록 하면, 각각 분리된 route를 모두 사용할 수 있게 됩니다.

 

현재까지 개발된 내용은 사용자 관련 api들을 개발하고 있습니다.

 

다음 시간에는 요청을 하는 url이 일치하지 않는 경우에 대한 처리, request로 들어온 정보에 따라 url를 변경하여 요청하는 방식에 대해 배워보고자 합니다.

728x90
반응형

댓글