こんにちは!今回は、axumでのルーティングをきれいに整理する方法を紹介します。
よくある一括ルーティングの例
まずは、よくあるmain.rsにすべてのルートを書いているパターンを見てみましょう:
use axum::{
Router,
routing::{get, post},
};
#[tokio::main]
async fn main() {
let app = Router::new()
// ユーザー関連
.route("/users", get(list_users))
.route("/users/:id", get(get_user))
.route("/users", post(create_user))
// 投稿関連
.route("/posts", get(list_posts))
.route("/posts/:id", get(get_post))
.route("/posts", post(create_post))
// 認証関連
.route("/login", post(login))
.route("/logout", post(logout))
.route("/register", post(register));
axum::Server::bind(&"0.0.0.0:3000".parse().unwrap())
.serve(app.into_make_service())
.await
.unwrap();
}こんな感じで書いていると、どんどんルートが増えていって大変ですよね…😅
ルーティングを分離しよう!
では、これを整理していきましょう。以下のような構成にします:
src/
├── main.rs
└── routes/
├── mod.rs # ルートをまとめる
├── users.rs # ユーザー関連
├── posts.rs # 投稿関連
└── auth.rs # 認証関連1. すっきりしたmain.rs
まず、main.rsをこんな感じで書きます:
mod routes;
#[tokio::main]
async fn main() {
let app = routes::create_router(); // まだ作成していない
axum::Server::bind(&"0.0.0.0:3000".parse().unwrap())
.serve(app.into_make_service())
.await
.unwrap();
}ここで何をしているかというと、ルーティングの設定を関数として外部に切り出し、その関数を利用しています。
2. ルートをまとめるroutes/mod.rsを作成する
ルートをまとめるcreate_routerを書きます:
use axum::Router;
mod users;
mod posts;
mod auth;
pub fn create_router() -> Router {
Router::new()
.merge(users::create_router()) // まだ作成していない
.merge(posts::create_router()) // まだ作成していない
.merge(auth::create_router()) // まだ作成していない
}3. routes/users.rsの作成
ユーザー関連のルートを分離します:
use axum::{
Router,
routing::{get, post},
};
use crate::handlers::users;
pub fn create_router() -> Router {
Router::new()
.route("/users", get(users::list_users))
.route("/users/:id", get(users::get_user))
.route("/users", post(users::create_user))
}4. routes/posts.rsの作成
同様に投稿関連も分離:
use axum::{
Router,
routing::{get, post},
};
use crate::handlers::posts;
pub fn create_router() -> Router {
Router::new()
.route("/posts", get(posts::list_posts))
.route("/posts/:id", get(posts::get_post))
.route("/posts", post(posts::create_post))
}5. routes/auth.rsの作成
認証関連も分離:
use axum::{
Router,
routing::post,
};
use crate::handlers::auth;
pub fn create_router() -> Router {
Router::new()
.route("/login", post(auth::login)
.route("/logout", post(auth::logout))
.route("/register", post(auth::register))
}まとめ
一括で書いていたルーティングを機能ごとに分けることで、コードがとても管理しやすくなりました!
特に大規模なプロジェクトでは、この方法でルーティングを整理することをおすすめします。
次のステップとして、ハンドラーも同じように分離すると、さらにコードが整理されますよ!
AxumやRustの実装整理を学んだあとにAI活用や副業学習まで広げる場合は、有料講座を選ぶ前に、自分にスクールが必要な段階かも確認しておくと判断しやすくなります。AIスクールをおすすめしない人では、目的・作業時間・成果物の準備が整っているかを整理しています。
開発・プログラミング記事をまとめて読む
プログラミング・開発記事まとめ
Nexforge内の学習順、環境構築、TypeScript、Rust/Gleam、Linuxトラブル対応の記事を目的別にまとめています。
Rust・Gleam・新興言語の関連記事
次に学ぶ言語を比較したい場合は、今の関心に近いカードから選んでください。
Rustを学ぶ
Rustの文法、C++との違い、Webフレームワーク選びを順番に確認します。
Rust Web開発
Actix WebとAxumの違いや、Axumの構成分割を確認します。
Gleamを学ぶ
Gleamの始め方、環境構築、基本構文をまとめて確認します。
GleamとElixir比較
BEAM系の言語選びで迷う場合に、型安全性と開発体験から比較します。
新興言語を見る
Zig、Nim、Crystal、F#など、次に触る候補を広げます。
Amazon の PC をスコア化してみた
Amazonにある8〜14インチの小型WindowsタブレットやノートPCを、スペック別にスコア化して比較・ランキング。


コメント