Dependency Injection (DI) は NestJS のコア パターンであり、フレームワークが 自動的に依存関係を作成して提供する ものです。クラスがそれ自身を構築する代わりに、構築します。コンストラクタで必要なものを宣言すると、NestJS がそれを供給します — 疎結合でテスト可能なコードにつながります。
動作方法: コンストラクタで宣言する
()
{
() {}
}
Nest はコンストラクタのパラメータ型を読み込み、対応する登録済みプロバイダーを検索し、それらを作成(まだ作成されていない場合)して渡します — 依存関係グラフ全体を自動的に解決します。
1. A class is marked @Injectable() → it's a provider
2. The provider is registered in a module's `providers` array
3. Another class declares it as a constructor parameter
4. NestJS's IoC container resolves and INJECTS the instance automatically
@Module({
providers: [UsersService, DatabaseService, LoggerService], // register all providers
controllers: [UsersController],
})
export class UsersModule {}
// Nest's container now knows how to construct each and inject them where needed
✓ Loose coupling — classes depend on ABSTRACTIONS, not on constructing concrete deps
✓ Testability — inject MOCK dependencies in tests easily (no real DB needed)
✓ Reusability — one shared instance (singleton) used across the app
✓ Maintainability — change an implementation in one place (the module registration)
// in a test, provide a fake DatabaseService — no real database required
const module = await Test.createTestingModule({
providers: [
UsersService,
{ provide: DatabaseService, useValue: mockDatabase }, // inject a mock
],
}).compile();
クラスが依存関係を構築しないため、テストのためにモックにスワップできます — DI は NestJS アプリをテスト可能にします。
// use injection tokens for config/values, not just classes
constructor(@Inject("CONFIG") private config: AppConfig) {}
依存性注入は NestJS のアーキテクチャ全体を支える基礎パターンです — コントローラーがサービスを取得する方法、サービスがリポジトリと他のサービスを取得する方法、そしてアプリケーション全体がどのように配線されるかです。
それを理解することは、ほぼすべての NestJS クラスが DI に参加するため不可欠です。コンストラクタで依存関係を宣言し、フレームワークの IoC コンテナが自動的にそれらを解決して提供し、手動インスタンス化と密結合を排除します。
利点は重要で、NestJS が価値がある理由の中心です: 疎結合 (抽象化に依存)、テスト可能性 (実際の依存関係の代わりにモックを注入 — 包括的なユニットテストを簡単にする)、再利用性 (共有シングルトン)、および保守性。
DI は Angular や Spring のようなフレームワークから借用されており、それをマスターする — 依存関係を宣言、登録、注入、モック化する方法 — は、良く構造化されたテスト可能な NestJS アプリケーションを構築するために必要であり、フレームワークで深く理解すべき最も重要な概念の 1 つです。