0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Nest JS Architecture

Last updated at Posted at 2024-07-05

Nest JS Architecture

参考にしたサイト

Best Way to Structure Your Directory/Code (NestJS)

Site 01: NestJSにおけるクリーンアーキテクチャなディレクトリ構造

Site 02: 少し大きな規模のRESTfull APIを構築するディレクトリ構成を考えてみる

Site 03: nestjs-api-structure

アーキテクチャの例

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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?