クリーンアーキテクチャとは、ビジネスルールをUI、データベース、フレームワークから切り離し、変更に強くするための設計思想です。
一言でいうと
クリーンアーキテクチャの中心は「外側の都合を内側に持ち込まない」ことです。
アプリケーションの中心には、業務ルールやユースケースがあります。Webフレームワーク、DB、HTTP、画面、外部APIは外側の詳細です。外側は変わりやすく、内側は長く残ります。
登場人物
| 層 | 役割 | 例 |
|---|---|---|
| エンティティ | 業務上の重要なルールを持つ | 注文、請求、ユーザー |
| ユースケース | アプリで実現する操作を表す | 注文する、支払いを確定する |
| インターフェースアダプター | 外部形式と内部形式を変換する | Controller、Presenter、Repository実装 |
| フレームワーク/ドライバ | 技術的な詳細 | Webフレームワーク、DB、UI |
重要なのは、内側の層が外側の層を知らないことです。ユースケースが「PostgreSQLで保存する」と知っていると、DB変更の影響がユースケースへ入り込みます。
依存方向のルール
クリーンアーキテクチャでは、依存は外側から内側へ向きます。
Frameworks / Drivers
-> Interface Adapters
-> Use Cases
-> Entities
外側のコードは内側を呼び出してよいですが、内側のコードは外側を直接呼び出しません。DB保存やメール送信が必要な場合は、内側にインターフェースを置き、外側で実装します。
処理の流れ
たとえば「注文を作成する」処理は次のように流れます。
| 順番 | 処理 | 責務 |
|---|---|---|
| 1 | HTTPリクエストを受け取る | Controller |
| 2 | 入力をユースケース用の形に変換する | Adapter |
| 3 | 注文作成の業務ルールを実行する | Use Case / Entity |
| 4 | 保存インターフェースを呼ぶ | Use Case |
| 5 | DBへ保存する | Repository実装 |
| 6 | レスポンス用に整形する | Presenter |
この分け方にすると、HTTPではなくCLIから実行したい場合でも、ユースケースはそのまま使えます。
何がうれしいのか
- UIを変えても業務ルールが壊れにくい
- DBや外部APIを差し替えやすい
- ユースケース単位でテストしやすい
- フレームワークに依存しすぎない
- 変更の影響範囲を読みやすい
特にテストでは効果が大きく、DBやHTTPサーバーを起動しなくてもユースケースを検証できます。
よくある誤解
層を増やせばクリーンになる
層が多いだけではクリーンになりません。重要なのは依存方向と責務の分離です。小さなアプリで無理に層を増やすと、ファイル移動だけが増えて読みにくくなります。
Repositoryを作れば完成
Repositoryは一部にすぎません。ユースケースが画面やDBの都合を知っているなら、Repositoryがあっても境界は崩れています。
フレームワークを使ってはいけない
フレームワークは使って構いません。ただし、業務ルールの中心にフレームワークの型やライフサイクルを置かないようにします。
向いている場面
| 向いている | 向いていない |
|---|---|
| 業務ルールが複雑 | 小さな一回限りのスクリプト |
| 長く保守する | 画面だけの静的サイト |
| テストを厚くしたい | 試作品をすぐ捨てる |
| DBやUIの変更がありそう | 技術選定が固定で単純 |
導入チェックリスト
- ユースケース名が業務の言葉になっているか
- ユースケースがHTTPリクエストやDB接続を直接知らないか
- エンティティに業務ルールが残っているか
- Controllerに業務判断を書きすぎていないか
- DBなしでユースケーステストを書けるか
まとめ
クリーンアーキテクチャは、コードをきれいに並べるための図ではなく、変更の影響を閉じ込めるための考え方です。
中心に置くべきものは、フレームワークではなく業務ルールです。依存方向を内側へ向けることで、外側の技術変更からアプリケーションの核心を守れます。
参考リソース
- The Clean Architecture - 8th Light
- Martin Fowler: PresentationDomainDataLayering
- Microsoft: Common web application architectures