NestJS에서의 의존성 주입(Dependency Injection)

Hyein·2023년 11월 7일
0

NestJS 시작하기

목록 보기
3/4
post-thumbnail
// app.controller.ts

@Controller()
export class AppController {
  constructor(private appService: AppService) {}
}

앱 컨트롤러 클래스 내부의 생성자(constructor)를 살펴보면 AppService가 매개변수로 전달된 것을 확인 할 수있는데 이 부분이 바로 의존성을 주입하는 작업이다.

의존성 주입이란?

의존성 주입은 제어의 역전(Incersion of Control) 기술 중 하나이다.

  • 제어의 역전: 개발자가 제어할 영역을 프레임워크에 넘기는 것
  • 의존성 주입: 개발자가 필요한 외부 자원(클래스, 함수 등)을 제공받을 수 있도록 하는 것

쉽게 말해 서비스 파일 내의 함수를 컨트롤러에서 사용할 수 있도록 하는 것이다.

@Injectable

서비스 파일을 봐보자.

// app.service.ts 

@Injectable()
export class AppService {}

@Injectable 데코레이터가 작성 되어있는 모습을 볼 수 있다.

이는 의존성 주입의 대상임을 알려주는 것이다.
주입할 프로바이더에 @Injectable 데코레이터를 붙이면 Nest IoC 컨테이너가 해당 프로바이더를 관리할 수 있다.

Provider vs Service

프로바이더와 서비스의 개념이 헷갈릴 수 있는데 controller, provider, service의 개념을 쉽게 말하면 다음과 같다.

  • Service: 제품
  • Provider: 공급자
  • controller 소비자

공급자가 제품을 제공해줘야 소비자가 사용할 수 있듯,

Provider에 Service를 등록해주어야 Controller에서 주입받아 사용이 가능하다.

의존성 주입하기

서비스를 프로바이더에 등록했다면 이제 컨트롤러에서 의존성 주입 후 사용하기만 하면 된다.

생성자(Constructor)를 이용한 주입

// app.controller.ts
 
constructor(private appService: AppService) {}

의존성을 주입했기 때문에 appService의 타입만 지정했을 뿐인데도 따로 import 작업 없이 AppService의 메서드를 호출할 수 있는걸 볼 수있다.

프로퍼티 스타일 주입

위의 방법과 달리 클래스 필드의 형태로도 의존성 주입이 가능하다.

필드 위에 @Inject 데코레이터를 사용하면 된다.

@Inject()
private appService: AppService

하지만 Nest 공식문서에 따르면 생성자를 이용해 의존성 주입하는 것을 권장하고 있다고 한다.

0개의 댓글

관련 채용 정보