๐Ÿ’‰ NestJS์˜ ์˜์กด์„ฑ ์ฃผ์ž…(DI)

์˜์กด์„ฑ ์ฃผ์ž…์˜ ๋™์ž‘ ์›๋ฆฌ์™€ ํ•„์š”์„ฑ
2026๋…„ 3์›” 23์ผ

NestJS์˜ ์˜์กด์„ฑ ์ฃผ์ž…(DI), ์™œ ํ•„์š”ํ•˜๊ณ  ์‹ค์ œ๋กœ๋Š” ์–ด๋–ป๊ฒŒ ์“ธ๊นŒ

NestJS๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ฒ˜์Œ์œผ๋กœ @Injectable()์ด๋ผ๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์„œ๋น„์Šค์—์„œ@Injectable() ์„ ์‚ฌ์šฉํ•˜๋ฉด, Controller์— ์•Œ์•„์„œ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋“ค์–ด์™€ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ณผ์ •์ด ์™œ ํ•„์š”ํ•˜๋ฉฐ, ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š” ์ง€ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ ํ•œ๋‹ค.


new๋ฅผ ์•ˆ ํ–ˆ๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์„๊นŒ?

this.boardsService๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์“ฐ๊ณ  ์žˆ์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ์–ด๋””์—์„œ๋„ new BoardsService()๋ฅผ ํ•˜์ง€ ์•Š์•˜๋‹ค. ๊ทธ๋Ÿผ ๋ˆ„๊ฐ€ ์ด ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋„ฃ์–ด์ค€ ๊ฑธ๊นŒ?

๋‹ต์€ NestJS์˜ DI ์ปจํ…Œ์ด๋„ˆ๋‹ค. ์™œ ํ•„์š”ํ•œ ์ง€ ๋А๊ปด๋ณด๊ธฐ ์œ„ํ•ด nest์˜ ๋„์›€์ด ์—†๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— ์ƒ๊ฐํ•ด๋ณด์•˜๋‹ค.

๋งŒ์•ฝ ์ง์ ‘ ํ•ด์•ผ ํ–ˆ๋‹ค๋ฉด

NestJS์˜ ๋„์›€ ์—†์ด, ์ˆœ์ˆ˜ TypeScript๋กœ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ํ•ด๋ณด์ž.

์„œ๋น„์Šค๊ฐ€ ๋Š˜์–ด๋‚ ์ˆ˜๋ก ์กฐ๋ฆฝ ์ฝ”๋“œ๋„ ๋Š˜์–ด๋‚œ๋‹ค. ์—ฌ๊ธฐ์„œ ์„ธ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.

1. ์ƒ์„ฑ ์ˆœ์„œ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค

AuthService๋Š” UsersService๊ฐ€ ๋จผ์ € ๋งŒ๋“ค์–ด์ ธ์•ผ ํ•œ๋‹ค. UsersService๋Š” ConfigService๊ฐ€ ๋จผ์ € ๋งŒ๋“ค์–ด์ ธ์•ผ ํ•œ๋‹ค. ์„œ๋น„์Šค๊ฐ€ ๋Š˜์–ด๋‚ ์ˆ˜๋ก "๋ˆ„๊ฐ€ ๋ˆ„๊ตฌ๋ณด๋‹ค ๋จผ์ € ๋งŒ๋“ค์–ด์ ธ์•ผ ํ•˜๋Š”์ง€"๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํŒŒ์•…ํ•ด์•ผ ํ•œ๋‹ค. ์ˆœ์„œ ํ•˜๋‚˜ ํ‹€๋ฆฌ๋ฉด ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

NestJS DI๋Š” ์ด ์ˆœ์„œ๋ฅผ ์ž๋™์œผ๋กœ ํ•ด์„ํ•ด์ค€๋‹ค. providers์— ๋“ฑ๋ก๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

2. ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์—†๋‹ค

์„ธ ๊ณณ ๋‹ค ๊ฐ™์€ ์„ค์ •์„ ์ฝ๋Š”๋ฐ, ConfigService๋ฅผ 3๊ฐœ๋‚˜ ๋งŒ๋“ค ์ด์œ ๊ฐ€ ์—†๋‹ค. ํ•˜๋‚˜๋งŒ ๋งŒ๋“ค์–ด์„œ ๋Œ๋ ค์“ฐ๋ฉด ๋˜๋Š”๋ฐ, ์ง์ ‘ newํ•˜๋ฉด ํ•˜๋‚˜๋งŒ ๋งŒ๋“ค๊ณ  ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

NestJS๊ฐ€ ํ•ด์ฃผ๋Š” ๊ฒƒ

์ง์ ‘ newํ•˜๊ณ , ์ˆœ์„œ ๋งž์ถ”๊ณ , ๊ณต์œ  ๊ด€๋ฆฌํ•˜๋˜ ๊ฒƒ์„ NestJS๊ฐ€ ์ „๋ถ€ ๋Œ€์‹  ํ•ด์ฃผ๋Š” ๊ฒƒ. ์ด๊ฒƒ์ด DI(์˜์กด์„ฑ ์ฃผ์ž…)๋‹ค.

๊ทธ๋Ÿผ ์ด ์˜์กด์„ฑ ์ฃผ์ž…์ด ์ •ํ™•ํžˆ ์–ด๋–ค ์›๋ฆฌ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์ž.


DI๋ž€ ๋ฌด์—‡์ผ๊นŒ ?

์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์š”์•ฝํ•˜๋ฉด ์ด๋ ‡๋‹ค.

ํ•„์š”ํ•œ ๊ฒƒ์„ ์ง์ ‘ ๋งŒ๋“ค์ง€ ๋ง๊ณ , ๋ฐ–์—์„œ ๋„ฃ์–ด์ค˜.

์ด๊ฒƒ์ด ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection)์˜ ์ „๋ถ€๋‹ค.

์ œ์–ด์˜ ์—ญ์ „(IoC)

DI๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด, ๋จผ์ € IoC(Inversion of Control)๋ผ๋Š” ์ƒ์œ„ ๊ฐœ๋…์„ ์•Œ์•„์•ผ ํ•œ๋‹ค.

์ผ๋ฐ˜์ ์ธ ์ฝ”๋“œ์—์„œ๋Š” ๋‚ด๊ฐ€ ํ๋ฆ„์„ ์ œ์–ดํ•œ๋‹ค.

IoC์—์„œ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ๋ฆ„์„ ์ œ์–ดํ•œ๋‹ค.

๋ ˆ์Šคํ† ๋ž‘ ์ฃผ๋ฐฉ์— ๋น„์œ ํ•˜๋ฉด, ์…ฐํ”„๊ฐ€ ๋งค๋ฒˆ ์‹œ์žฅ์— ๊ฐ€์„œ ์žฌ๋ฃŒ๋ฅผ ์‚ฌ์˜ค๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ์‹์ž์žฌ ์—…์ฒด๊ฐ€ ์ฃผ๋ฐฉ์œผ๋กœ ๋ฐฐ๋‹ฌํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ์…ฐํ”„๋Š” ์š”๋ฆฌ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

DI๋Š” ์ด IoC๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋‹ค. "ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•œ๋‹ค"๋Š” ๋œป์ด๋‹ค.

DI์˜ ์„ธ ๊ฐ€์ง€ ๊ตฌ์„ฑ์š”์†Œ

๊ตฌ์„ฑ์š”์†Œ์—ญํ• NestJS์—์„œ
Provider์ฃผ์ž…๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ@Injectable() ํด๋ž˜์Šค
Consumer์ฃผ์ž…๋ฐ›๋Š” ๊ฒƒController, ๋‹ค๋ฅธ Service ๋“ฑ
Container๋‘˜์„ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๊ฒƒNestJS IoC ์ปจํ…Œ์ด๋„ˆ

์ด ์„ธ ๊ฐ€์ง€๊ฐ€ ์–ด๋–ป๊ฒŒ ๋งž๋ฌผ๋ฆฌ๋Š”์ง€, NestJS์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.


NestJS๋Š” DI๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”๊ฐ€

Step 1: @Injectable()

@Injectable()์€ TypeScript์˜ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(Decorator)๋‹ค. ์ด ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ๋ถ™์œผ๋ฉด, NestJS์—๊ฒŒ **"์ด ํด๋ž˜์Šค๋Š” ์˜์กด์„ฑ์œผ๋กœ ๊ด€๋ฆฌํ•ด์ค˜"**๋ผ๊ณ  ์•Œ๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.

๋‚ด๋ถ€์ ์œผ๋กœ๋Š” reflect-metadata ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค์˜ constructor ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž… ์ •๋ณด๋ฅผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ ์ €์žฅํ•œ๋‹ค. NestJS๋Š” ๋‚˜์ค‘์— ์ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์„œ, ์–ด๋–ค ์˜์กด์„ฑ์ด ํ•„์š”ํ•œ์ง€ ํŒŒ์•…ํ•œ๋‹ค.

Step 2: @Module()

providers ๋ฐฐ์—ด์— ๋“ฑ๋ก๋œ ํด๋ž˜์Šค๋“ค์ด ์ด ๋ชจ๋“ˆ์˜ IoC ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก๋œ๋‹ค. NestJS๋Š” ์•ฑ์ด ์‹œ์ž‘๋  ๋•Œ ๋ชจ๋“  ๋ชจ๋“ˆ์„ ์ˆœํšŒํ•˜๋ฉด์„œ, ๋“ฑ๋ก๋œ provider๋“ค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค.

Step 3: Constructor Injection

Controller์˜ constructor์— BoardsService ํƒ€์ž…์„ ์„ ์–ธํ•˜๋ฉด, NestJS๊ฐ€ ์ž๋™์œผ๋กœ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐพ์•„์„œ ์ฃผ์ž…ํ•œ๋‹ค.

์ด ๊ณผ์ •์„ ํ’€์–ด๋ณด๋ฉด:

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” new๋ฅผ ํ•œ ๋ฒˆ๋„ ์“ฐ์ง€ ์•Š๊ณ ๋„ boardsService๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ์ด๋‹ค.

์˜์กด์„ฑ ํ•ด์„ ๊ณผ์ • ์‹œ๊ฐํ™”

๋งŒ์•ฝ BoardsService๊ฐ€ ๋‹ค๋ฅธ ์„œ๋น„์Šค์— ์˜์กดํ•œ๋‹ค๋ฉด?

NestJS๋Š” **์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ค์–ด์„œ, ๊ฐ€์žฅ ์•„๋ž˜๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ์ƒ์„ฑํ•œ๋‹ค.

NestJS์˜ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„
NestJS์˜ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„

์ง์ ‘ newํ•  ๋•Œ ์šฐ๋ฆฌ๊ฐ€ ์ˆ˜๋™์œผ๋กœ ํ–ˆ๋˜ ์ผ์„, NestJS ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž๋™์œผ๋กœ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.


๊ธฐ๋ณธ DI ์™ธ์— ์•Œ์•„์•ผ ํ•  ๊ฒƒ๋“ค

๊ธฐ๋ณธ DI ํŒจํ„ด์œผ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋” ๋ณต์žกํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋“ค๋„ ์žˆ๋‹ค.

Custom Provider โ€” ๊ตฌํ˜„์ฒด๋ฅผ ๊ต์ฒดํ•ด์•ผ ํ•  ๋•Œ

๊ฐ™์€ ํ† ํฐ(MAIL_SERVICE)์œผ๋กœ ์š”์ฒญํ•˜์ง€๋งŒ, ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ตฌํ˜„์ฒด๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. ํ”„๋กœ๋•์…˜์—์„œ๋Š” AWS SES๋กœ, ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ์ฝ˜์†”์— ์ถœ๋ ฅํ•˜๋Š” Mock์œผ๋กœ ๋ฐ”๋€๋‹ค.

๋˜๋Š” ์„ค์ •๊ฐ’์ฒ˜๋Ÿผ ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ๊ฐ’์„ ์ฃผ์ž…ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๋˜๋Š” ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜๋กœ ๋™์  ์ƒ์„ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ:

ํŒฉํ† ๋ฆฌ ์•ˆ์—์„œ ๋น„๋™๊ธฐ ์ดˆ๊ธฐํ™”, ์กฐ๊ฑด๋ถ€ ๋กœ์ง, ๋‹ค๋ฅธ Provider๋ฅผ ์กฐํ•ฉ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Scope โ€” ์–ธ์ œ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ• ๊นŒ

๊ธฐ๋ณธ์ ์œผ๋กœ NestJS์˜ Provider๋Š” ์‹ฑ๊ธ€ํ†ค์ด๋‹ค. ํ•œ ๋ฒˆ ๋งŒ๋“ค๊ณ  ์•ฑ์ด ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ ํ•œ๋‹ค.

Scope์‚ฌ์šฉ ์‚ฌ๋ก€
DEFAULT๋Œ€๋ถ€๋ถ„์˜ ์„œ๋น„์Šค
REQUEST์š”์ฒญ๋ณ„ ์‚ฌ์šฉ์ž ์ปจํ…์ŠคํŠธ, ๋ฉ€ํ‹ฐํ…Œ๋„Œ์‹œ
TRANSIENT๊ฐ์ž ๋…๋ฆฝ๋œ ์ƒํƒœ๊ฐ€ ํ•„์š”ํ•œ ๋กœ๊ฑฐ

์‹ฑ๊ธ€ํ†ค์ด ๊ธฐ๋ณธ์ธ ์ด์œ ๋Š” ์„ฑ๋Šฅ์ด๋‹ค. ํ•œ ๋ฒˆ ๋งŒ๋“  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณ„์† ์“ฐ๋Š” ๊ฒŒ ๋” ํšจ์œจ์ ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ผญ ํ•„์š”ํ•  ๋•Œ๋งŒ REQUEST๋‚˜ TRANSIENT๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.


ํ…Œ์ŠคํŠธ์—์„œ ๋น›๋‚˜๋Š” DI

DI์˜ ๊ฐ€์žฅ ์‹ค์šฉ์ ์ธ ์ด์ ์€ ํ…Œ์ŠคํŠธ์—์„œ ๋‚˜์˜จ๋‹ค.

DI ์—†์ด ํ…Œ์ŠคํŠธ

๋„คํŠธ์›Œํฌ๊ฐ€ ๋А๋ฆฌ๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ๋А๋ ค์ง€๊ณ , DB๊ฐ€ ๊บผ์ ธ์žˆ์œผ๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋Š” ๋“ฑ ์™ธ๋ถ€ ์˜ํ–ฅ์„ ๋งŽ์ด ๋ฐ›๊ฒŒ ๋œ๋‹ค.

DI๋กœ ํ…Œ์ŠคํŠธ

Test.createTestingModule()์€ ์‹ค์ œ NestJS ๋ชจ๋“ˆ๊ณผ ๋™์ผํ•œ DI ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค๋˜, ์›ํ•˜๋Š” Provider๋งŒ mock์œผ๋กœ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š”, Service๊ฐ€ BoardsRepository๋ฅผ ์ง์ ‘ newํ•˜์ง€ ์•Š๊ณ  ์ฃผ์ž…๋ฐ›๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

"๋ฐ–์—์„œ ๋„ฃ์–ด๋‹ฌ๋ผ"๋Š” DI์˜ ์›์น™ ๋•๋ถ„์—, ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ๋งŒ ๋ฐ”๊พธ๋ฉด ์ฝ”๋“œ ํ•œ ์ค„ ์•ˆ ๊ณ ์น˜๊ณ  ํ™˜๊ฒฝ์„ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.


๋งˆ๋ฌด๋ฆฌ

nestjs์˜ DI๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ช…ํ™•ํ•œ ๊ณผ์ •์ด ์žˆ์—ˆ๋‹ค.

  1. @Injectable()์ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ ํƒ€์ž… ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ 
  2. @Module()์˜ providers๊ฐ€ ์ปจํ…Œ์ด๋„ˆ์— ํด๋ž˜์Šค๋ฅผ ๋“ฑ๋กํ•˜๊ณ 
  3. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ค์–ด ์•„๋ž˜๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ 
  4. constructor ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋งž๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐพ์•„์„œ ์ฃผ์ž…ํ•˜๋Š”

๊ฒฐ๊ตญ DI์˜ ๋ณธ์งˆ์€ ๊ฐ„๋‹จํ•˜๋‹ค. "ํ•„์š”ํ•œ ๊ฒƒ์„ ์ง์ ‘ ๋งŒ๋“ค์ง€ ๋ง๊ณ , ๋ฐ–์—์„œ ๋„ฃ์–ด์ค˜" ์ด ํ•œ ๋ฌธ์žฅ์„ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด @Injectable()์ด๊ณ , ์‹œ์Šคํ…œ์œผ๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด IoC ์ปจํ…Œ์ด๋„ˆ๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ @Injectable()ํ•˜๋‚˜๋งŒ์œผ๋กœ ์ด๋ฃจ์–ด์กŒ๋˜ ๊ณผ์ •์„ ์ •๋ฆฌํ•ด ๋ณผ ์ˆ˜ ์žˆ์–ด ์˜๋ฏธ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค ๐Ÿ˜Ž