이번 시간에는 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/api
에 request.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를 분리하여서 .merge
한 Router
를 반환해줍니다.
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를 변경하여 요청하는 방식에 대해 배워보고자 합니다.
'Rust > 프로젝트' 카테고리의 다른 글
Rust로 백엔드 개발기(feat. 메이플스토리) - 08 사용자별 요청 처리 (0) | 2025.03.31 |
---|---|
Rust로 백엔드 개발기(feat. 메이플스토리) - 07 Null 제외하는 방법 (0) | 2025.03.31 |
Rust로 백엔드 개발기(feat. 메이플스토리) - 06 프로젝트 분리 (0) | 2025.03.26 |
Rust로 백엔드 개발기(feat. 메이플스토리) - 05 전역변수 (0) | 2025.03.23 |
Rust로 백엔드 개발기(feat. 메이플스토리) - 04 캐릭터 정보 조회 (0) | 2025.03.13 |
댓글