Open4

NestJSの全体像・NestJSの設計や使い方について

まさぴょんまさぴょん

NestJSの設計や使い方について

NestJSは、効率的でスケーラブルなサーバーサイドアプリケーションを構築するためのNode.jsフレームワークです。

Angularにインスパイアされたアーキテクチャを採用しており、モジュラー化、依存性注入(DI)、デコレーターなどの機能を提供しています。

設計

  1. モジュール:アプリケーションはモジュール単位で構成されます。各モジュールは、関連するコンポーネント(コントローラー、プロバイダー、サービスなど)をグループ化します。

  2. コントローラー:HTTPリクエストを処理し、レスポンスを返すためのクラスです。ルーティングを定義し、クライアントからの要求に応答します。

  3. プロバイダー(サービス):ビジネスロジックを実装するためのクラスです。依存性注入を通じて他のコンポーネントで利用できます。

  4. デコレーター:クラスやメソッドにメタデータを付与するための機能です。@Controller、@Get、@Postなどのデコレーターを使用してルーティングや依存性を定義します。

  5. ミドルウェア、ガード、インターセプター:リクエスト/レスポンスサイクルの各段階で追加の処理を行うための仕組みです。

使い方

1. プロジェクトのセットアップ

npm i -g @nestjs/cli
nest new my-project

2. モジュールの作成

# src/users/users.module.ts が作成される
nest g module users

# src/modules/users/users.module.ts が作成される
nest g module modules/users 

3. コントローラーの作成

nest g controller users

nest g controller modules/users 

4. サービスの作成

nest g service users

5. コントローラーの実装

import { Controller, Get } from '@nestjs/common';
import { UsersService } from './users.service';

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get()
  findAll() {
    return this.usersService.findAll();
  }
}

6. サービスの実装

import { Injectable } from '@nestjs/common';

@Injectable()
export class UsersService {
  findAll() {
    return ['User1', 'User2', 'User3'];
  }
}

7. アプリケーションの起動

npm run start

ブラウザでhttp://localhost:3000/usersにアクセスすると、ユーザーのリストが表示されます。

特徴

  • モジュール化:機能ごとにコードを整理できます。
  • 依存性注入:テストや再利用性が向上します。
  • TypeScriptベース:型安全で、開発体験が向上します。
  • 拡張性:Microservices、WebSockets、GraphQLなどの機能をサポートしています。

学習リソース

  • 公式ドキュメントhttps://docs.nestjs.com/
  • チュートリアル:公式サイトのガイドを順に進めると理解が深まります。
まさぴょんまさぴょん

NestJSのディレクトリ設計について

NestJSは、モジュール化されたアーキテクチャを採用しており、コードの整理や再利用性を高めることができます。以下は一般的なディレクトリ構成とベストプラクティスです。

基本的なディレクトリ構成

project-root/
├── src/
│   ├── app.controller.ts
│   ├── app.module.ts
│   ├── app.service.ts
│   ├── main.ts
│   ├── modules/
│   │   └── ...
│   ├── common/
│   │   └── ...
│   └── shared/
│       └── ...
├── test/
│   └── ...
├── package.json
├── tsconfig.json
└── nest-cli.json

srcディレクトリ

  • app.controller.ts: アプリケーションのルートコントローラー。
  • app.module.ts: ルートモジュール。全てのモジュールをここでインポートします。
  • app.service.ts: アプリケーションの主要なサービスロジック。
  • main.ts: アプリケーションのエントリーポイント。

modulesディレクトリ

機能ごとのモジュールを格納します。例えば、ユーザーモジュールや認証モジュールなど。

src/
├── modules/
│   ├── users/
│   │   ├── users.controller.ts
│   │   ├── users.module.ts
│   │   ├── users.service.ts
│   │   ├── dto/
│   │   │   └── ...
│   │   └── entities/
│   │       └── ...
│   └── auth/
│       └── ...
  • users.controller.ts: ユーザー関連のHTTPリクエストを処理。
  • users.module.ts: ユーザーモジュールの定義。
  • users.service.ts: ビジネスロジックを実装。
  • dto/: データ転送オブジェクトを格納。
  • entities/: データベースエンティティを格納。

commonディレクトリ

アプリケーション全体で共有するガード、パイプ、フィルター、インターセプターなどを格納します。

src/
├── common/
│   ├── guards/
│   ├── pipes/
│   ├── filters/
│   └── interceptors/

sharedディレクトリ

共有サービスやユーティリティ関数、定数などを格納します。

src/
├── shared/
│   ├── services/
│   ├── utils/
│   └── constants/

ベストプラクティス

  1. モジュールごとの分離: 機能ごとにモジュールを作成し、関連するコントローラー、サービス、エンティティ、DTOをまとめます。
  2. 命名規則の統一: ファイルやクラス名は一貫性のある命名規則を採用します(例:users.controller.tsUsersController)。
  3. 共通コンポーネントの整理: 複数のモジュールで使用するコンポーネントはcommonまたはsharedディレクトリに配置します。
  4. ディレクトリの深さを適切に: 深すぎるネストは避け、アクセスしやすい構造にします。
  5. 環境設定の管理: 環境ごとの設定ファイルを作成し、設定値を一元管理します。

例:ユーザーモジュールのディレクトリ構成

src/
├── modules/
│   ├── users/
│   │   ├── dto/
│   │   │   ├── create-user.dto.ts
│   │   │   └── update-user.dto.ts
│   │   ├── entities/
│   │   │   └── user.entity.ts
│   │   ├── users.controller.ts
│   │   ├── users.module.ts
│   │   └── users.service.ts

まとめ

NestJSのディレクトリ設計は、プロジェクトの規模や要件に応じて柔軟にカスタマイズできます。
モジュール化された構造を活用して、コードの再利用性と保守性を高めることが重要です。