// app.controller.ts
@Controller()
export class AppController {
constructor(private appService: AppService) {}
}
앱 컨트롤러 클래스 내부의 생성자(constructor)를 살펴보면 AppService가 매개변수로 전달된 것을 확인 할 수있는데 이 부분이 바로 의존성을 주입하는 작업이다.
의존성 주입은 제어의 역전(Incersion of Control) 기술 중 하나이다.
쉽게 말해 서비스 파일 내의 함수를 컨트롤러에서 사용할 수 있도록 하는 것이다.
서비스 파일을 봐보자.
// app.service.ts
@Injectable()
export class AppService {}
@Injectable 데코레이터가 작성 되어있는 모습을 볼 수 있다.
이는 의존성 주입의 대상임을 알려주는 것이다.
주입할 프로바이더에 @Injectable 데코레이터를 붙이면 Nest IoC 컨테이너가 해당 프로바이더를 관리할 수 있다.
프로바이더와 서비스의 개념이 헷갈릴 수 있는데 controller, provider, service의 개념을 쉽게 말하면 다음과 같다.
공급자가 제품을 제공해줘야 소비자가 사용할 수 있듯,
Provider에 Service를 등록해주어야 Controller에서 주입받아 사용이 가능하다.
서비스를 프로바이더에 등록했다면 이제 컨트롤러에서 의존성 주입 후 사용하기만 하면 된다.
// app.controller.ts
constructor(private appService: AppService) {}
의존성을 주입했기 때문에 appService의 타입만 지정했을 뿐인데도 따로 import 작업 없이 AppService의 메서드를 호출할 수 있는걸 볼 수있다.
위의 방법과 달리 클래스 필드의 형태로도 의존성 주입이 가능하다.
필드 위에 @Inject 데코레이터를 사용하면 된다.
@Inject()
private appService: AppService
하지만 Nest 공식문서에 따르면 생성자를 이용해 의존성 주입하는 것을 권장하고 있다고 한다.