ウォーターフォールは間違っている!私がアジャイル開発をエンジニアに勧める理由
axumのルーティングを整理して別ファイルに分ける方法
こんにちは!今回は、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))
}
まとめ
一括で書いていたルーティングを機能ごとに分けることで、コードがとても管理しやすくなりました!
特に大規模なプロジェクトでは、この方法でルーティングを整理することをおすすめします。
次のステップとして、ハンドラーも同じように分離すると、さらにコードが整理されますよ!
- 内臓GPUの性能が良いミニPCをコスパ順でまとめてみた
- TypeScriptで非推奨になっている機能一覧
- TypeScriptのexport defaultが非推奨となっていた件
- TypeScriptのNamespaceが非推奨となっていた件
- TypeScriptのthis.constructorが非推奨となっていた件
- TypeScriptのコンストラクタ引数でのpublic/privateが非推奨となっていた件
- TypeScriptのvarキーワードが非推奨となっていた件
- TypeScriptのFunction型が非推奨となっていた件
- TypeScriptのString, Number, Boolean型が非推奨となっていた件
- TypeScriptのanyが非推奨となっていた件
- TypeScriptのenumが非推奨となっていた件
- 内蔵GPUのメモリ割り当てを増やす方法【2024年版】
- ウォーターフォールは間違っている!私がアジャイル開発をエンジニアに勧める理由
- IT業界の酷い下請け構造は誰のせいなのか
- IT業界の下請け構造が酷すぎる!!
- クラウディアと他のクラウドソーシングサービスの比較
- Zigプログラミング言語とは?RustやC++との違いを解説
- めっちゃ早いPython?Nimというプログラミング言語について
- Rubyの静的型付け版?Crystalってどんな言語なのか解説
- Elixirは開発しづらい?Gleamへ移行しよう – 開発体験が劇的に改善
- Gleamの基本的な構文とデータ型
- Gleamの環境構築方法[Linux]
- Gleam言語でのWebアプリ開発ロードマップ
- MacBook Pro M1の外部ディスプレイちらつき現象について
- MacBook Air M2で4K60Hz外部ディスプレイを使用する方法
- Ryzen 7040HS Phoenix搭載LinuxマシンのGPUドライバー設定ガイド
- 注目を集める新星Gleam言語!Elixirとの違いから見る特徴と可能性
- DellとHP、買うならどっちがマシ?徹底比較ガイド
- サブドメインのメリット・デメリットを徹底解説!
- 中古ドメインって実際どうなの?メリット・デメリットを解説
- ノートパソコン バッテリー持ち ランキング【2024年4月】徹底比較!
- なぜ安い?workドメインが安価な理由を徹底解説!
- メキシコペソ投資ってどうなの?過去データで見る特徴とリスク
- なぜ私がトルコリラ投資をおすすめしないのか – データで見る実態と注意点
- 【2024年4月最新】世界の通貨別金利ランキング!今一番利回りが高い通貨はコレだ!
- 金利5%台!?米ドル保有で高金利を受け取る方法
- axumのルーティングを整理して別ファイルに分ける方法
- Acitx-webとAxumってどっちがいいの?RustのWebフレームワーク比較
- 次期C#?注目のプログラミング言語F#を徹底解説
- 電気ストーブと石油ストーブはどっちがいい?費用や特徴を徹底比較!
- ゲーミングキーボードって正直あんまり変わらないよねって話
- 【2024年版】今後はやるマイナープログラミング言語5選|現役エンジニアが解説
- Rustの現状の課題と発展途上な部分
- 私がRustがC++より優れていると感じる理由
- Rustプログラミング言語完全学習ロードマップ【2024年版】
- おすすめプログラミングスクール比較【2024年版】現役エンジニアが徹底解説
- 未経験からでもエンジニアに全然なれる件
- Model、Repository、Controller、Serviceとは?基礎から分かりやすく解説!
- Hibernateって何?
- JPAって何?