Development Guidelines
アーキテクチャ
バックエンドの4層構成と各層の責務、依存の向きを定める
レイヤー構成
バックエンドはクリーンアーキテクチャに基づく4層で構成する。依存の向きは次のとおりで、Domain 層をすべての中心に置く。
API → UseCase → Domain ← InfrastructureDomain 層はどの層にも依存しない。Infrastructure 層は Domain 層が定義したインターフェースを実装し、依存の向きを逆転させる。こうして技術的な詳細を Domain から切り離し、ビジネスの本質を外部技術の変更から守る。
各層の責務
各層は担当する関心事を1つに絞る。上位層は下位層の実装ではなく抽象に依存し、層をまたいで責務が漏れないようにする。
Domain 層
ビジネスの本質を表現する。フレームワークや外部技術に一切依存しない。この独立性により、技術選定が変わってもビジネスルールを保てる。
UseCase 層
アプリケーション固有の操作を担う。Domain 層のエンティティと Repository インターフェースを組み合わせ、1つの操作を完結させる。
Infrastructure 層
技術的な詳細を実装する。Domain 層が定義した Repository インターフェースの具体実装を提供し、データベースや外部サービスとの接続を担う。
API 層
外部とのインターフェースを担う。クライアントのリクエストを受け取って UseCase へ委譲する。ビジネスロジックを持たず、入出力の変換に徹する。
エラーハンドリングの方針
エラー処理の責務も層ごとに分ける。エラーの表現と変換を一箇所へ集約し、上位層での分岐を単純に保つためである。
- Domain 層は、ビジネスルール違反を
DomainErrorのサブクラスで表す。ドメインごとに固有のエラークラスを作らず、汎用エラーを全ドメインで使い回し、エラーの種類を絞る。 - UseCase 層は、Domain 層のエラーをキャッチせずそのまま上位へ伝播させる。エラーの判断を一箇所へ集約するためである。
- Infrastructure 層は、ドメインエラーを投げない。データの不在は戻り値で表して判断を UseCase 層へ委ね、技術的な障害はそのまま上位へ伝播させる。
- API 層は、エラーを個別にキャッチしない。
DomainErrorからTRPCErrorへの変換を middleware に一任し、変換規則を一箇所へ保つ。
関連項目
- バックエンド実装規約 — 各層の具体的な実装ルールとディレクトリ構成
- 技術スタック概要 — 採用技術と選定理由