Clean Arcihtecture typescript boilerplate
with ChatGPT(-3.5)
src/
├── application/ // アプリケーション層
│ ├── controllers/ // コントローラー
│ ├── usecases/ // ユースケース
│ └── presenters/ // プレゼンター
├── domain/ // ドメイン層
│ ├── entities/ // エンティティ
│ ├── repositories/ // リポジトリ
│ └── services/ // サービス
├── infrastructure/ // インフラストラクチャ層
│ ├── persistence/ // データ永続化
│ ├── services/ // 外部サービス
│ └── web/ // Web関連
│ ├── middlewares/ // ミドルウェア
│ ├── routes/ // ルーティング
│ └── views/ // ビュー
└── interfaces/ // インターフェース層
├── api/ // API関連
└── config/ // 設定ファイル
上記のディレクトリ構成は、アプリケーションの各層が明確に分離されていることを示しています。各層は、それぞれの役割に応じて分類され、コンポーネントが互いに依存しないようになっています。
- アプリケーション層は、ビジネスロジックを実装するためのコントローラーやユースケース、そして外部からの入力を受け取ってエンティティを操作し、最終的にレスポンスを返すプレゼンターなどのコンポーネントで構成されています。
- ドメイン層は、ビジネスロジックの核となるエンティティや、それを操作するためのリポジトリやサービスなどのコンポーネントで構成されています。
- インフラストラクチャ層は、データ永続化や外部サービスとの連携などの実装を提供するコンポーネントで構成されています。
- インターフェース層は、APIや設定ファイルなどのインターフェースを提供するコンポーネントで構成されています。これらの層を分離することにより、アプリケーションは柔軟性が高く、拡張性があり、テスト性が高くなります。また、それぞれの層が疎結合であるため、変更が発生した場合にも、影響範囲を最小限に抑えることができます。さらに、各層が自己完結しているため、コンポーネントの再利用性が高くなります。
Expressを使用する場合、インフラストラクチャ層にはWeb関連の実装が含まれます。これにより、Webアプリケーションに必要な機能を提供することができます。
具体的には、インフラストラクチャ層には以下のようなコンポーネントが含まれます。
データ永続化用のリポジトリ 外部APIとの通信用のサービス Expressアプリケーションの設定 Expressのルーティング Expressのミドルウェア これらのコンポーネントは、クリーンアーキテクチャの考え方に基づいて実装されます。たとえば、リポジトリやサービスは、ドメイン層に依存して実装され、Expressのルーティングやミドルウェアは、アプリケーション層に依存して実装されます。
また、APIのインターフェースは、インターフェース層に実装されます。具体的には、Expressのルーターを使用して、APIのエンドポイントを定義し、リクエストを受け取ってアプリケーション層のコンポーネントを呼び出します。
上記のディレクトリ構成を採用することで、クリーンアーキテクチャの考え方に基づいたExpressアプリケーションを実装することができます。
├── src
│ ├── application
│ │ ├── usecases
│ │ │ ├── createItem.ts
│ │ │ ├── getItem.ts
│ │ │ ├── listItems.ts
│ │ │ └── updateItem.ts
│ │ ├── index.ts
│ │ └── types.ts
│ ├── domain
│ │ ├── entities
│ │ │ ├── Item.ts
│ │ │ └── index.ts
│ │ └── repositories
│ │ ├── ItemRepository.ts
│ │ └── index.ts
│ ├── infrastructure
│ │ ├── repositories
│ │ │ ├── ItemRepositoryImpl.ts
│ │ │ └── index.ts
│ │ ├── web
│ │ │ ├── controllers
│ │ │ │ ├── CreateItemController.ts
│ │ │ │ ├── GetItemController.ts
│ │ │ │ ├── ListItemsController.ts
│ │ │ │ └── UpdateItemController.ts
│ │ │ ├── middleware
│ │ │ │ ├── authenticate.ts
│ │ │ │ └── errorHandler.ts
│ │ │ ├── routes
│ │ │ │ └── index.ts
│ │ │ └── server.ts
│ │ ├── index.ts
│ │ └── types.ts
│ └── interfaces
│ ├── controllers
│ │ ├── CreateItemController.ts
│ │ ├── GetItemController.ts
│ │ ├── ListItemsController.ts
│ │ └── UpdateItemController.ts
│ ├── http
│ │ ├── middleware
│ │ │ ├── authenticate.ts
│ │ │ └── errorHandler.ts
│ │ └── routes
│ │ └── index.ts
│ └── index.ts
├── package.json
└── tsconfig.json
このディレクトリ構成では、クリーンアーキテクチャの考え方に基づいて、それぞれの層が疎結合になるように実装されています。
src/applicationディレクトリには、アプリケーション層のコンポーネントが含まれます。usecasesディレクトリには、各ユースケースに対応するモジュールが実装されています。また、types.tsには、アプリケーション層で使用する型が定義されています。
src/domainディレクトリには、ドメイン層のコンポーネントが含まれます。entitiesディレクトリには、ドメインエンティティが実装されています。また、repositoriesディレクトリには、リポジトリインターフェースが定義されています。
src/infrastructureディレクトリには、インフラストラクチャ層のコンポーネントが含まれます。repositoriesディレクトリには、リポジトリの実装が実装されています。webディレクトリには、Webアプリケーションに必要なコンポーネントが含まれます。controllersディレクトリには、各エンドポイントに対応するコントローラが実装されています。また、routesディレクトリには、各エンドポイントに対応するルートが定義されています。middlewareディレクトリには、エラーハンドリングや認証など、Webアプリケーションに必要なミドルウェアが実装されています。types.tsには、インフラストラクチャ層で使用する型が定義されています。
src/interfacesディレクトリには、インターフェース層のコンポーネントが含まれます。controllersディレクトリには、アプリケーション層から呼び出されるコントローラのインターフェースが定義されています。httpディレクトリには、HTTPリクエスト・レスポンスに関連するコンポーネントが含まれます。middlewareディレクトリには、エラーハンドリングや認証など、Webアプリケーションに必要なミドルウェアのインターフェースが定義されています。また、routesディレクトリには、各エンドポイントのルーティングのインターフェースが定義されています。
tsconfig.jsonファイルには、TypeScriptのコンパイル設定が定義されています。
以上のようなディレクトリ構成を採用することで、各層が疎結合になり、変更に対する影響範囲が小さくなるというメリットが得られます。また、各層を単体テストすることが容易になります。
クリーンアーキテクチャでは、外側の層から内側の層に向かって実装を進めていくことが推奨されています。つまり、まずはインターフェース層を実装していき、その後、アプリケーション層、ドメイン層、そしてインフラストラクチャ層を実装していくことになります。
具体的には、まずはsrc/interfacesディレクトリ以下にあるコントローラのインターフェースを定義し、次にsrc/applicationディレクトリ以下にあるコントローラの実装を行うことが考えられます。その後、src/domainディレクトリ以下にあるエンティティ、ユースケース、リポジトリを実装し、最後にsrc/infrastructureディレクトリ以下にあるリポジトリの実装を行うことになります。
また、それぞれの実装において、単体テストを行いながら実装を進めることが重要です。単体テストによって、各層の振る舞いを確認しながら実装を進めることができます。
npm init
で作成開始
volta pin [email protected]
でパッケージ管理
npm install express
でExpressインストール
filepath
+ を記述してください
で指示して作成。
ex.) src/infrastructure/server.ts
を記述してください。
一部整合性の取れなかった部分は適宜修正。