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
第3回NestJS勉強会 Dependency Injectionについて
Search
takuya.mashimo (眞下卓也)
June 25, 2022
Programming
0
280
第3回NestJS勉強会 Dependency Injectionについて
DIとDIコンテナがNestJSでどのように役に立っているか、説明しました!
takuya.mashimo (眞下卓也)
June 25, 2022
Tweet
Share
More Decks by takuya.mashimo (眞下卓也)
See All by takuya.mashimo (眞下卓也)
第一回NestJS勉強会
sigcode1
0
150
Other Decks in Programming
See All in Programming
0→1と1→10の狭間で Javaという技術選定を振り返る/Reflecting on the Decision to Choose Java Between Scaling from 0 to 1 and 1 to 10
jaguar_imo
2
380
Rubyでたのしむクリエイティブコーディング/Enjoy Creative coding with Ruby
chobishiba
1
180
はてなにおける CSS Modules、及び CSS Modules に足りないもの / CSS Modules in Hatena, and CSS Modules missing parts
mizdra
7
920
AWS CDKコントリビュートTIPS / aws-cdk-contribution-tips
gotok365
2
120
検証も兼ねて個人開発でHonoとかと向き合った話
hanetsuki
0
860
冗長なエラーログを削減し、スタックトレースを手に入れる / Reducing Verbose Error Logs and Obtaining Stack Traces
upamune
0
510
TYPO3 v13 – The road to LTS: What's new and new APIs
luisasofie_xoxo
0
200
From Spring Boot 2 to Spring Boot 3 with Java 22 and Jakarta EE
ivargrimstad
0
1.2k
Ruby GitHub Packages
bkuhlmann
0
630
Blue/Greenデプロイの導入による 運用フローの改善
kudoas
1
370
スクラムガイドのスプリントレトロスペクティブを改めて読みかえしてみた / Re-reading the Sprint Retrospective Section in the Scrum Guide
mackey0225
3
410
ADRを一年運用してみた/adr_after_a_year
hanhan1978
7
2.4k
Featured
See All Featured
Adopting Sorbet at Scale
ufuk
68
8.6k
Typedesign – Prime Four
hannesfritz
36
2.1k
Statistics for Hackers
jakevdp
789
220k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
221
21k
Raft: Consensus for Rubyists
vanstee
132
6.3k
Being A Developer After 40
akosma
57
580k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
352
28k
Optimizing for Happiness
mojombo
370
69k
Designing the Hi-DPI Web
ddemaree
276
33k
Embracing the Ebb and Flow
colly
80
4.1k
The Mythical Team-Month
searls
216
42k
How GitHub Uses GitHub to Build GitHub
holman
468
290k
Transcript
第3回NestJS勉強会 Dependency Injectionを理解する 2022/06/23 taku@webエンジニア(@sig-code1)
Dependency Injectionとは?
「依存している部分を、外から注入する」 一言で表すと...
用語 ・依存性の注入 ・Dependency Injection ・DI(Dependency Injectionの略語)
NestJSではどの部分?
依存性を注入をしている部分
@InjectableデコレータをUserServiceClassにつ けることで、providersに登録可能 providers・・・Moduleの要素の1つ(他にImports,controllers,exportsなどがある)
NestJSのDIシステムによって、 UserServiceクラスがインスタンス化がされるように + Module内で使用できるようになる Module内・・・今回でいうとUsersControllerなどのUsersModuleに書かれたClassたちのこと
providersに登録したClassをconstructor引数に指定 →UsersServiceClassをインスタンス化 →UsersController内で使用できるように
NestJSを使わず、 DIを用いていないサンプルコード こんな感じに☞
user.ts database.ts index.ts コンソールに Save taku!を 出力するだけのコード メソッド内でクラスをインスタンス化
これを、DI対応をすると
user.ts database.ts index.ts コンソールに Save taku!を 出力するだけのコード 外からクラスを渡すように
あんまり、変化が... • Userクラスの外部からDatabaseクラスを渡すだけで、DIの 対応は完了 • 依存対象となるDatabaseクラス(dependency)を外部から 渡す・注入(injection)している ☞Dependency Injectionと呼ばれる
DIのメリットは 単体テストがしやすくなること なぜか DI対応前のコードの場合、Userクラスの単体テストをしようとすると... ☞Databaseクラスに依存しているため、テスト失敗時の原因の切り分けが難しい ☞それはもはや、単体テストと呼べるのか??
user.ts database.ts index.ts コンソールに Save taku!を 出力するだけのコード メソッド内でクラスをインスタンス化
まだ、問題はある
user.ts database.ts index.ts コンソールに Save taku!を 出力するだけのコード 外からクラスを渡すように
• Userクラスをインスタンス化する時 ☞Databaseクラスをインスタンス化して渡さないといけない ☞つまり、UserクラスはDatabaseクラスに依存しているこ とになる
これを解決するには?
• Userクラスをインスタンス化する時に、外からDatabaseク ラスをインスタンス化せずに動かしたい もう一度、言語化
user.ts database.ts index.ts コンソールに Save taku!を 出力するだけのコード ここの部分
• アプリ側では、求めるクラスを与えられば動くコードを書きた い • オブジェクト(クラス)に何が外から渡されるかを管理したく ない 抽象度を上げると...
DIコンテナ
• DIコンテナはDIをサポートするツールである • オブジェクト(クラス)やオブジェクトの生成方法を保持す る箱のようなもの • アプリケーション(実装者側)がDIコンテナから必要なクラ スを取り出すだけにする ざっくり
DI コンテナ Application (コード側) UserServiceクラスがほしい
DI コンテナ Application (コード側) 処理中.....
DI コンテナ Application (コード側) UserService インスタンスが生成されたかを知らず、 UserServiceを利用することができる
• DIコンテナは登録と取得 • 好きなオブジェクト(クラス)を登録 • 登録したオブジェクトを取得 簡単に言語化
NestJSをもう一度みてみる
None
None
まとめてみると
• DIはデザインパターン ☞依存している部分を外から渡す • DIコンテナ ☞DIを強く後押しするツール • デコレーターとModuleファイルを使用して登録 • 使いたいオブジェクト(Class)で取得
テストコードを見てみよう https://github.com/sig-code/nest-study
ご清聴ありがとうございました🙇