Giter Site home page Giter Site logo

clean-architecture-typescript-boilerplate's Introduction

Summary

Clean Arcihtecture typescript boilerplate

with ChatGPT(-3.5)

Chat log

Q. TypeScriptでExpressを使用してAPIサーバーを作成する際、クリーンアーキテクチャを構成したい場合、どのようなディレクトリ構成になるか記載してください

A.

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アプリケーションを実装することができます。

Q.具体的なディレクトリ構成を教えてください

A.

├── 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のコンパイル設定が定義されています。

以上のようなディレクトリ構成を採用することで、各層が疎結合になり、変更に対する影響範囲が小さくなるというメリットが得られます。また、各層を単体テストすることが容易になります。

Q.コーディングを行っていきたいです。どのファイルから着手していけばいいですか

A.

クリーンアーキテクチャでは、外側の層から内側の層に向かって実装を進めていくことが推奨されています。つまり、まずはインターフェース層を実装していき、その後、アプリケーション層、ドメイン層、そしてインフラストラクチャ層を実装していくことになります。

具体的には、まずはsrc/interfacesディレクトリ以下にあるコントローラのインターフェースを定義し、次にsrc/applicationディレクトリ以下にあるコントローラの実装を行うことが考えられます。その後、src/domainディレクトリ以下にあるエンティティ、ユースケース、リポジトリを実装し、最後にsrc/infrastructureディレクトリ以下にあるリポジトリの実装を行うことになります。

また、それぞれの実装において、単体テストを行いながら実装を進めることが重要です。単体テストによって、各層の振る舞いを確認しながら実装を進めることができます。

手動部分

npm initで作成開始

volta pin [email protected]でパッケージ管理

npm install expressでExpressインストール

filepath + を記述してくださいで指示して作成。

ex.) src/infrastructure/server.tsを記述してください。

一部整合性の取れなかった部分は適宜修正。

clean-architecture-typescript-boilerplate's People

Contributors

6uclz1 avatar

Stargazers

 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.