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のバージョンは以下のコマンドで確認できます。
|
|
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]
endExpress/Fastifyとの関係性
NestJSは、内部で既存のHTTPフレームワークを活用しています。デフォルトではExpressを使用しますが、Fastifyに切り替えることも可能です。
プラットフォーム抽象化
NestJSはプラットフォームに依存しない設計を採用しています。これにより、開発者は基盤となるフレームワークを意識せずにアプリケーションを構築でき、必要に応じてプラットフォームを切り替えられます。
| プラットフォーム | 特徴 |
|---|---|
| platform-express | デフォルトで使用される。豊富なミドルウェアエコシステム。本番環境での実績が豊富 |
| platform-fastify | 高パフォーマンスと低オーバーヘッド。スループット重視の用途に最適 |
NestJSを選ぶ理由
ExpressやFastifyを直接使用する場合と比較した、NestJSの主な利点は以下の通りです。
- 構造化されたアーキテクチャ: チーム開発での一貫性を保証
- TypeScriptファーストサポート: 型安全性による開発効率とコード品質の向上
- 依存性注入(DI): テスト容易性と疎結合なコード設計
- 豊富なデコレータ: 宣言的でわかりやすいコード記述
- モジュールシステム: 大規模アプリケーションへのスケーラビリティ
- エコシステム: 認証、バリデーション、ORM連携など公式モジュールが充実
Nest CLIのインストール
NestJSプロジェクトの作成には、Nest CLIを使用します。グローバルにインストールすることで、どのディレクトリからでもプロジェクトを生成できます。
|
|
インストールが完了したら、バージョンを確認します。
|
|
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プロジェクトを作成します。
|
|
コマンドを実行すると、パッケージマネージャーの選択を求められます。
|
|
ここではnpmを選択します。選択後、プロジェクトのスキャフォールディングと依存関係のインストールが自動で行われます。
インストールが完了したら、プロジェクトディレクトリに移動します。
|
|
プロジェクト構成の理解
生成されたプロジェクトの構成を確認しましょう。
|
|
主要ファイルの役割
| ファイル | 役割 |
|---|---|
main.ts |
アプリケーションのエントリーポイント。NestFactoryを使用してアプリケーションインスタンスを生成 |
app.module.ts |
アプリケーションのルートモジュール。すべてのモジュールを集約 |
app.controller.ts |
基本的なルートを持つコントローラ。HTTPリクエストを処理 |
app.service.ts |
ビジネスロジックを持つサービス。コントローラから呼び出される |
app.controller.spec.ts |
コントローラのユニットテスト |
エントリーポイント(main.ts)の解説
main.tsはアプリケーションの起動処理を担当します。
|
|
このコードでは以下の処理が行われています。
NestFactory.create()でアプリケーションインスタンスを生成AppModuleをルートモジュールとして指定- 環境変数
PORTまたはデフォルトのポート3000でHTTPサーバーを起動
ルートモジュール(app.module.ts)の解説
app.module.tsはアプリケーションの構造を定義するルートモジュールです。
|
|
@Module()デコレータは以下のプロパティを受け取ります。
| プロパティ | 説明 |
|---|---|
imports |
このモジュールで使用する他のモジュール |
controllers |
リクエストを処理するコントローラの配列 |
providers |
依存性注入で使用するサービスの配列 |
exports |
他のモジュールに公開するプロバイダ |
コントローラ(app.controller.ts)の解説
コントローラはHTTPリクエストを受け取り、レスポンスを返す役割を持ちます。
|
|
このコードでは以下のポイントがあります。
@Controller()デコレータでコントローラクラスを定義- コンストラクタで
AppServiceを依存性注入 @Get()デコレータでGETリクエストのハンドラを定義
サービス(app.service.ts)の解説
サービスはビジネスロジックをカプセル化します。
|
|
@Injectable()デコレータにより、このクラスはDIコンテナに登録され、他のクラスに注入可能になります。
アプリケーションの起動
開発サーバーを起動してアプリケーションを実行します。
|
|
このコマンドはファイル変更を監視し、変更があると自動で再ビルド・再起動を行います。
起動が成功すると、以下のようなログが表示されます。
|
|
動作確認
ブラウザでhttp://localhost:3000/にアクセスするか、ターミナルで以下のコマンドを実行します。
|
|
期待される結果は以下の通りです。
|
|
この結果が表示されれば、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ビルダーを使用した開発サーバーを起動できます。
|
|
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]リクエストは以下の順序で処理されます。
- Middleware: リクエストの前処理(ロギング、CORS設定など)
- Guard: 認可チェック(アクセス権限の確認)
- Interceptor(前処理): リクエスト変換、ロギングなど
- Pipe: バリデーションとデータ変換
- Controller: ルートハンドラの実行
- Service: ビジネスロジックの実行
- Interceptor(後処理): レスポンス変換
- Exception Filter: エラーハンドリング
この処理パイプラインにより、関心事を明確に分離し、保守性の高いコードを実現できます。
まとめ
本記事では、NestJSの基本概念と開発環境のセットアップ方法を学びました。
- NestJSは、TypeScriptベースのプログレッシブなNode.jsフレームワーク
- Angularにインスパイアされたアーキテクチャで、構造化されたコードベースを提供
- Express/Fastifyを内部で活用しつつ、プラットフォーム抽象化を実現
- Nest CLIで効率的なプロジェクト生成とコンポーネントスキャフォールディングが可能
- Module、Controller、Provider(Service)がNestJSの基本構成要素
次のステップとして、Module、Controller、Providerの詳細な使い方や、依存性注入(DI)の仕組みを学ぶことで、より実践的なNestJSアプリケーションを構築できるようになります。