ひとことで言うと#
バーティカルスライスアーキテクチャの内部設計を掘り下げ、Handlerの実装パターン・テスト戦略・共通処理の扱い方・ディレクトリ構成など、実践に必要な詳細設計のガイドライン。
押さえておきたい用語#
- Request / Response DTO
- スライスの入出力を定義するデータ転送オブジェクトのこと。Handlerと同じファイルに配置するのが一般的。
- MediatR(メディエーター)
- .NETで広く使われるメディエーターパターンのライブラリ。Requestを受け取り適切なHandlerにディスパッチする。
- Pipeline Behavior(パイプライン ビヘイビア)
- Handlerの前後に処理を挟むミドルウェア的な仕組みを指す。バリデーション・ログ・トランザクション管理に使う。
- Feature Folder(フィーチャーフォルダ)
- 機能単位でHandler・DTO・テストを1つのフォルダに格納するディレクトリ構成である。レイヤー別フォルダの対極にある構成。
- Integration Test(統合テスト)
- スライス全体をAPIリクエストからDB操作まで通して検証するテスト。バーティカルスライスのテスト戦略の中心となる手法。
バーティカルスライス設計の全体像#
こんな悩みに効く#
- Handlerの実装パターンが定まらずチーム内でバラつく
- 共通処理をどこに置くかの判断基準がない
- バーティカルスライスのテストの書き方がわからない
基本の使い方#
Features/{Domain}/{UseCase}/ の構成で、Handler・DTO・Validator・テストを1フォルダにまとめる。1機能の変更に必要なファイルが1箇所に集約され、ナビゲーションが容易になる。具体例#
エンジニア20名のHRテック企業。バーティカルスライスを採用したが、Handlerの書き方がエンジニアごとにバラバラで、あるHandlerは 300行、別のHandlerは 15行(ロジックがServiceに外出し)という状態になった。
実装ガイドラインを策定。「Handlerは 30〜100行」「DB操作はHandler内で直接」「100行超はドメインオブジェクトにロジックを移す」「共有ServiceはPipelineのみ」とルール化した。
コードレビューでの指摘が 60% 減少。新メンバーのオンボーディングでも「どこに何を書くか」の迷いが解消され、初PRまでの期間が 2週間 → 4日 に短縮された。
エンジニア35名の物流SaaS。レイヤードアーキテクチャ時代は、Serviceのユニットテスト(Mock多用)とE2Eテストの2極構成だった。Mockの保守コストが高く、E2Eは実行に 45分 かかっていた。
バーティカルスライス移行に合わせ、テスト戦略を「スライス単位の統合テスト中心」に変更。TestContainersでDBを起動し、APIリクエストからDB検証まで1テストで完結。Mockは外部APIのみに限定した。
テストのMock行数が 70% 減少。テスト実行時間は 45分 → 12分 に短縮(E2E削減分)。本番バグの発見率が テスト段階で78%(以前は 52%)に改善された。
エンジニア12名の教育プラットフォーム。Controllers/に 48ファイル、Services/に 35ファイル、Repositories/に 28ファイル が並ぶレイヤー別構成だった。「受講登録」機能の修正に3フォルダを行き来する必要があり、新メンバーが「どのファイルがどの機能か」を把握するのに 1週間 かかっていた。
Feature Folder構成に移行。Features/Enrollment/Register/にHandler・DTO・Validator・テストを集約。IDEのファイルツリーで機能の全体像が一目で把握できるようになった。
新メンバーが特定機能のコードを見つけるまでの時間が 平均15分 → 30秒 に短縮。「どこに書けばいいかわからない」というSlackの質問が月 12件 → 1件 に減少した。
やりがちな失敗パターン#
- Handlerが巨大になる — 200行を超えたらドメインオブジェクトにロジックを移す。Handlerはオーケストレーターに徹する
- DTOをスライス間で共有する — 初期は効率的に見えるが、片方の変更がもう片方を壊す。スライスごとに専用DTOを定義する
- ユニットテストにこだわりすぎる — スライスは統合テストが最もコスパが高い。Mockを減らしTestContainersで実DBを使うテスト戦略を採る
- Feature FolderとLayer Folderを混在させる — 中途半端な移行は混乱を招く。新機能からFeature Folderで書き始め、既存コードは触る際に移行する
まとめ#
バーティカルスライス設計の詳細として、Request/Response DTO → Pipeline → Handler → Responseの処理フロー、Feature Folder構成によるファイル配置、統合テスト中心のテスト戦略を解説した。Handlerは30〜100行に収め、横断処理はPipeline Behaviorに分離し、各スライスの自己完結性を維持することが設計の要点となる。