クリーンアーキテクチャとは?保守性の高いソフトウェア設計の基本構造
クリーンアーキテクチャとは、ソフトウェアを長期的に保守しやすく、変更に強く、テストしやすい構造にするための設計思想です。単にフォルダをきれいに分けるためのルールではなく、ビジネス上重要な処理をUI、データベース、外部サービス、フレームワークなどの技術的な都合から守るための考え方です。
多くのシステムでは、最初は小さな機能から始まっても、運用が続くにつれて画面が増え、APIが増え、データベース構造が変わり、外部サービス連携が追加されます。そのたびにコード全体が影響を受ける設計になっていると、少しの修正でも不具合が起きやすくなります。クリーンアーキテクチャは、このような変更リスクを減らすために、役割ごとにコードを分離し、依存関係を内側へ向ける設計を重視します。
特に重要なのは、UIやデータベースを中心に考えるのではなく、ドメイン、つまりサービス固有のビジネスルールを中心に置くことです。ログイン、購入、予約、注文、請求、在庫管理など、サービスの価値を生む処理を中心に置き、その外側に画面、データ保存、外部APIなどを配置します。本記事では、クリーンアーキテクチャの基本構造、各層の役割、依存性ルール、実務でのメリット、MVCとの違い、実装イメージまで体系的に解説します。
1. クリーンアーキテクチャとは?
クリーンアーキテクチャとは、ソフトウェアを複数の層に分け、内側にビジネスルールを置き、外側にUI、データベース、外部サービス、フレームワークなどを配置する設計思想です。日本語では「クリーンアーキテクチャ」と呼ばれることが多く、保守性、テスト容易性、変更への強さを高めるために使われます。
クリーンアーキテクチャの基本特徴
| 項目 | 内容 |
|---|---|
| 主な目的 | 変更に強いソフトウェア構造を作る |
| 中心に置くもの | ビジネスルール、ドメイン、ユースケース |
| 外側に置くもの | UI、データベース、外部API、フレームワーク |
| 重要なルール | 依存方向を内側に向ける |
| 実務上の価値 | 保守しやすく、テストしやすく、機能追加しやすい |
1.1 レイヤーを分離した設計思想
クリーンアーキテクチャでは、コードを役割ごとに分けます。たとえば、ビジネスルールを扱う層、アプリケーションの処理手順を扱う層、外部データとの変換を行う層、UIやデータベースなど具体的な技術を扱う層に分けます。このようにレイヤーを分けることで、コードの責務が明確になり、修正時の影響範囲を小さくできます。
レイヤー分離ができていないコードでは、画面処理の中にビジネスロジックが混ざったり、データベース処理がUIに直接書かれたりします。そのような設計では、画面変更やデータベース変更のたびに重要なロジックまで影響を受けやすくなります。クリーンアーキテクチャでは、役割を明確に分けることで、変更しやすい構造を作ります。
1.2 ビジネスロジック中心の構造
クリーンアーキテクチャの中心は、ビジネスロジックです。ビジネスロジックとは、サービス固有のルールや処理のことです。たとえば、ECサイトであれば、注文金額の計算、在庫確認、割引適用、注文確定などが該当します。SNSであれば、投稿、フォロー、通知、タイムライン生成などがビジネスロジックになります。
このビジネスロジックは、UIやデータベースよりも長く残る可能性が高い重要な部分です。画面デザインやデータベース製品は変わっても、「注文できる条件」や「ユーザーが投稿できる条件」のようなルールはサービスの中心として残り続けます。そのため、クリーンアーキテクチャでは、ビジネスロジックを中心に置き、外部技術から独立させます。
1.3 依存方向を制御する設計
クリーンアーキテクチャで最も重要なのが、依存方向の制御です。依存方向とは、あるコードが別のコードを知っている、または使っている関係のことです。クリーンアーキテクチャでは、外側の層は内側の層に依存してもよいですが、内側の層は外側の層に依存してはいけません。
たとえば、ビジネスロジックがMySQLやFirebaseの具体的な処理を直接知っていると、データベースを変更したときにビジネスロジックまで修正が必要になります。一方で、ビジネスロジックが抽象的なインターフェースだけを知り、具体的なデータベース処理を外側に置けば、データベースを変更しても中心のロジックは守られます。この依存方向の設計が、クリーンアーキテクチャの核心です。
2. クリーンアーキテクチャの全体構造
クリーンアーキテクチャは、内側から外側へ向かって複数の層に分かれます。中心に近いほどビジネスルールに近く、外側に行くほど具体的な技術や外部要素に近くなります。一般的には、エンティティ層、ユースケース層、インターフェース変換層、フレームワーク・外部ドライバー層として整理されます。
クリーンアーキテクチャの層構造
| 層 | 日本語での役割 | 主な内容 |
|---|---|---|
| エンティティ層 | ビジネスルールの核心 | ユーザー、商品、注文など |
| ユースケース層 | アプリケーションの処理手順 | ログイン、購入、投稿など |
| インターフェース変換層 | 外部と内部の変換 | コントローラー、表示用変換、データ変換 |
| フレームワーク・外部ドライバー層 | 具体的な技術 | UI、DB、外部API、Webフレームワーク |
2.1 内側から外側へ構造化
クリーンアーキテクチャでは、中心にエンティティ層、その外側にユースケース層、さらに外側にインターフェース変換層、最も外側にフレームワーク・外部ドライバー層を配置します。この構造によって、ビジネスルールを技術的な変更から守りやすくなります。
外側の層は、内側の層を呼び出して処理を進めます。たとえば、画面上のボタンが押されると、コントローラーがユースケースを呼び出し、ユースケースがエンティティを操作し、必要に応じてデータ保存や外部API連携を行います。このとき、中心のエンティティやユースケースは、具体的なUIやデータベースの詳細を知らないように設計します。
2.2 中心はドメイン
クリーンアーキテクチャの中心はドメインです。ドメインとは、そのシステムが扱う業務領域やサービス固有の概念を指します。ECサイトなら商品、注文、決済、在庫がドメインになります。予約システムなら予約、空き枠、利用者、キャンセルルールなどがドメインになります。
ドメインを中心に設計することで、システムの本質的なルールが見えやすくなります。UIやデータベースを中心に設計すると、技術的な都合に引っ張られて本来の業務ルールが埋もれやすくなります。クリーンアーキテクチャでは、まずドメインを明確にし、その周囲にアプリケーション処理や外部技術を配置します。
3. エンティティ層
エンティティ層は、クリーンアーキテクチャの中心にある層です。ここには、システムの中核となるビジネスルールや重要な概念が置かれます。ユーザー、商品、注文、予約、請求、投稿など、サービスにとって本質的なデータとルールを表します。
3.1 ビジネスルールの核心
エンティティは、単なるデータの入れ物ではありません。ビジネス上の意味やルールを持つ存在です。たとえば、注文エンティティであれば、注文金額を計算する、キャンセル可能か判定する、支払い済みか確認する、といったルールを持つことがあります。商品エンティティであれば、在庫があるか、販売可能か、割引対象かを判断することがあります。
エンティティの例
| エンティティ | 持つ情報 | 持つ可能性があるルール |
|---|---|---|
| ユーザー | 名前、メール、権限 | ログイン可能か、管理者か |
| 商品 | 商品名、価格、在庫 | 販売可能か、割引対象か |
| 注文 | 注文商品、合計金額、状態 | キャンセル可能か、支払い済みか |
| 投稿 | 本文、作成者、公開状態 | 公開可能か、編集可能か |
エンティティ層にビジネスルールを集めることで、システムの重要な判断を一箇所にまとめやすくなります。画面やデータベースごとに同じ判断処理が分散すると、仕様変更時に修正漏れが起きやすくなります。エンティティは、サービスの核となるルールを守るための層です。
3.2 外部に依存しない
エンティティ層は、外部技術に依存しないように設計します。つまり、エンティティはデータベース、UI、Webフレームワーク、外部APIなどを直接知りません。注文エンティティは「MySQLに保存されるか」「Firebaseに保存されるか」「Web画面で表示されるか」「モバイルアプリで表示されるか」を知らなくてよいのです。
この独立性によって、エンティティ層は長期的に安定しやすくなります。データベースを変更しても、UIを作り直しても、外部APIを差し替えても、ビジネスルールそのものが変わらない限り、エンティティ層は大きく変更せずに済みます。クリーンアーキテクチャでは、この「中心を外部から守る」考え方が非常に重要です。
4. ユースケース層
ユースケース層は、アプリケーションが実現する具体的な処理手順を表す層です。ログインする、商品を購入する、投稿を作成する、予約を確定する、パスワードを変更する、といったユーザーの目的に対応する処理がここに置かれます。エンティティがビジネスルールの核心なら、ユースケースはそのルールを使って業務フローを実行する層です。
4.1 アプリの動作ロジック
ユースケース層には、アプリケーション固有の動作ロジックが入ります。たとえば、ログイン処理であれば、入力値を受け取り、ユーザー情報を取得し、パスワードを検証し、認証結果を返す流れになります。購入処理であれば、商品情報を確認し、在庫を確認し、注文を作成し、支払い処理へ進む流れになります。
ユースケース層は、画面やデータベースに直接依存しない形で設計することが重要です。たとえば、「購入する」という処理は、Web画面から呼ばれても、モバイルアプリから呼ばれても、基本的な流れは同じです。UIに処理を直接書かず、ユースケースとして切り出すことで、画面が変わってもアプリケーションの中心処理を再利用しやすくなります。
4.2 エンティティを操作する層
ユースケース層は、エンティティを操作して処理を進めます。たとえば、注文ユースケースでは、商品エンティティや注文エンティティを使って、注文可能かを確認し、注文を作成します。ユーザー登録ユースケースでは、ユーザーエンティティを作成し、重複チェックや保存処理を行います。
ただし、ユースケース層は具体的なデータベース処理を直接持つべきではありません。データの取得や保存が必要な場合は、抽象的なインターフェースを通じて外側の層に依頼します。これにより、ユースケースは「何をするか」に集中でき、データベースや外部APIの詳細から独立できます。
5. インターフェース変換層
インターフェース変換層は、外部の形式と内部の形式を変換する層です。APIから受け取ったデータを内部モデルへ変換したり、ユースケースの結果を画面表示用のデータへ変換したりします。コントローラー、表示用変換、データ変換、プレゼンターなどがこの層に含まれます。
5.1 データ変換層
外部から入ってくるデータは、そのままビジネスロジックで使いやすい形とは限りません。たとえば、APIレスポンスはJSON形式で返ってきますが、アプリ内部ではユーザーエンティティや商品エンティティとして扱いたい場合があります。このとき、外部形式から内部形式へ変換する役割を持つのがインターフェース変換層です。
データ変換を明確に分けることで、外部APIやデータベースの形式変更が内側の層へ直接影響しにくくなります。APIのフィールド名が変わった場合でも、変換層で吸収できれば、ユースケースやエンティティを大きく変更せずに済みます。これは、外部仕様の変化に強い設計を作るうえで重要です。
5.2 表示・操作との橋渡し
インターフェース変換層は、UIとの橋渡しも行います。ユーザーが画面で入力した値をユースケースに渡せる形へ変換したり、ユースケースの実行結果を画面表示用の形式へ整えたりします。たとえば、日付データを画面表示用の文字列に変換する、エラーコードをユーザー向けメッセージに変換する、といった処理があります。
この層を分けることで、ユースケース層が画面表示の都合を知らずに済みます。ユースケースは「ログイン成功」「ログイン失敗」「入力不備」といった結果を返し、表示用の文言やUI状態への変換は外側で行います。これにより、同じユースケースをWeb、モバイル、管理画面など複数のUIから使いやすくなります。
6. フレームワーク・外部ドライバー層
フレームワーク・外部ドライバー層は、最も外側にある層です。ここには、Webフレームワーク、UI、データベース、外部API、ファイルシステム、クラウドサービスなど、具体的な技術が含まれます。クリーンアーキテクチャでは、これらの技術は重要ではありますが、ビジネスロジックの中心には置きません。
6.1 UI
UIは、ユーザーが直接触れる画面です。WebアプリであればHTML、CSS、JavaScript、React、Vueなどが関係し、モバイルアプリであればSwiftUI、UIKit、Jetpack Composeなどが関係します。UIはユーザー体験に大きく影響しますが、ビジネスロジックそのものではありません。
クリーンアーキテクチャでは、UIはユースケースを呼び出す外側の存在として扱います。ユーザーがボタンを押すと、UIが入力値を取得し、ユースケースを呼び出し、その結果を画面に表示します。UIのデザインやフレームワークが変わっても、ユースケースやエンティティが大きく変わらないようにすることが重要です。
6.2 データベース
データベースは、情報を保存・取得するための仕組みです。MySQL、PostgreSQL、MongoDB、Firebaseなど、さまざまな技術があります。データベースはシステムにとって重要ですが、特定のデータベース製品にビジネスロジックが強く依存すると、変更が難しくなります。
クリーンアーキテクチャでは、データベース処理を外側に配置します。ユースケース層は「ユーザーを取得する」「注文を保存する」といった抽象的な操作を知っていればよく、具体的にSQLを使うのか、Firebaseを使うのかは外側の実装に任せます。この分離によって、データ保存方法を変更しても中心のロジックを守りやすくなります。
6.3 外部API
外部APIも外側の層に配置します。決済API、メール送信サービス、地図API、認証サービス、AI APIなど、外部サービスとの連携は現代のアプリ開発で頻繁に使われます。しかし、外部APIの仕様は変更される可能性があり、障害が起きることもあります。
そのため、ビジネスロジックが外部APIの詳細に直接依存しないように設計することが重要です。外部APIとの通信処理は外側に置き、内側には抽象的なインターフェースだけを見せます。これにより、外部APIを差し替えたり、テスト時にモックへ置き換えたりしやすくなります。
7. 依存性ルール
クリーンアーキテクチャの最重要ルールは、依存方向を常に内側へ向けることです。内側の層は外側の層を知らず、外側の層が内側の層に依存します。この依存性ルールを守ることで、ビジネスロジックを技術変更から守れます。
依存性ルールの整理
| ルール | 内容 | 意味 |
|---|---|---|
| 内側は外側を知らない | エンティティやユースケースはUIやDBを知らない | 中心ロジックを守る |
| 外側は内側に依存する | UIやDB実装がユースケースを呼ぶ | 技術要素を交換しやすくする |
| 依存方向は内向き | 依存の矢印は中心へ向かう | 変更に強い構造になる |
| 抽象に依存する | 具体実装ではなくインターフェースを見る | 差し替えやテストがしやすい |
7.1 内側は外側を知らない
内側の層は、外側の層を知ってはいけません。たとえば、エンティティ層やユースケース層が、具体的なUIフレームワーク、データベース製品、外部APIクライアントに依存すると、外部技術の変更が中心ロジックへ影響します。これでは、クリーンアーキテクチャの目的である変更耐性が弱くなります。
内側の層は、ビジネス上必要なルールや処理に集中すべきです。「ユーザーが購入できるか」「注文を確定できるか」「予約が有効か」といった判断は、UIやDBの都合とは独立して存在するべきです。内側が外側を知らない設計にすることで、中心のロジックを安定させられます。
7.2 外側は内側に依存する
外側の層は、内側の層に依存します。たとえば、UIはユースケースを呼び出し、データベース実装はユースケースが必要とする保存インターフェースを満たします。つまり、外側の技術的な要素は、内側のビジネスロジックを支えるために存在します。
この考え方により、UIやデータベースは差し替え可能な部品になります。Web画面からモバイルアプリへ変わっても、同じユースケースを使える可能性があります。MySQLから別のデータベースに変更しても、保存インターフェースが変わらなければ、内側の処理はそのまま使えます。
7.3 依存方向は常に内向き
クリーンアーキテクチャでは、依存方向は常に内向きです。外側から内側へ向かって依存し、内側から外側へは直接依存しません。このルールを守ることで、中心のビジネスロジックが最も安定した層になります。
依存方向が逆になると、システムは技術変更に弱くなります。たとえば、ユースケースが特定のデータベースライブラリに依存していると、そのライブラリを変更するだけでユースケースも修正が必要になります。依存方向を内向きにすることは、長期運用における保守性を高めるための基本です。
8. なぜClean Architectureが重要なのか
クリーンアーキテクチャが重要なのは、変更に強く、テストしやすく、長期運用しやすいシステムを作れるからです。ソフトウェアは一度作って終わりではなく、改善、機能追加、仕様変更、不具合修正を繰り返します。そのため、最初から変更しやすい構造を作ることが重要です。
8.1 変更に強い設計になる
クリーンアーキテクチャでは、UI、データベース、外部APIなどの技術的な要素を外側に配置します。そのため、画面デザインを変更したり、データベースを変更したり、外部APIを差し替えたりしても、中心のビジネスロジックへの影響を小さくできます。
変更に強い設計は、長期運用で大きな価値を持ちます。プロダクトが成長すると、必ず仕様変更や機能追加が発生します。そのたびにコード全体を修正しなければならない設計では、開発速度が落ち、バグも増えます。クリーンアーキテクチャは、変更を前提にした設計思想です。
8.2 テストがしやすい
クリーンアーキテクチャでは、ビジネスロジックがUIやデータベースから分離されるため、テストがしやすくなります。ユースケースやエンティティは、外部サービスを使わずに単体でテストできるように設計しやすいです。
たとえば、購入処理のテストを行うときに、実際のデータベースや決済APIへ接続しなくても、モックやスタブを使って検証できます。これにより、テストが速くなり、安定し、失敗原因も特定しやすくなります。テストしやすい設計は、品質の高いソフトウェア開発に不可欠です。
8.3 UIやDBを変更しても壊れない
クリーンアーキテクチャでは、UIやデータベースが外側にあるため、これらを変更しても中心の処理が壊れにくくなります。たとえば、Web画面をモバイルアプリに変えても、同じユースケースを使えるように設計できます。MySQLをPostgreSQLへ変更しても、保存処理のインターフェースを保てば、中心ロジックを変更せずに済む可能性があります。
もちろん、現実には完全に無変更で済むとは限りません。しかし、依存関係が整理されていれば、変更範囲を限定しやすくなります。これは、開発チームにとって非常に大きなメリットです。
9. MVCとの違い
MVCは、モデル、ビュー、コントローラーに分ける設計パターンです。Web開発やアプリ開発で広く使われていますが、実装方法によってはUIやフレームワーク中心の設計になりやすい場合があります。一方、クリーンアーキテクチャはドメインやユースケースを中心に置く点が大きな違いです。
MVCとクリーンアーキテクチャの違い
| 観点 | MVC | クリーンアーキテクチャ |
|---|---|---|
| 中心 | 画面やフレームワークに寄りやすい | ドメインとユースケース |
| 分離単位 | モデル・ビュー・コントローラー | エンティティ・ユースケース・変換層・外部層 |
| 依存方向 | 実装次第で混ざりやすい | 内側へ向ける |
| テスト容易性 | 設計次第 | 高めやすい |
| 長期保守 | 肥大化に注意 | 変更に強くしやすい |
9.1 MVC
MVCは、画面表示をビュー、処理の仲介をコントローラー、データやロジックをモデルとして分ける設計です。シンプルで理解しやすく、多くのフレームワークで採用されています。小規模なアプリや一般的なWebサイトでは、MVCだけでも十分に整理された設計を作れる場合があります。
しかし、実務ではコントローラーが肥大化したり、モデルにデータベース処理とビジネスロジックが混ざったりすることがあります。特にフレームワークに強く依存したMVCでは、ビジネスロジックがフレームワークの構造に閉じ込められやすくなります。この状態が進むと、テストや変更が難しくなります。
9.2 Clean Architecture
クリーンアーキテクチャは、MVCよりもドメイン中心の考え方を強く持ちます。UIやフレームワークではなく、ビジネスルールとユースケースを中心に置きます。そのため、画面やデータベースの変更に対して、中心ロジックを守りやすくなります。
MVCとクリーンアーキテクチャは対立するものではありません。外側の層でMVCを使い、内側にユースケースやエンティティを配置することもできます。重要なのは、MVCの構造だけで満足せず、ビジネスロジックがどこにあり、何に依存しているかを確認することです。
10. 実務でのメリット
クリーンアーキテクチャの実務上のメリットは、長期運用に強いこと、チーム開発しやすいこと、機能追加が安全になることです。特に、複数人で開発するプロダクトや、数年単位で運用するシステムでは効果が出やすくなります。
10.1 長期運用に強い
長期運用されるシステムでは、最初の設計が後から大きな影響を持ちます。短期的には素早く作れる設計でも、数年後に変更しづらくなり、保守コストが高くなることがあります。クリーンアーキテクチャは、初期実装に少し手間がかかる場合がありますが、長期的には変更コストを下げやすい設計です。
特に、ビジネスロジックをUIやデータベースから分離しておくと、技術変更に対応しやすくなります。フロントエンドフレームワークの変更、データベース移行、外部API差し替えなどが発生しても、中心ロジックを守れる可能性が高まります。
10.2 チーム開発しやすい
クリーンアーキテクチャでは、レイヤーごとの役割が明確になるため、チーム開発がしやすくなります。ある開発者はユースケースを担当し、別の開発者はUIを担当し、別の開発者はデータベース実装を担当する、という分担がしやすくなります。
また、コードの配置ルールが明確になると、どこに何を書くべきか迷いにくくなります。チーム内で設計ルールを共有できれば、コードレビューもしやすくなり、実装のばらつきも減らせます。クリーンアーキテクチャは、コード品質だけでなくチームの開発効率にも関係します。
10.3 機能追加が安全
機能追加時に既存機能を壊しにくいことも、クリーンアーキテクチャの大きなメリットです。ユースケースやエンティティが整理されていれば、新しい機能をどこに追加すべきか判断しやすくなります。また、テストしやすい構造であれば、追加機能が既存処理に悪影響を与えていないか確認しやすくなります。
逆に、ロジックが画面やデータベース処理に散らばっていると、機能追加のたびに影響範囲が分かりにくくなります。安全に機能追加するためには、コードの責務が分かれていることが重要です。クリーンアーキテクチャは、そのための構造を提供します。
11. よくある誤解
クリーンアーキテクチャには、「複雑すぎる」「大規模開発専用」「すべての層を厳密に分けなければならない」といった誤解があります。実際には、目的は複雑な構造を作ることではなく、変更に強い構造を作ることです。
11.1 「複雑すぎる設計」ではない
クリーンアーキテクチャは、使い方を間違えると確かに複雑になります。小さな処理まで過剰に抽象化し、ファイル数やインターフェースが増えすぎると、逆に読みづらくなることがあります。しかし、本来の目的は複雑化ではなく、責務分離と依存性制御です。
重要なのは、プロジェクトの規模や変更頻度に合わせて適用することです。すべてを厳密に分けるのではなく、ビジネス上重要で変更から守りたい部分を中心に分離すると、現実的な設計になります。クリーンアーキテクチャは、形を真似するものではなく、意図を理解して使うものです。
11.2 小規模でも使える
クリーンアーキテクチャは大規模開発だけのものではありません。小規模なアプリでも、ビジネスロジックをUIから分ける、データベース処理を直接書き込まない、ユースケースを切り出す、といった考え方は有効です。
ただし、小規模プロジェクトで最初からすべての層を厳密に作る必要はありません。重要なのは、将来変更されそうな部分や、テストしたい処理を分離しておくことです。小さく始めて、必要に応じて構造を育てる方が実務では扱いやすいです。
11.3 すべての層を厳密に分ける必要はない
クリーンアーキテクチャを導入するとき、すべての層を常に厳密に分けなければならないと考える必要はありません。プロジェクトの規模、開発人数、運用期間、変更頻度によって、どこまで分離するかは調整できます。
たとえば、プロトタイプ段階ではシンプルな構造にし、プロダクトが成長して複雑になった段階でユースケースやドメイン層を明確にする方法もあります。大切なのは、依存方向を意識し、ビジネスロジックを技術詳細に埋め込まないことです。
12. 実装イメージ
クリーンアーキテクチャの実装イメージは、UIがユースケースを呼び出し、ユースケースがエンティティを操作し、データ保存や外部API連携はインターフェースを通じて外側の実装へ依頼する流れです。重要なのは、内側の層が外側の具体技術を知らないことです。
12.1 UI → UseCase → Entity
典型的な流れは、UIからユースケースを呼び出し、ユースケースがエンティティを操作する形です。たとえば、ログイン画面でユーザーがメールアドレスとパスワードを入力し、ログインボタンを押すと、UIはログインユースケースを呼び出します。ログインユースケースは入力値を検証し、ユーザー情報を確認し、認証結果を返します。
このとき、UIは認証ロジックの詳細を持たず、ユースケースに処理を依頼するだけです。また、ユースケースは画面の見た目を知りません。成功や失敗の結果を返し、それをどのように表示するかはUI側が担当します。この分離によって、UI変更と処理変更を分けて扱いやすくなります。
12.2 DBは外側で差し替え可能
データベースは外側に配置し、内側の層からは抽象的な保存・取得インターフェースを通じて扱います。たとえば、ユースケースは「ユーザーを取得する」というインターフェースを使い、具体的にMySQLから取得するのか、Firebaseから取得するのかは外側の実装が担当します。
この設計にすると、データベースを変更したい場合でも、中心のユースケースやエンティティへの影響を抑えられます。また、テスト時には本物のデータベースではなく、メモリ上のモック実装に差し替えることもできます。これが、クリーンアーキテクチャのテスト容易性につながります。
12.3 APIも差し替え可能
外部APIも同じように外側で差し替え可能にします。たとえば、決済サービスを使う場合、ユースケースは「支払いを実行する」という抽象的なインターフェースを呼び出し、具体的にどの決済サービスを使うかは外側の実装が担当します。
外部APIは仕様変更や障害が起こる可能性があるため、中心ロジックが直接依存していると変更時の影響が大きくなります。抽象化して外側に置くことで、API差し替えやテスト時のモック化がしやすくなります。実務では、外部依存をどれだけ内側から切り離せるかが保守性に大きく影響します。
13. Clean Architectureの本質
クリーンアーキテクチャの本質は、変更コストを下げ、ビジネスロジックを守り、技術依存を外側へ追い出すことです。目的は、複雑な構造を作ることではなく、長く使える壊れにくいシステムを作ることです。
クリーンアーキテクチャの本質整理
| 本質 | 内容 |
|---|---|
| 変更コストを下げる | 技術変更や仕様変更の影響範囲を小さくする |
| ビジネスロジックを守る | サービスの核心を外部技術から独立させる |
| 技術依存を外側に置く | UI、DB、外部APIを交換しやすくする |
| テストしやすくする | 中心ロジックを単体で検証しやすくする |
| 壊れにくい構造を作る | 長期運用に耐える設計にする |
13.1 変更コストを下げる設計
クリーンアーキテクチャは、変更コストを下げるための設計です。ソフトウェアは運用される限り、必ず変更されます。新しい機能、仕様変更、UI改善、データベース変更、外部API変更、不具合修正などが継続的に発生します。
変更コストが高い設計では、小さな修正にも時間がかかり、バグが起きやすくなります。クリーンアーキテクチャでは、責務を分け、依存方向を制御することで、変更範囲を限定しやすくします。これにより、長期的な開発速度を維持しやすくなります。
13.2 ビジネスロジックを守る構造
クリーンアーキテクチャでは、ビジネスロジックを中心に置きます。これは、サービスの価値を生むルールを守るためです。UIやデータベースは重要ですが、ビジネスルールそのものではありません。技術が変わっても、サービスの核心となるルールはできるだけ安定しているべきです。
ビジネスロジックが画面やデータベースに埋もれていると、仕様変更時に修正箇所が散らばり、バグが起きやすくなります。中心に集めて守ることで、仕様を理解しやすくなり、テストもしやすくなります。
13.3 技術依存を外側に追い出す
クリーンアーキテクチャの重要な考え方は、技術依存を外側に追い出すことです。フレームワーク、データベース、外部API、UIライブラリなどは、いずれ変わる可能性があります。これらに中心ロジックが強く依存すると、技術変更のたびにシステム全体が揺らぎます。
外側へ追い出すことで、技術を交換可能な部品として扱いやすくなります。もちろん、完全に独立させることは簡単ではありませんが、依存方向を意識するだけでも保守性は大きく変わります。技術はビジネスロジックを支える道具であり、中心に置きすぎないことが重要です。
13.4 システムを長く使うための設計思想
クリーンアーキテクチャは、短期的にコードを書くためだけの設計ではなく、システムを長く使うための設計思想です。長期運用では、最初に選んだ技術が古くなることもあり、開発メンバーが入れ替わることもあり、仕様が大きく変わることもあります。
そのような変化に耐えるには、コードの責務が明確で、中心ロジックが守られ、テストしやすい構造が必要です。クリーンアーキテクチャは、未来の変更を前提にした設計といえます。
13.5 「壊れない構造」を作ることが目的
クリーンアーキテクチャの目的は、「壊れない構造」を作ることです。ここでいう壊れないとは、不具合が絶対に起きないという意味ではありません。変更時に影響範囲が分かりやすく、修正しやすく、テストしやすく、障害を広げにくい構造を意味します。
良い設計は、変化に強い設計です。プロダクトが成長するほど、コードは複雑になります。その複雑さを制御し、ビジネスロジックを守り、開発チームが安全に変更できるようにすることが、クリーンアーキテクチャの本質です。
おわりに
クリーンアーキテクチャは、保守性を重視したソフトウェア設計思想です。エンティティ、ユースケース、インターフェース変換層、フレームワーク・外部ドライバー層に役割を分け、依存方向を内側へ向けることで、ビジネスロジックを外部技術から守ります。
特に重要なのは、ドメイン中心で考えることです。UIやデータベースは変わる可能性がありますが、サービスの価値を生むビジネスルールはシステムの中心として安定しているべきです。クリーンアーキテクチャは、この中心を守るために、依存性ルールとレイヤー分離を使います。
大規模開発や長期運用では、クリーンアーキテクチャの効果が特に大きくなります。変更に強く、テストしやすく、チーム開発しやすい構造を作ることで、機能追加や仕様変更を安全に進められます。クリーンアーキテクチャの本質は、複雑な設計を作ることではなく、長く使える壊れにくいソフトウェア構造を作ることにあります。
EN
JP
KR