1. DI & IoC
- DI(Dependency Injection, ์์กด์ฑ ์ฃผ์ )
- IoC(Inversion of Control, ์ ์ด์ ์ญ์ )
1.1 ์ผ๋ฐ ์ธ์คํด์คํ
1class B {}23class A {4const b = B();5}
ํด๋์ค B๋ฅผ ํด๋์ค A์์ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค.
- ํด๋์ค A์์ ํด๋์ค B์ ์ธ์คํด์ค๋ฅผ ๋งค๋ฒ ์๋ก ์์ฑํ๊ฒ ๋๋ค.
- ์ด ๊ตฌ์กฐ๋ A ํด๋์ค๋ฅผ ์ธ์คํด์คํํ ๋๋ง๋ค,
- A์์๋ค B์ธ์คํด์ค๋ฅผ ๋งค๋ฒ ์๋ก ๋ง๋ค๊ฒ ๋๋ค.
1.2 Dependency Injection
1class B {}23class A {4constructor(instance: B)5}
๊ธฐ์กด์๋ ํด๋์ค B๋ฅผ ํด๋์ค A ์์์ ์์ฑํ๋๋ฐ, DI๋ ๋ค๋ฆ ๋๋ค.
- ์ด๋์ ๊ฐ ํด๋์ค B๋ฅผ ์์ฑํ๊ณ , ํด๋์ค A์์๋ ์์ฑํ์ง ์๋๋ค.
- ์ด๋์ ๊ฐ ๋ง๋ ํด๋์ค B๋ constructor์ ์
๋ ฅํ๋ค.
- ์ด๋ฅผ
์ฃผ์ (Injection)์ด๋ผ๊ณ ํ๋ค.
- ์ด๋ฅผ
- ํด๋์ค A๋ ํด๋์ค B๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์, ํด๋์คB์ ์์กดํ๊ณ ์๋ค.
- ์ด๋ฅผ
Dependency(์์กด)์ด๋ผ ํ๋ค.
- ์ด๋ฅผ
- ์ฆ, ์์กดํ๊ณ ์๋ ๊ฐ์ ์ฃผ์
ํด์ฃผ๋ ๊ฒ์
DI๋ผ๊ณ ํ๋ค.
1.3 Inversion of Control
1class B {}23class A {4constructor(instance: B)5}67class C {8constructor(instance: B)9}
IoC๋ DI์ ์ผ์ข ์ด๋ผ ๋ณผ ์ ์๋ค.
- Control(์ ์ด)์ Inversion(์ญ์ ), ์ญ์ ์ด
- ์๋๋ A, C๊ฐ B์ ์์กด์ฑ์ด ์์ผ๋ฉด, ํด๋์ค B๋ฅผ ์ง์ ์์ฑํด์ ์ฃผ์ ํ๋ค.
- ๋ฐ๋ฉด์ IoC๋ A, C๊ฐ ์์กดํ๋ B์ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ์์ฑ, ์ญ์ , ์ฃผ์ ํด์ฃผ๋ ๊ณผ์ ์ ํ๋ ์์ํฌ๊ฐ ์ง์ ๋ด๋นํ๊ฒ ๋๋ค.
1.4 IoC & DI

NestJS๋ ์คํ๊ณผ ๋์์ IoC ์ปจํ ์ด๋๊ฐ ์์ฑ๋๋ค.
- A, C๋ฅผ ๋ณด๋ฉด, B์ ์์กด์ฑ์ ์ฃผ์ ๋ฐ๊ณ ์๋ค.
- NestJS IoC ์ปจํ
์ด๋๊ฐ ํด๋์ค B๋ฅผ ์ด์ฉํด,
new B()๋ฅผ ์ฌ์ฉํด B ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค
- A, C ํด๋์ค ์์์ B ์ธ์คํด์ค๊ฐ ํ์ํ๋ฉด,
- IoC ์ปจํ ์ด๋๊ฐ ์๋์ผ๋ก ์์ฑ๋ B ์ธ์คํด์ค๋ฅผ ์ฃผ์ ํ๋ค.
- ๊ทธ๋์ ๊ฐ๋ฐ์๋ ์์กด์ฑ์ ์์ฑ๊ณผ ํ๊ธฐ๋ฅผ ์ ๊ฒฝ์ธ ํ์๊ฐ ์๋ค.
NestJS์์ A, C๋ controller, B๋ service๋ผ๊ณ ๋ณผ ์ ์๊ฒ ์ฃ .
์ฃผ์
์ ๋ฐ์ ์ ์๋ ํด๋์ค(service)๋ฅผ NestJS์์๋ Provider๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- Provider๋ฅผ constructor ์์ ์ ์ํด์ฃผ๋ฉด IoC ์ปจํ ์ด๋๊ฐ ์๋์ผ๋ก
- ์ด Provider๋ค์ ์ฐพ์์ ์ธ์คํด์คํํ๋ค์
- ์ด ์ธ์คํด์ค๋ฅผ ํ์ํ๋ ๊ณณ์ ์ฃผ์ ํด์ค๋ค.
2. Module, Provider, IoC
contoller ํ์ผ์์ service์ ๊ธฐ๋ฅ์ ์ด๋ป๊ฒ ์ธ ์ ์์๊น? module ํ์ผ์ ๋ณด๋ฉด 2๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ๊ณ ์๋ค.
1import { Module } from '@nestjs/common'2import { PostsService } from './posts.service'3import { PostsController } from './posts.controller'45@Module({6/** ์ปจํธ๋กค๋ฌ๋ก ์ฌ์ฉํ ํ์ผ์ ์ ์7* ์ปจํธ๋กค๋ฌ๋ก ์ฌ์ฉํ ํ์ผ์ ์ ์,8* ํน์ path๋ก ์์ฒญ์ด ์ค๋ฉด ๋ผ์ฐํ ํด์ฃผ๋ ์ญํ9*10* PostsController() ===> ์ธ์คํด์คํ11* PostsController ===> ํด๋์ค ๊ทธ ์์ฒด12* ์ ๋ณด๋ฉด, ์ธ์คํด์ค๊ฐ ์๋ ํด๋์ค ๊ทธ ์์ฒด๋ฅผ ๋ฃ์๋ค13* ์๋ํ๋ฉด IoC ์ปจํ ์ด๋๊ฐ ์ธ์คํด์ค๋ฅผ ์์ฑ, ์์ , ์ญ์ ํ๊ธธ ๋ฐ๋ผ๋๊น14*/15controllers: [PostsController],16/** ์ปจํธ๋กค๋ฌ์์ ์ฃผ์ ํ ๊ฐ๋ค์ providers ์์ ์ ์17* PostsService๋ ์ด๋ค ์ญํ ์ ํ๋์ง์ ๋ํ ์ ์๋ค.18* ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๋ก์ง์ ์์ฑํ๋ ํด๋์ค === Service19*20* ์๋น์ค๊ฐ ์๋๋๋ผ๋ ์ฃผ์ ํด์ผํ ํด๋์ค๋ค์21* ์ ๋ถ providers ์์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.22*23* porviders ์์ ๋ฑ๋ก๋ ๋ชจ๋ ํด๋์ค๋ค์ ์ธ์คํด์คํ ์์ด24* IoC ์ปจํ ์ด๋๊ฐ ์์กดํ๋ฉด์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.25*/26providers: [PostsService],27})28export class PostsModule {}
๋ํ service์๋ค๊ฐ @Injectable()์ ํด์ค์ผ์ง๋ง Provider๋ก ์ฌ์ฉํ ์ ์๋ค.
1// posts.service.ts2import { Injectable, NotFoundException } from '@nestjs/common'34// ์๋ต56// @Injectable() ์ด๋ ธํ ์ด์ ์ด ์์ด์ผ์ง๋ง, Provider๋ก ์ฌ์ฉ ๊ฐ๋ฅ7@Injectable()8export class PostsService {9// ์๋ต10}
3. AppModule, main.ts
1import { Module } from '@nestjs/common'2import { AppController } from './app.controller'3import { AppService } from './app.service'4import { PostsModule } from './posts/posts.module'56@Module({7imports: [PostsModule],8controllers: [AppController],9providers: [AppService],10})11export class AppModule {}
NestJS๋ ์ฌ๋ฌ๊ฐ์ง ๋ชจ๋๋ค์ ๋ ๊ณ ์ฒ๋ผ ์กฐํฉํด์ ํฉ์น๋ค. ๊ทธ๋ ์ง๋ง CLI๋ก ์์ฑํ๋ ์๋์ผ๋ก AppModule์ ์ถ๊ฐ๋๋ค. ์ฝ๋์ฒ๋ผ ๋ค๋ฅธ ๋ชจ๋์ ์๋ก ๋ง๋ค๋ฉด imports ๋ถ๋ถ์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
3.1 main.ts
NestJS๊ฐ app ๋ชจ๋์ด ์กด์ฌํ๋ ๊ฑธ ์๋ ๊ฑด main.ts๋ฅผ ๋ณด๋ฉด ์ ์ ์๋ค.
1import { NestFactory } from '@nestjs/core'2import { AppModule } from './app.module'34async function bootstrap() {5const app = await NestFactory.create(AppModule)6await app.listen(3000)7}8bootstrap()
์ฝ๋๋ฅผ ๋ณด๋ฉด, NestFactory์ App ๋ชจ๋์ ๋ฃ์ด์ฃผ๊ณ ์๊ณ , 3000๋ฒ ํฌํธ์์ ์คํํ๊ณ ์๋ค.