ソフトウェア設計を学ぶ中で「クリーンアーキテクチャ」という言葉に出会い、難しそうと感じた方も多いでしょう。
クリーンアーキテクチャとはロバート・C・マーティン(通称Uncle Bob)が提唱したソフトウェア設計の考え方で、依存関係を内側から外側への一方向に保つことで、保守性・テスト容易性・フレームワークへの依存をなくすことを目指します。
本記事では、クリーンアーキテクチャの意味・レイヤー構造・依存関係のルール・設計原則・保守性への効果をわかりやすく解説していきます。
クリーンアーキテクチャとは何か?基本的な考え方
それではまず、クリーンアーキテクチャの基本的な考え方について解説していきます。
クリーンアーキテクチャ(Clean Architecture)とは、ロバート・C・マーティンが2012年に提唱し、2017年に書籍「Clean Architecture:達人に学ぶソフトウェアの構造と設計」として出版した、ソフトウェアの保守性・独立性・テスト容易性を高めるためのアーキテクチャ設計の考え方です。
クリーンアーキテクチャの核心となる考え方は「依存関係は常に内側(ビジネスロジック)に向かうべき」というものです。
外側の層(フレームワーク・DB・UI)が内側の層(ビジネスロジック・ドメイン)に依存するべきであり、その逆は許してはいけません。
これにより、ビジネスロジックがフレームワークやデータベースの変更に影響されなくなり、高い保守性とテスト容易性が実現されます。
クリーンアーキテクチャが目指す四つの独立性
クリーンアーキテクチャが目指す独立性は以下の四つです。
1. フレームワークからの独立性
RailsやSpringなどのフレームワークに依存せず、フレームワークを道具として使えるような設計にする
2. テスト容易性
UIやDBなどの外部要素なしに、ビジネスロジックを単独でテストできる設計にする
3. UIからの独立性
ビジネスロジックを変えずにUIをWebからCLIに替えたり、別のフロントエンドに差し替えたりできる設計にする
4. データベースからの独立性
MySQLをPostgreSQLに替えても、ビジネスロジックに影響しない設計にする
クリーンアーキテクチャの「依存関係逆転の原則」
クリーンアーキテクチャの中心的な設計原則が「依存関係逆転の原則(DIP:Dependency Inversion Principle)」です。
DIPとは「上位モジュール(ビジネスロジック)は下位モジュール(DB・外部APIなど)に依存すべきでなく、両者は抽象(インターフェース)に依存すべき」という原則です。
具体的には、ビジネスロジック層ではインターフェースを定義し、外側の具体的な実装(DBのリポジトリクラスなど)がそのインターフェースを実装する形にすることで、依存の方向を「外側→内側」に統一します。
クリーンアーキテクチャのレイヤー構造
続いては、クリーンアーキテクチャのレイヤー構造について確認していきます。
クリーンアーキテクチャは「同心円状のレイヤー(層)」で表現されることが多く、内側から外側に向かって以下の四層で構成されます。
第1層(最内側):エンティティ(Enterprise Business Rules)
エンティティ層はシステムの最も中核となるビジネスルール・ドメインオブジェクトを含む層です。
この層はフレームワーク・データベース・UIのいかなる変更によっても影響を受けません。
ビジネスの本質的なルール(例:受注金額の計算ロジック・在庫の更新ルールなど)がここに実装されます。
第2層:ユースケース(Application Business Rules)
ユースケース層はアプリケーション固有のビジネスロジックを実装する層です。
「ユーザーが注文を作成する」「管理者が在庫を更新する」といった具体的なアプリケーションの操作(ユースケース)を実装します。
この層はエンティティ層に依存しますが、外側(フレームワーク・DB)には依存しません。
第3層:インターフェースアダプター
インターフェースアダプター層はユースケース層とフレームワーク・外部システムの橋渡しをする層です。
コントローラー・プレゼンター・ゲートウェイなどが含まれ、外部からのデータ形式をユースケースが扱いやすい形に変換します。
第4層(最外側):フレームワーク・ドライバー
最外側の層はWebフレームワーク・データベース・UIなどの具体的な実装が含まれます。
この層の変更が内側に影響しないことがクリーンアーキテクチャの最大の目標であり、「DBをMySQLからPostgreSQLに変えても内側のコードは変わらない」という状態を目指します。
| 層(内側→外側) | 含まれるもの | 依存方向 |
|---|---|---|
| エンティティ | ドメインオブジェクト・ビジネスルール | どこにも依存しない |
| ユースケース | アプリケーションロジック | エンティティのみに依存 |
| インターフェースアダプター | コントローラー・プレゼンター | ユースケース・エンティティに依存 |
| フレームワーク・ドライバー | DB・Web・UI・外部API | インターフェースアダプターに依存 |
クリーンアーキテクチャのメリットとデメリット
続いては、クリーンアーキテクチャのメリットとデメリットを確認していきます。
クリーンアーキテクチャのメリット
クリーンアーキテクチャの最大のメリットは「高い保守性とテスト容易性」です。
ビジネスロジックがフレームワークやDBから独立しているため、ユニットテストが非常に書きやすくなります。
また依存関係が明確なため、コードの責務が整理されており、変更の影響範囲が小さくなります。
フレームワークのバージョンアップやDB変更に対して内側のビジネスロジックへの影響が最小化されるため、長期的な保守コストが低くなる傾向があります。
クリーンアーキテクチャのデメリットと注意点
デメリットとして「初期の開発工数が増える」という点が挙げられます。
レイヤーを分割し・インターフェースを定義し・依存関係を管理するためのコードが増えるため、シンプルなCRUDアプリには過剰な設計になることがあります。
クリーンアーキテクチャを導入すべき場面と避けるべき場面の判断基準です。
導入を検討すべき場面:複雑なビジネスロジックを持つシステム・長期的に保守が必要なシステム・テストカバレッジを高めたいシステム・フレームワーク変更の可能性があるシステムです。
過剰になりやすい場面:シンプルなCRUD操作が中心のシステム・プロトタイプ・短期プロジェクト・小規模チームでの小規模アプリケーションです。
「アーキテクチャは問題の複雑さに見合ったものにする」というバランス感覚がクリーンアーキテクチャを成功させる上で最も重要です。
まとめ
本記事では、クリーンアーキテクチャの基本的な考え方・四つの独立性・依存関係逆転の原則・四つのレイヤー構造・メリットとデメリットについて解説してきました。
クリーンアーキテクチャは「ビジネスロジックをフレームワーク・DB・UIから独立させる」という設計思想を徹底することで、保守性・テスト容易性・変更への強さを実現するアーキテクチャパターンです。
プロジェクトの複雑さと規模に合わせてクリーンアーキテクチャの考え方を取り入れることで、長期的に維持しやすい高品質なソフトウェアの構築が実現できるでしょう。