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
22
0
Share
DI(依存性注入)
Nest.jsのDIを理解する社内勉強会用の資料
村上優稀
October 21, 2025
More Decks by 村上優稀
See All by 村上優稀
FastAPIでAOP的ロギングはありなのか?
musan
1
71
Other Decks in Programming
See All in Programming
YJITとZJITにはイカなる違いがあるのか?
nakiym
0
220
Spec Driven Development | AI Summit Vilnius
danielsogl
PRO
1
100
「Linuxサーバー構築標準教科書」を読んでみた #ツナギメオフライン.7
akase244
0
1.4k
Liberating Ruby's Parser from Lexer Hacks
ydah
2
1.3k
UIの境界線をデザインする | React Tokyo #15 メイントーク
sasagar
2
360
forteeの改修から振り返るPHPerKaigi 2026
muno92
PRO
3
290
Oxlintとeslint-plugin-react-hooks 明日から始められそう?
t6adev
0
270
ハーネスエンジニアリングとは?
kinopeee
10
5.3k
実践ハーネスエンジニアリング #MOSHTech
kajitack
7
6.5k
瑠璃の宝石に学ぶ技術の声の聴き方 / 【劇場版】アニメから得た学びを発表会2026 #エンジニアニメ
mazrean
0
250
GNU Makeの使い方 / How to use GNU Make
kaityo256
PRO
16
5.6k
Claude Code × Gemini × Ebitengine ゲーム制作素人WebエンジニアがGoでゲームを作った話
webzawa
0
140
Featured
See All Featured
Odyssey Design
rkendrick25
PRO
2
570
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
490
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
27
3.4k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.3k
Into the Great Unknown - MozCon
thekraken
41
2.4k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
260
For a Future-Friendly Web
brad_frost
183
10k
Skip the Path - Find Your Career Trail
mkilby
1
110
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
230
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.4k
Site-Speed That Sticks
csswizardry
13
1.2k
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でやり取りすると決めておけば、ステートレスに なりやすいかも (アーキテクチャとは、「ある選択肢を選びやすくする」「あ る⾏動が不快になるようにする」という性質を環境に与えるも の)