NestJSは、TypeScriptで構築されたプログレッシブなNode.jsフレームワークです。エンタープライズグレードのサーバーサイドアプリケーションを効率的かつスケーラブルに開発するための強力な基盤を提供します。本記事では、NestJSの設計思想とアーキテクチャの特徴を理解し、Nest CLIを使用した開発環境のセットアップから最初のアプリケーション起動までを実践します。

実行環境と前提条件

本記事の内容を実践するにあたり、以下の環境を前提としています。

項目 バージョン・要件
Node.js 20以上
npm 10以上
NestJS 11.x
OS Windows / macOS / Linux
エディタ VS Code(推奨)

事前に以下の準備を完了してください。

  • Node.js 20以上のインストール(公式サイトからダウンロード可能)
  • ターミナル(コマンドプロンプト / PowerShell / bash)の基本操作

Node.jsのバージョンは以下のコマンドで確認できます。

1
2
node -v
# v20.x.x 以上であることを確認

NestJSとは何か

NestJSは、効率的でスケーラブルなNode.jsサーバーサイドアプリケーションを構築するためのフレームワークです。TypeScriptを第一言語としてサポートしながら、純粋なJavaScriptでの開発も可能です。

NestJSが解決する課題

Node.jsエコシステムには、Express、Koa、Fastifyなど優れたHTTPフレームワークが存在します。しかし、これらのフレームワークは「アーキテクチャ」という課題を効果的に解決していませんでした。

プロジェクトが成長するにつれて、以下のような問題が発生しがちです。

  • コードベースの構造が開発者ごとにバラバラになる
  • 依存関係の管理が煩雑になる
  • テストしにくいコードが増える
  • 新しいメンバーのオンボーディングに時間がかかる

NestJSは、「すぐに使えるアプリケーションアーキテクチャ」を提供することで、これらの問題を解決します。高度にテスト可能で、スケーラブルで、疎結合かつ保守しやすいアプリケーションを容易に構築できます。

Angularにインスパイアされた設計

NestJSのアーキテクチャは、フロントエンドフレームワークであるAngularに強く影響を受けています。以下の概念がNestJSにも取り入れられています。

概念 説明
Module アプリケーションの機能を論理的に分割する単位
Decorator クラスやメソッドにメタデータを付与する仕組み
Dependency Injection 依存性の注入によるコンポーネント間の疎結合化
Provider 注入可能なサービスやファクトリ

これらの概念により、NestJSはエンタープライズアプリケーションに必要な構造化されたコードベースを自然に形成できます。

graph TB
    subgraph "NestJS Architecture"
        A[Module] --> B[Controller]
        A --> C[Provider/Service]
        B --> D[Route Handler]
        C --> E[Business Logic]
        D --> F[HTTP Request/Response]
    end

Express/Fastifyとの関係性

NestJSは、内部で既存のHTTPフレームワークを活用しています。デフォルトではExpressを使用しますが、Fastifyに切り替えることも可能です。

プラットフォーム抽象化

NestJSはプラットフォームに依存しない設計を採用しています。これにより、開発者は基盤となるフレームワークを意識せずにアプリケーションを構築でき、必要に応じてプラットフォームを切り替えられます。

プラットフォーム 特徴
platform-express デフォルトで使用される。豊富なミドルウェアエコシステム。本番環境での実績が豊富
platform-fastify 高パフォーマンスと低オーバーヘッド。スループット重視の用途に最適

NestJSを選ぶ理由

ExpressやFastifyを直接使用する場合と比較した、NestJSの主な利点は以下の通りです。

  • 構造化されたアーキテクチャ: チーム開発での一貫性を保証
  • TypeScriptファーストサポート: 型安全性による開発効率とコード品質の向上
  • 依存性注入(DI): テスト容易性と疎結合なコード設計
  • 豊富なデコレータ: 宣言的でわかりやすいコード記述
  • モジュールシステム: 大規模アプリケーションへのスケーラビリティ
  • エコシステム: 認証、バリデーション、ORM連携など公式モジュールが充実

Nest CLIのインストール

NestJSプロジェクトの作成には、Nest CLIを使用します。グローバルにインストールすることで、どのディレクトリからでもプロジェクトを生成できます。

1
npm install -g @nestjs/cli

インストールが完了したら、バージョンを確認します。

1
2
nest --version
# 11.x.x

Nest CLIは、プロジェクトの生成だけでなく、モジュール、コントローラ、サービスなどのコンポーネントを素早くスキャフォールドする機能を提供します。

CLIの主要コマンド

コマンド 説明
nest new <name> 新規プロジェクトを作成
nest generate module <name> モジュールを生成
nest generate controller <name> コントローラを生成
nest generate service <name> サービスを生成
nest build プロジェクトをビルド
nest start アプリケーションを起動

新規プロジェクトの作成

Nest CLIを使って、最初のNestJSプロジェクトを作成します。

1
nest new my-nestjs-app

コマンドを実行すると、パッケージマネージャーの選択を求められます。

1
2
3
4
? Which package manager would you ❤️ to use? (Use arrow keys)
❯ npm
  yarn
  pnpm

ここではnpmを選択します。選択後、プロジェクトのスキャフォールディングと依存関係のインストールが自動で行われます。

インストールが完了したら、プロジェクトディレクトリに移動します。

1
cd my-nestjs-app

プロジェクト構成の理解

生成されたプロジェクトの構成を確認しましょう。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
my-nestjs-app/
├── src/
│   ├── app.controller.spec.ts
│   ├── app.controller.ts
│   ├── app.module.ts
│   ├── app.service.ts
│   └── main.ts
├── test/
│   ├── app.e2e-spec.ts
│   └── jest-e2e.json
├── .eslintrc.js
├── .prettierrc
├── nest-cli.json
├── package.json
├── tsconfig.build.json
└── tsconfig.json

主要ファイルの役割

ファイル 役割
main.ts アプリケーションのエントリーポイント。NestFactoryを使用してアプリケーションインスタンスを生成
app.module.ts アプリケーションのルートモジュール。すべてのモジュールを集約
app.controller.ts 基本的なルートを持つコントローラ。HTTPリクエストを処理
app.service.ts ビジネスロジックを持つサービス。コントローラから呼び出される
app.controller.spec.ts コントローラのユニットテスト

エントリーポイント(main.ts)の解説

main.tsはアプリケーションの起動処理を担当します。

1
2
3
4
5
6
7
8
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(process.env.PORT ?? 3000);
}
bootstrap();

このコードでは以下の処理が行われています。

  1. NestFactory.create()でアプリケーションインスタンスを生成
  2. AppModuleをルートモジュールとして指定
  3. 環境変数PORTまたはデフォルトのポート3000でHTTPサーバーを起動

ルートモジュール(app.module.ts)の解説

app.module.tsはアプリケーションの構造を定義するルートモジュールです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

@Module()デコレータは以下のプロパティを受け取ります。

プロパティ 説明
imports このモジュールで使用する他のモジュール
controllers リクエストを処理するコントローラの配列
providers 依存性注入で使用するサービスの配列
exports 他のモジュールに公開するプロバイダ

コントローラ(app.controller.ts)の解説

コントローラはHTTPリクエストを受け取り、レスポンスを返す役割を持ちます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}

このコードでは以下のポイントがあります。

  • @Controller()デコレータでコントローラクラスを定義
  • コンストラクタでAppServiceを依存性注入
  • @Get()デコレータでGETリクエストのハンドラを定義

サービス(app.service.ts)の解説

サービスはビジネスロジックをカプセル化します。

1
2
3
4
5
6
7
8
import { Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }
}

@Injectable()デコレータにより、このクラスはDIコンテナに登録され、他のクラスに注入可能になります。

アプリケーションの起動

開発サーバーを起動してアプリケーションを実行します。

1
npm run start:dev

このコマンドはファイル変更を監視し、変更があると自動で再ビルド・再起動を行います。

起動が成功すると、以下のようなログが表示されます。

1
2
3
4
5
[Nest] 12345  - 01/06/2026, 9:00:00 AM     LOG [NestFactory] Starting Nest application...
[Nest] 12345  - 01/06/2026, 9:00:00 AM     LOG [InstanceLoader] AppModule dependencies initialized +12ms
[Nest] 12345  - 01/06/2026, 9:00:00 AM     LOG [RoutesResolver] AppController {/}: +3ms
[Nest] 12345  - 01/06/2026, 9:00:00 AM     LOG [RouterExplorer] Mapped {/, GET} route +2ms
[Nest] 12345  - 01/06/2026, 9:00:00 AM     LOG [NestApplication] Nest application successfully started +2ms

動作確認

ブラウザでhttp://localhost:3000/にアクセスするか、ターミナルで以下のコマンドを実行します。

1
curl http://localhost:3000/

期待される結果は以下の通りです。

1
Hello World!

この結果が表示されれば、NestJSアプリケーションが正常に動作しています。

開発に役立つNPMスクリプト

package.jsonには、開発を効率化するスクリプトがあらかじめ定義されています。

スクリプト 説明
npm run start アプリケーションを起動
npm run start:dev 開発モードで起動(ホットリロード有効)
npm run start:debug デバッグモードで起動
npm run start:prod 本番用ビルドを起動
npm run build TypeScriptをコンパイル
npm run test ユニットテストを実行
npm run test:e2e E2Eテストを実行
npm run lint ESLintでコードを検証

SWCビルダーによる高速ビルド

NestJSは、SWC(Speedy Web Compiler)を使用することで、ビルド速度を大幅に向上できます。以下のコマンドでSWCビルダーを使用した開発サーバーを起動できます。

1
npm run start -- -b swc

SWCはRustで実装されたコンパイラで、TypeScriptのトランスパイルを高速に処理します。大規模プロジェクトでは特に効果を発揮します。

NestJSアーキテクチャの全体像

NestJSアプリケーションの構造を図式化すると以下のようになります。

graph LR
    subgraph "Client"
        A[HTTP Request]
    end
    
    subgraph "NestJS Application"
        B[Middleware] --> C[Guard]
        C --> D[Interceptor - Before]
        D --> E[Pipe]
        E --> F[Controller]
        F --> G[Service]
        G --> H[Repository]
        F --> I[Interceptor - After]
        I --> J[Exception Filter]
    end
    
    subgraph "External"
        H --> K[Database]
    end
    
    A --> B
    J --> L[HTTP Response]

リクエストは以下の順序で処理されます。

  1. Middleware: リクエストの前処理(ロギング、CORS設定など)
  2. Guard: 認可チェック(アクセス権限の確認)
  3. Interceptor(前処理): リクエスト変換、ロギングなど
  4. Pipe: バリデーションとデータ変換
  5. Controller: ルートハンドラの実行
  6. Service: ビジネスロジックの実行
  7. Interceptor(後処理): レスポンス変換
  8. Exception Filter: エラーハンドリング

この処理パイプラインにより、関心事を明確に分離し、保守性の高いコードを実現できます。

まとめ

本記事では、NestJSの基本概念と開発環境のセットアップ方法を学びました。

  • NestJSは、TypeScriptベースのプログレッシブなNode.jsフレームワーク
  • Angularにインスパイアされたアーキテクチャで、構造化されたコードベースを提供
  • Express/Fastifyを内部で活用しつつ、プラットフォーム抽象化を実現
  • Nest CLIで効率的なプロジェクト生成とコンポーネントスキャフォールディングが可能
  • Module、Controller、Provider(Service)がNestJSの基本構成要素

次のステップとして、Module、Controller、Providerの詳細な使い方や、依存性注入(DI)の仕組みを学ぶことで、より実践的なNestJSアプリケーションを構築できるようになります。

参考リンク