Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
DI(依存性注入)
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
村上優稀
October 21, 2025
Programming
47
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
DI(依存性注入)
Nest.jsのDIを理解する社内勉強会用の資料
村上優稀
October 21, 2025
More Decks by 村上優稀
See All by 村上優稀
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
140
FastAPIでAOP的ロギングはありなのか?
musan
1
82
Other Decks in Programming
See All in Programming
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
150
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
2
630
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5k
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
740
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
560
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
120
Oxcを導入して開発体験が向上した話
yug1224
4
310
AIで効率化できた業務・日常
ochtum
0
130
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
0
230
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
220
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
740
Spec Driven Development | AI Summit Lisbon
danielsogl
PRO
0
190
Featured
See All Featured
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
The Invisible Side of Design
smashingmag
302
52k
Music & Morning Musume
bryan
47
7.2k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
1.1k
Crafting Experiences
bethany
1
180
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
330
Making the Leap to Tech Lead
cromwellryan
135
9.9k
Designing Experiences People Love
moore
143
24k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
360
Transcript
DI(依存性注⼊)勉強会
⽬次 • DI(依存性注⼊)とは • Nest.jsではどう実現している? • 起動時にアノテーションの⽬印⾒てることに触れたい • Honoが軽量で良いのはLambdaとかで起動時間短くできるというのも 触れたい
• シングルトンとは? • シングルトン故の注意点は? • リクエストスコープの話とか触れたい • DTO触れたい
DI(依存性注⼊)とは DI ( Dependency Injection) 依存関係を外部から注⼊する設計⼿法 IoC(制御の反転)を実現するための⼿法
制御の反転がない時
制御の反転がない時 クラスBの設計が変わり、 クラスBがクラスCを必要と するようになると
制御の反転がある時 オブジェクト"b"を作成する責任を オブジェクト“a”から外部に移し、 その外部でオブジェクト"b"を作成して オブジェクト"a"に注⼊するようにします。
DIとは依存関係を外部から注⼊する設計⼿法 外部って具体的に何? →DIコンテナ(IoCコンテナ) ※DIコンテナ以外でDIする⽅法もあるらしいが、今⽇は触れない
Nest.jsではどうDIしてる? DIコンテナへ登録可能 ですよの⽬印 DIコンテナから 注⼊してもらってる
Nest.jsではどうDIしてる? DIコンテナ Cats Service Cats Controller 注⼊ DIコンテナへの登録 アプリケーション起動時に、 必要な依存関係を整理し、
必要なクラスのインスタンスをDIコンテナに ⽣成するというのをNest.jsはやっている。 Honoが軽量て⾔われるのは、 DIとかやってなくて、起動速い。 Lambdaのコールドスタートとか気にするなら、 Honoにメリットがある。
DIでテストしやすくなるのはなぜか? DIがないと 1. 本物のデータベースが必要になる 2. テストが不安定になる 3. テストが遅くなる
DIでテストしやすくなるのはなぜか? DIを使うことで UserServiceはDatabaseServiceのインスタ ンスをnewしなくなり、 コンストラクタで受け取るだけになった。 どのDatabaseServiceインスタンスを使う かの決定権は、UserServiceの外側 (Nest.jsのDIコンテナ)に委ねられます。
DIでテストしやすくなるのはなぜか? DIを使うことで テスト時には本物のDatabaseServiceの代わりに、 都合の良いモックを簡単に注⼊できる
このコードの問題点はなんでしょうか?
シングルトン https://docs.nestjs.com/fundamentals/injection-scopes Nest.jsの公式ドキュメントを読んでいると、シングルトンが登場する
シングルトンとは • そのクラスのインスタンスが1つしか ないことを保証する設計パターンのこと。 また、そのインスタンスのこと。 • Nest.jsではDIコンテナ管理されるク ラスはデフォルトでシングルトンとなる。 • インスタンスが⼀つしか必要ないって
時に使われることが多い。 • スレッドプール、ログ記録⽤クラス、 データベースドライバーなど
1. Aさんが/loginをリクエストします。 2. AuthServiceのloginメソッドが実⾏され、 this.currentUserにAさんの情報がセットされます。 3. Aさんの処理が終わる前(awaitの隙間など)に、 Bさんが/loginをリクエストします。 4. 同じAuthServiceインスタンスのloginメソッドが実⾏され、
this.currentUserがBさんの情報に上書きされます。 5. Aさんのリクエスト処理が再開し、 /profileにアクセスします。 6. getProfileメソッドがthis.currentUserを返しますが、 中⾝はBさんの情報になっています。 AさんがBさんの情報にアクセスできてしまい、 セキュリティインシデントになる。 アプリケーションの起動から終了まで、単⼀のインスタン スが共有されることに注意!
シングルトン故に気を付けるべきこと • DIコンテナ管理のクラスはシングルトンになるので、 リクエスト固有の情報を持たないようにする • サービスはステートレスにすべき • もしくはScope.REQUESTでリクエストごとに新しいインスタ ンスが⽣成されるようにする •
データはDTOでやり取りすると決めておけば、ステートレスに なりやすいかも (アーキテクチャとは、「ある選択肢を選びやすくする」「あ る⾏動が不快になるようにする」という性質を環境に与えるも の)