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
村上優稀
October 21, 2025
Programming
49
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
190
FastAPIでAOP的ロギングはありなのか?
musan
1
86
Other Decks in Programming
See All in Programming
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.5k
AI時代のUIはどこへ行く?その2!
yusukebe
22
7.7k
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
1k
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
150
Hatena Engineer Seminar #37「言語モデルの活用に関する研究」
slashnephy
0
430
Vite+ Unified Toolchain for the Web
naokihaba
0
400
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.7k
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
16
8.1k
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
160
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
820
スマートグラスで並列バイブコーディング
hyshu
0
270
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
150
Featured
See All Featured
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Navigating Team Friction
lara
192
16k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
280
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
450
sira's awesome portfolio website redesign presentation
elsirapls
0
290
BBQ
matthewcrist
89
10k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
760
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Being A Developer After 40
akosma
91
590k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
570
Mobile First: as difficult as doing things right
swwweet
225
10k
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でやり取りすると決めておけば、ステートレスに なりやすいかも (アーキテクチャとは、「ある選択肢を選びやすくする」「あ る⾏動が不快になるようにする」という性質を環境に与えるも の)