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
67
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
280
Amplify gen2 を使うと何が嬉しいか?
musan
0
20
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
240
FastAPIでAOP的ロギングはありなのか?
musan
1
110
Other Decks in Programming
See All in Programming
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
140
AHC070解法紹介
eijirou
0
120
How I Stole PSI from Android Studio - DroidKaigi2026
worker8
0
130
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
970
AGENTS.md Is Not Enough:Build Skills, Don't Download Them
lx_t
0
120
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
kaseken
2
160
自分的「カンファレンスの楽しみ方」
syumai
0
200
個人開発基盤をまるごとCloudflareに引っ越して爆速で総合的体験を向上させた話
tinykitten
0
190
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
360
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
180
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
280
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
570
Featured
See All Featured
Building an army of robots
kneath
307
46k
Mobile First: as difficult as doing things right
swwweet
225
10k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
Building the Perfect Custom Keyboard
takai
2
870
The SEO identity crisis: Don't let AI make you average
varn
0
560
Google's AI Overviews - The New Search
badams
0
1.6k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
Ruling the World: When Life Gets Gamed
codingconduct
0
330
Color Theory Basics | Prateek | Gurzu
gurzu
1
470
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でやり取りすると決めておけば、ステートレスに なりやすいかも (アーキテクチャとは、「ある選択肢を選びやすくする」「あ る⾏動が不快になるようにする」という性質を環境に与えるも の)