はじめに
どうも初心者プログラマのDevLinkHubです。
OSSの貢献にあたってクリーンアーキテクチャというものを知ったので初心者なりにクリーンアーキテクチャについてまとめてみました。何か間違えがあったら教えていただけるとありがたいです。
📖 そもそもクリーンアーキテクチャとは?
クリーンアーキテクチャとは、システムを複数の独立した層に分割し、依存関係の方向を厳密に制御することで、ビジネスの核(ドメイン)を外部の技術変化から守るアーキテクチャパターンです。
🧱 各レイヤーの定義と役割
👑 ドメイン層 (Domain Layer)
: コンピュータ上で扱いたい「物」の定義をする場所。
- エンティティ: 🧱 ビジネスオブジェクト(データを保持するだけでなく、基本ルールを持つオブジェクト)
- ユースケース: 📜 アプリケーションに特化したビジネスルール。
- ドメインサービス: 🔄 複数のエンティティを跨ぐ、広範なビジネス処理。
⚙️ アプリケーション層 (Application Layer)
: ドメインオブジェクトを利用して、ユースケース(業務フロー)を実現するところ。
- ユースケース実装: 🚀 コンピュータ上で実現したい「処理の実行」を組み立てていく部分。
- ドメインサービス: (← ドメイン層で定義されたものを呼び出す)
💻 インターフェース層 (Interface Layer)
: ユーザーインターフェースや外部との接点。
- コントローラー/プレゼンター: ✨ ビジネスロジックの結果を、画面やレスポンスとして「見せる形」に変換する担当。
- APIエンドポイント: 🔗 外部からの具体的な接続点。
🗄️ インフラストラクチャ層 (Infrastructure Layer)
: 外部環境との具体的な接続と実装を担当。
- データベースアクセス: 💾 永続化のための仕組み(マイグレーション、ORMなど)。
- 外部サービス連携: 📧 決済APIや通知サービスなど、外部システムとの接続。
- フレームワーク統合: 🛠️ フレームワークが提供する機能の組み込み。
✨ なぜこのように分けるのか? (メリット)
このように層に分けることで、以下の重要なメリットが得られます。
- ✅ ビジネスロジックの独立: 業務ルール(ドメイン)が、どの技術(DBやUI)にも依存しなくなります。
- 🧪 テストの容易さ: 外部環境への依存を排除し、ビジネスロジック部分(ドメイン)を純粋な形でテストできます。
- 🔄 技術スタックの変更が容易: データベースをMySQLからNoSQLに替える場合など、インフラ層のみの変更で済みます。
- 🛡️ 機能追加の影響範囲を限定: 変更が最も影響を与えやすい「ドメイン層」や「ユースケース」のコアロジックに限定されやすいです。
📌 最重要原則: 依存関係を徹底的に管理し、内側の層は外側の層を知らないという状況を作り出すことが目標です。
📁 ファイル構造の推奨パターン
実際にプロジェクトを構成する際は、どのファイルがどのレイヤーに属するのかを明確にすることが、チーム開発の可読性を大きく向上させます。
に書いてある通り以下のような形で作ることでどれが何かがわかりやすくなります。
ちなみに依存関係は以下のようになっています
Presentation Layer → Application Layer → Domain Layer ← Infrastructure Layer
src/ ├── domain/ # ドメイン層 │ ├── entities/ # ビジネスオブジェクト │ │ ├── task.rs │ │ └── user.rs │ ├── repositories/ # リポジトリインターフェース │ │ ├── task_repository.rs │ │ └── user_repository.rs │ └── services/ # ドメインサービス │ └── task_domain_service.rs ├── application/ # アプリケーション層 │ ├── use_cases/ # ユースケース │ │ ├── task/ │ │ │ ├── add_task/ │ │ │ └── list_tasks/ │ │ └── user/ │ │ └── register_user/ │ └── adapters/ # アダプター │ ├── task_adapter.rs │ └── user_adapter.rs ├── infrastructure/ # インフラストラクチャ層 │ ├── repositories/ # リポジトリ実装 │ │ ├── task_repository_impl.rs │ │ └── user_repository_impl.rs │ ├── external_apis/ # 外部API連携 │ │ └── notification_service.rs │ └── database/ # データベース関連 │ ├── models.rs │ └── migrations/ └── presentation/ # プレゼンテーション層 ├── controllers/ # コントローラー │ ├── task_controller.rs │ └── user_controller.rs ├── handlers/ # HTTPハンドラー │ ├── task_handlers.rs │ └── user_handlers.rs └── presenters/ # プレゼンター ├── task_presenter.rs └── user_presenter.rs
まとめ
初めて個人開発で作ったDevLinkHub Chatの作成において困ったことをそのまま解決していてアーキテクチャの大切さを学ぶことができました。
参考記事
クリーンアーキテクチャの思考とは?
なぜクリーンアーキテクチャを使うのか?
ビジネスオブジェクトとは?
ユースケース実装とは?
インターフェース層とは?
