🙌

Nest.jsのアーキテクチャーと基本3概念「モジュール」「コントローラ」「サービス」

2024/11/22に公開

Nest.jsとは

Node.jsでTypeScriptを使った高速でWebアプリを作れるバックエンドフレームワークです。最近だとTypeScriptだけで開発できるNest.jsとReactを使った開発なども増えてきました。Expressをベースに作られています。

Nest.jsの特徴

  • Expressの機能が使える
  • テストフレームワークが用意されている
  • OpenAPIなどが用意されている
  • NestCLIを使ってテンプレートが作れる
  • GraphQLと相性がいい

最近だとBFE開発も見かけるようになってきました。Nest.jsとGraphQLだと相性が抜群です。

https://zenn.dev/overflow_offers/articles/20220418-what-is-bff-architecture

公式ドキュメント

https://nestjs.com/

補足

2024年11月時点

Nest.jsの導入

Nest.jsを導入します。

 npm i -g @nestjs/cli

バージョン確認します。

nest -v
10.4.5

新規作成をしていきます。

$ nest new project-name
$ cd project-name
$ npm start
  • localhost:3000

サーバー起動法

サーバーを起動するなら以下のコマンドが良さそうです。

$ npm run start:dev

概念

Nest.jsで知っておくべき3つの概念があります。この後それぞれ役割などを説明していきます。

  • Module
    下の画像を参考にしてください。

  • Controller
    下の画像を参考にしてください。

  • Service
    ビジネスロジックやデータベースアクセスを管理するバックエンドのロジック層で、
    データの取得、保存、変換などの処理をします。

image.png

引用 https://qiita.com/to3izo/items/ecbec71817ab589f87d7

追加でresolverを紹介します。

  • resolver
    クライアントからのGraphQLリクエストを処理するための層です。
    クライアントから受け取ったクエリやミューテーションを解決(データを取得してレスポンスする)する役割です。

Nest.jsのアーキテクチャー

IMG_4476.jpeg

GraphQLを使う場合、Controllerの代わりにResolverを使う

ControllerがREST API用のエンドポイントを定義するのに対し、
ResolverGraphQLのクエリやミューテーションを定義する役割があります。

ファイルの作成方法

モジュール

プログラムの部品を分かりやすく整理して「引き出し」にまとめた箱をイメージしてください。
これがあると、プログラムの中で使いたいものをすぐに見つけられて、非常に便利なものです。

関係するControllerやSErviceなどをまとめ
アプリとして利用できるようにNest.jsに登録するや役割があります。
Nest.jsには、必ず1つ以上のルートモジュールとFeatureモジュールが必要となります。

  • モジュール作成
$ nest g module posts

CREATE src/posts/posts.module.ts (82 bytes)
UPDATE src/app.module.ts (312 bytes)

Controller

クライアントからリクエストを受け、クライアントにレスポンスを返すつまり
Controllerには、ルーティング機能としての役割があります。

  • コントローラー作成方法
$ nest g controller posts
 
CREATE src/posts/posts.controller.spec.ts (485 bytes)
CREATE src/posts/posts.controller.ts (99 bytes)
UPDATE src/posts/posts.module.ts (170 bytes)

⚫︎補足
spec.tsが不要な場合は

$ nest g controller posts  --no-spec

にします。

Service

ビジネスロジックを書く時にここに定義します。Railsとかでもビジネスロジックは
Serviceクラスに分けたりしますよね‼︎Controllerには、リーティングの役割があるので、このServiceにロジックは書いていくんですね。

https://zenn.dev/norihashimo/articles/16544217e38e85

  • サービス作成方法
    サービスの作り方です。
% nest g service post
s
CREATE src/posts/posts.service.spec.ts (453 bytes)
CREATE src/posts/posts.service.ts (89 bytes)
UPDATE src/posts/posts.module.ts (248 bytes)

DI(Dependency Injection)とは

日本語だと依存性の注入ですね。
例えばUsersControllerはUsersServiceがないと動かないようになっています。
この状態をUsersControllerはUsersServiceに依存している状態です。

Discussion