Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
DI(依存性注入)
Search
村上優稀
October 21, 2025
Programming
83
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
3
300
Amplify gen2 を使うと何が嬉しいか?
musan
0
28
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
270
FastAPIでAOP的ロギングはありなのか?
musan
1
120
Other Decks in Programming
See All in Programming
dotNET_vulnclicker_intro.pdf
deka_morita
0
150
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.7k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
420
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
3
1.3k
自作Discord音声botをLambda MicroVMsに移行した話 / Migrating My Discord Voice Bot to Lambda MicroVMs
akihisaikeda
0
150
Web Framework Benchmark Battle 2026, Any%
a_matsuda
3
3k
[2026-10-14](C)Re:ゼロから始める異世界生活〜始まりの終わりと終わりの始まり〜
tosite
0
160
気持ちぃ〜角丸 Squircle
ryu1013
0
340
GraphQL の onError と Nullability のこれから
quramy
0
180
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
7k
Simple Storage Service(S3) is not simple
iwatsukayura
0
330
Vue Fes Japan の “作る側”に関わってみて
naokihaba
1
190
Featured
See All Featured
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Fireside Chat
paigeccino
43
4.1k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
59k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
580
The Mindset for Success: Future Career Progression
greggifford
PRO
0
550
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
490
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
77k
Building Adaptive Systems
keathley
44
3.3k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
540
Darren the Foodie - Storyboard
khoart
PRO
4
4k
Skip the Path - Find Your Career Trail
mkilby
1
260
Ethics towards AI in product and experience design
skipperchong
2
440
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でやり取りすると決めておけば、ステートレスに なりやすいかも (アーキテクチャとは、「ある選択肢を選びやすくする」「あ る⾏動が不快になるようにする」という性質を環境に与えるも の)