【いそんせいちゅうにゅう】

依存性注入(DI) とは?

最終更新:
💡 「自分で作る」のではなく「外からもらう」
📌 このページのポイント
依存性注入(Dependency Injection) DIなし(直接依存) OrderService new MySQLDB() で直接生成 直接依存 MySQLDB × DBを変更するとコード修正が必要 × テストでモック化しにくい × 密結合 DIあり(インターフェース経由) OrderService IDatabase(interface) MySQLDB PostgreSQL 外部から注入 ○ 実装を差し替えるだけでDB変更可能 ○ テスト時にモックを注入できる ○ 疎結合
依存性注入のイメージ(直接依存 vs インターフェース経由)
ひよこ ひよこ
DIって何がうれしいの?
ペンギン先生 ペンギン先生
例えばUserServiceがDatabaseを直接newすると、テスト時に本物のDBが必要になる。DIでDatabaseを外から渡す設計にすれば、テスト時はモックDBを渡せる。依存先を差し替えられるから、テストが簡単になり、部品の交換も柔軟になるんだよ
ひよこ ひよこ
コンストラクタ注入って何?
ペンギン先生 ペンギン先生
クラスのコンストラクタ引数に依存オブジェクトを受け取る方式だよ。「class UserService { constructor(private db: Database) {} }」のように書く。セッター注入やフィールド注入もあるけど、コンストラクタ注入が最も安全で推奨されているよ
ひよこ ひよこ
DIコンテナって何?
ペンギン先生 ペンギン先生
依存オブジェクトの生成と注入を自動的にやってくれるフレームワークだよ。Spring(Java)、NestJS(TypeScript)、.NET のDIコンテナが代表的。設定(アノテーションや設定ファイル)に基づいて、必要なオブジェクトを自動的にnewして渡してくれるんだ
ひよこ ひよこ
DIを使いすぎると?
ペンギン先生 ペンギン先生
全てをDIにすると設定が複雑になって、コードの流れが追いにくくなることがあるよ。「この注入はどこで設定されてるの?」と迷子になる。ユーティリティ関数や値オブジェクトなど、交換する必要がないものまでDIにする必要はない。テストで差し替えたい部分に絞って適用するのが現実的だね
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「依存性注入」って出てきたら「依存するオブジェクトを外部から渡す設計パターン」と思えればだいたいOK!
📖 おまけ:英語の意味
「Dependency Injection」 = 依存性注入
💬 Dependency(依存するもの)をInjection(注入する)。外から渡してもらう仕組みだよ
← 用語集にもどる