Dependency Injection (feat:Nest)
๊ฐ์
Nest.js Framework(Spring, Angular ๋ฑ)๋ฅผ ์ฌ์ฉํด์ ์์
์ ํ๋ค๋ณด๋ฉด, Dependency Injection, Inversion of Controll ๊ฐ์ ๋จ์ด๋ค์ด ์์ฃผ๋ณด์ธ๋ค. ํ์๋ ์ด ๋จ์ด๋ค์ด ์ด๋ค ์๋ฏธ๋ฅผ ๊ฐ๋์ง ๋ชจ๋ฅด๊ณ ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ ๊ณ์ ๊ตฌ๋ ํ
์ด์ ๋น ์ง๋ ๊ธฐ๋ถ์ด๋ผ ์ด์ ๋ํด ๋ง์ ํฌ์คํธ/ ๋น๋์ค๋ฅผ ๋ณด๊ณ ์ ๋ฆฌํ์๋ค.
ํฌ์คํธ๋ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ๊ตฌ์ฑ๋๋ค. Nest.js์์ DI๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง๋ฅผ Nest.js ๋ฉ์ธํ
์ด๋์ ์ค๋ช
์ ํ ๋๋ก ์์ฑํ์๋ค. ๊ทธ๋ฆฌ๊ณ DI๊ฐ ๊ฐ๋
์ ์ผ๋ก ๋ฌด์์ธ์ง, ์ ์ฌ์ฉํด์ผ ํ๋์ง, ์ด๋ป๊ฒ ์ฌ์ฉํ๋ฉด ๋๋์ง์ ๋ํด ํฌ์คํธํ๋ ค๊ณ ํ๋ค.
Nest.js ์์ DI๋?
Nest๋ฅผ ์ฌ์ฉํ๋ค๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฃผ ๋ณผ ์ ์๋ค.
|
|
์ฌ๊ธฐ์ @Injectable()
์ด๋ ๋ฐ์ฝ๋ ์ดํฐ์ ์ฃผ๋ชฉํด์ผ ํ๋ค. ์ด ๋ฐ์ฝ๋ ์ดํฐ๋ typescript compiler์ ์ํด ๋ค์๊ณผ ๊ฐ์ metadata๋ฅผ ์์ฑํ๋ค.
|
|
์ฌ๊ธฐ์ "design:paramtypes"
๋ typescript metadata key์ด๊ณ , ์ด๋ฅผ ์ด์ฉํด CatsService๊ฐ ์ฐธ์กฐํ๋ class ๋ฐฐ์ด์ ์ป์ ์ ์๋ค.
์ด๋ฌํ metadata๋ Metadata Reflection API๋ฅผ ์ด์ฉํด ๋ค์์ ํจ์๋ฅผ ์คํํ์ฌ
|
|
ํ์ฌ CatsService๊ฐ ์ฐธ์กฐํ๋ ์์กด์ฑ์ด ์ด๋ค ํ์ ์ธ์ง ์ ์ ์๊ฒ ๋๋ค. ๋ค์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด `INJECTOR` ๋ ํด๋น ํ์ ์ ํด๋นํ๋ Instance๋ฅผ `DI Controller`์๊ฒ ์์ฒญํ๊ณ `DI Controller`๋ ํด๋น ํ์ ์ ๋ง๋ ์ ์ ํ intance๋ฅผ `INJECTOR`์๊ฒ ๋ฐํํด์ค๋ค. `INJECTOR`๋ ํด๋น ๊ฐ์ ์ฌ์ฉํด์ ์๋ก์ด provider๋ฅผ ์ธ์คํด์คํํจ์ผ๋ก์จ DI๋ฅผ ์ํํ๋ค.
Injector in Nestjs
Nest.js์์๋ module ๋ ๋ฒจ์ Injector
๋ง์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ , Nest.js์์๋ ๋ชจ๋์ ๊ตฌ์กฐ๋ฅผ ๋ชจ๋์ ์ ์ ์ผ๋ก ํ๋ ๊ทธ๋ํ๋ก ํํํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ๋ชจ๋์ Injector๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
Nest.js์์ ๊ฐ ๋ชจ๋์ด singleton
์ฒ๋ผ ๋ณด์ด๊ธฐ๋ ํ์ง๋ง, ์ฌ์ค์ Dynamic module
์ด ์๊ธฐ ๋๋ฌธ์ ๊ผญ ๊ทธ๋ ์ง๋ ์๋๋ค. ๋ชจ๋์ด ์ด๋ฌํ ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ณ ๋ด๋ถ์ ์ผ๋ก๋ exports
/ imports
/ declarations
์ ํตํด ๋์ ์ผ๋ก ํ์ฅํ ์ ์๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ด์ ๋ ๋ชจ๋์ isolation์ ์ํจ์ด๋ค.
A module์์ B module์ B service๋ฅผ ์ด์ฉํ๊ณ ์ถ๋ค๋ฉด, A module์ B moudle์ importํ๊ณ , B Service๋ฅผ B module์์ exports
์์ผ์ผ ํ๋ค. ๋ง์ฝ B service๋ฅผ exports
ํ์ง ์์ผ๋ฉด, ์บก์ํ๋์ด ๋ค๋ฅธ ๋ชจ๋์์ ์ ๊ทผํ ์ ์๊ฒ ๋๋ค. ์ด ์ ์ด Nest.js ์ DI์์ ์ค์ํ ์ ์ด๋ค.
Nest๋ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์์กด์ฑ์ ํด๊ฒฐํฉ๋๋ค.
- ํ์ฌ module ๋ด์์ provider๋ฅผ ์ฐพ๋๋ค.
- import๋ module์ ํ์ธํ๋ค.
- ๋ง์ฝ ๋ชจ๋์ด exports ๋์ง ์๋๋ค๋ฉด ํด๋น provider๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ด๋ ๊ฒ Nest.JS๋ ๊ฒฉ๋ฆฌ์์ค์ ์์ด์ ์๊ฒฉํ๊ฒ ์์ฉํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น provider๋ฅผ ์ฐพ์ ๋ ๊ทธ๋ํ ์์์ ํ์ฌ ENQUIRER์ ๊ฐ๊น์ด provider๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.
Global Scope
๋ง์ฝ core module์ @Global()
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํด์ ์ ์ญ์ผ๋ก ์ค์ ํ๋ฉด, ๋ค๋ฅธ module์์ ๊ฐ์์ ๊ฐ์ ์ ํด๋น ๋ชจ๋์ ์ฐ๊ฒฐํ๊ฒ ๋๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด, core module์ ์ฌ์ฉํ๊ณ ์ ํ ๋, ๋ช
์์ ์ผ๋ก imports ํ์ง ์๊ณ ํด๋น ๋ชจ๋์ ์ฌ์ฉํ ์ ์๋ค.
DI๋?
์์ ๋ชจ๋์ ํ์ ๋ชจ๋์ ์์กดํด์ ์๋๋ค.
์ถ์ํ๋ ๊ฒ์ ๊ตฌ์ฒดํ๋ ๊ฒ์ ์์กดํ๋ฉด ์๋๋ค, ๊ตฌ์ฒดํ๋ ๊ฒ์ ์ถ์ํ๋ ๊ฒ์ ์์กดํ๋ค.
์ DI๋ฅผ ์ฌ์ฉํด์ผํ๊ณ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง?
button class๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์. button class๋ ๋๋ฅธ๋ค
๋ผ๋ ๊ธฐ๋ฅ์ ์ํํ๋ค. ๋๋ฅด๋ ํ์๋ก on/off ๋๋ ๊ฐ์ฒด๋ฅผ ์๊ฐํด๋ณด์. Lamp / Carkey ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์. ์ด ๋ button์ ๋๋ ์ ๋ lamp๋ ๋ถ์ด ์ผ์ง๋ค / ๋ถ์ด ๊บผ์ง๋ค์ ๊ธฐ๋ฅ์ ์ํํด์ผ ํ๊ณ , Carkey๋ ๋ฌธ์ ์ด๋ค/ ๋ฌธ์ ๋ซ๋๋ค์ ๊ธฐ๋ฅ์ ์ํํด์ผ ํ๋ค.
๊ทผ๋ฐ button class๊ฐ lamp์๋ ์์กดํ๊ณ , Carkey์๋ ์์กดํ๊ฒ ๋๋ค๋ฉด, lamp, carkey ๊ฐ์ฒด๋ฅผ button์ ์์ฑํด์ผํ๊ณ , ๊ฐ๊ฐ์ ๊ธฐ๋ฅ๋ ๋ฐ๋ก ๊ตฌํํด์ผ ํ๋ค. ์ด๋ ๊ฒ ๋๋ฉด button class๋ ์ฌ์ฌ์ฉํจ์ ๊ฐ์น๋ฅผ ์์คํ๊ฒ ๋๋ค.
์ด๋ ๊ฒ ํ์ง ์์ผ๋ ค๋ฉด, button์ ์ถ์ํ ์์ผ์ผ ํ๋ค. ButtonInterface๋ผ๊ณ ํ๋ค๋ฉด, button์ buttonInterface๋ฅผ ์์กดํ๊ณ , lamp, carkey ๋ buttonInterface๋ฅผ ์์กดํ๋ค.
๊ทธ๋ฆฌ๊ณ lamp, carkey ํด๋์ค์์, ButtonInterface์ ๋ฉ์๋์ธ ๋๋ฅธ๋ค
์ ๊ธฐ๋ฅ์ ๊ฐ๊ฐ ์ ์ํ๊ฒ ๋๋ฉด, Button class๋ ์ด์ lamp, carkey๋ฅผ ์์กดํ์ง ์์๋ ๋๋ค.
๋ค๋ฅธ ๋ชฉ์ ์ผ๋ก๋, ํ ์คํธ์ ์ฉ์ดํ๋จ ์ฅ์ ๋ ์๋ค. mock ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฑฐ๋, 3rd ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋๋ค.
๋ง๋ฌด๋ฆฌ
๋ด ํฌ์คํธ์ ํ๋ฆฐ์ ์ด ์๋ค๋ฉด, ํ์์ ๋ถ์กฑํจ ๋๋ฌธ์ด๋ค. ์์ด๋ก ๋ ์ ํ๋ธ๋ฅผ ๋ณด๊ณ 30๋ถ์ง๋ฆฌ ์์์ ๋ชจ๋ ํด์ํด์ ์ฝ๊ณ , ๋ช๋ช ํ๊ตญ์ด ๋ธ๋ก๊ทธ ์ค ๋ฏฟ์ ๋งํ๊ณณ์ ์ฐธ๊ณ ํด์ ์ ์ผ๋ ค๊ณ ๋
ธ๋ ฅํ๋ค.