Nest JS Architecture
参考にしたサイト
Best Way to Structure Your Directory/Code (NestJS)
Site 01: NestJSにおけるクリーンアーキテクチャなディレクトリ構造
Site 02: 少し大きな規模のRESTfull APIを構築するディレクトリ構成を考えてみる
アーキテクチャの例
Site 01
この構造では
domain
というフォルダでデータベースのテーブルを管理し
usecases
というフォルダでサービスを管理し
presentations
というフォルダでコントローラーを管理しています
良い点
domain
というフォルダでテーブル情報とインターフェイスをまとめて管理しているので、データベース構造を管理しやすそう。
気になる点
サービス、コントローラーをまとめて管理しているので、
「ユーザー向け」「管理者向け」機能を分離する工夫が別で必要になりそう。
./src
├── app.module.ts
├── main.ts
├── presentations
│ ├── userController.ts
│ └── chatController.ts
├── usecases
│ ├── userService.ts
│ └── chatService.ts
├── domains
│ ├── user
│ │ ├── userRepositoryInterface.ts
│ │ └── userEntity.ts
│ └── chat
│ ├── chatRepositoryInterface.ts
│ └── chatEntity.ts
├── infrastructures
│ ├── sequelize
│ │ └── userRepository.ts
│ └── dynamodb
│ └── chatRepository.ts
└── configs
Site 02
この構造では v1
というフォルダで API のバージョン管理を行っている。
それ以外はほとんどプロジェクトを立ち上げた際のデフォルトの構造をしている。
良い点
ユーザー向けの機能と管理者向けの機能を分離しやすい。
気になる点
テーブル情報を管理するファイルが記載されていないので、そこは考える必要がある。
module を機能ごとに作成するのは、冗長すぎてむしろ可読性が下がりそう。
./src
├── app.controller.ts
├── app.module.ts
├── app.service.ts
├── main.ts
└── v1
├── user
│ ├── user.module.ts
│ ├── 01
│ │ ├── 01.controller.ts
│ │ ├── 01.module.ts
│ │ └── 01.service.ts
│ ├── 02
│ │ ├── 02.controller.ts
│ │ ├── 02.module.ts
│ │ └── 02.service.ts
│ └── 03
│ ├── 03.controller.ts
│ ├── 03.module.ts
│ └── 03.service.ts
└── admin
├── admin.module.ts
├── 01
│ ├── 01.controller.ts
│ ├── 01.module.ts
│ └── 01.service.ts
├── 02
│ ├── 02.controller.ts
│ ├── 02.module.ts
│ └── 02.service.ts
└── 03
├── 03.controller.ts
├── 03.module.ts
└── 03.service.ts
Site 03
これは Nest JS を用いた開発をする際、実際に使用することができるテンプレートです。
そのこともあり、もっとも完成された構造になっていると感じました。
良い点
entity
フォルダにテーブル構造がまとめられており、構造が管理しやすそう。
controllers
フォルダでコントローラーを管理しており
providers
でサービスを管理しているため、非常に管理しやすそう。
気になる点
entity に interface が無いところが少し気になる。
./src
├── app.module.ts
├── main.ts
├── entity
│ ├── index.ts
│ ├── entity01
│ │ ├── 01
│ ├── entity02
│ │ ├── 02
│ └── entity03
│ └── 03
├── modules
│ ├── common
│ │ ├── decorators
│ │ ├── filters
│ │ ├── guards
│ │ ├── middleware
│ │ └── providers
│ └── share
│ ├── cache
│ ├── dtos
│ │ ├── 01dto.ts
│ │ └── 02dto.ts
│ ├── pipes
│ │ ├── 01pipe.ts
│ │ └── 02pipe.ts
│ └── socket
│ ├── 01socket.ts
│ └── 02socket.ts
└── sample
├─ sample.module.ts
├── index.ts
├── controllers
│ ├── 01.controller.ts
│ └── *.controller.ts
└── providers
├── 01.service.ts
└── *.services.ts
最終的な提案
以上3つのディレクトリ構造を比較して、良いと思った部分を取り入れ、気になった部分を修正していくと、構造は以下のようになりました。
この構造なら
・ユーザー向けの機能と管理者向けの機能が分離できている。
・テーブル構造、dto が共通化できている。
・module が多すぎないので管理しやすい。
ので、機能の把握、管理が比較的容易かと思われます。
./src
├── app.module.ts
├── main.ts
├── config
│ └── database.ts
├── common
│ ├── domains
│ │ ├── user
│ │ │ ├── userEntity.ts
│ │ │ └── userInterface.ts
│ │ └── ..
│ └── dtos
│ ├── 01.dto.ts
│ └── ..
├── user
│ ├── providers
│ │ ├── 01.service.ts
│ │ └── ...
│ ├── controllers
│ │ ├── 01.controller.ts
│ │ └── ...
│ └── user.module.ts
└── admin
├── providers
│ ├── 01.service.ts
│ └── ...
├── controllers
│ ├── 01.controller.ts
│ └── ...
└── user.module.ts