Nest.jsのアーキテクチャーと基本3概念「モジュール」「コントローラ」「サービス」
Nest.jsとは
Node.jsでTypeScriptを使った高速でWebアプリを作れるバックエンドフレームワークです。最近だとTypeScriptだけで開発できるNest.jsとReactを使った開発なども増えてきました。Expressをベースに作られています。
Nest.jsの特徴
- Expressの機能が使える
- テストフレームワークが用意されている
- OpenAPIなどが用意されている
- NestCLIを使ってテンプレートが作れる
- GraphQLと相性がいい
最近だとBFE開発も見かけるようになってきました。Nest.jsとGraphQLだと相性が抜群です。
公式ドキュメント
補足
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
ビジネスロジックやデータベースアクセスを管理するバックエンドのロジック層で、
データの取得、保存、変換などの処理をします。
追加でresolver
を紹介します。
-
resolver
クライアントからのGraphQLリクエストを処理するための層です。
クライアントから受け取ったクエリやミューテーションを解決(データを取得してレスポンスする)する役割です。
Nest.jsのアーキテクチャー
GraphQLを使う場合、Controllerの代わりにResolverを使う
ControllerがREST API用のエンドポイントを定義するのに対し、
Resolver
はGraphQLのクエリやミューテーションを定義する役割があります。
ファイルの作成方法
モジュール
プログラムの部品を分かりやすく整理して「引き出し」にまとめた箱をイメージしてください。
これがあると、プログラムの中で使いたいものをすぐに見つけられて、非常に便利なものです。
関係する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にロジックは書いていくんですね。
-
サービス作成方法
サービスの作り方です。
% 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