Skip to content

Nest.js Overview Providers

Je-Gwan O edited this page Feb 15, 2022 · 2 revisions

Providers

services, repositories, factories, helpers 등 많은 Nest 기본 클래스들이 프로바이더로 쓰일 수 있습니다. 메인 아이디어는 "의존성 주입" 입니다. 그리고 이러한 인스턴스간 관계는 nest runtime에 위임되어 연결되죠.

컨트롤러는 http 요청을 담당하고 더 복잡한 작업은 provider에게 위임합니다. provider는 module의 provider에 선언된 클래스들입니다.

이 프로바이더들에 대한 의존이 필요한 클래스가 있으면, 이 의존성을 주입하여 사용이 가능합니다. 다만 싱글톤으로 사용하는 nest 런타임의 환경상 해당 프로바이더를 바로 가져다 쓰기 전에 module에 provider로 등록이 되어야 해당 모듈의 타 프로바이더에서 쓸 수 있습니다.

Scope

프로바이더는 앱의 라이프사이클과 동기화된 수명(scope)을 가지고 있습니다. 앱이 시작되었을 때 모든 종속성이 resolve 되어야 하므로 모든 프로바이더들이 인스턴스화 됩니다. 마찬가지로 앱이 종료되었을 때 각 프로바이더들은 파괴됩니다. 프로바이더의 수명을 request-scope으로 만들 수도 있습니다.

import { Injectable, Scope } from '@nestjs/common'

@Injectable({ scope: Scope.REQUEST })
export class CatsService {}

https://docs.nestjs.com/fundamentals/injection-scopes

Custom providers

nest에는 프로바이더들 간의 의존성 관계를 해독하는 내장 ioc(inversion of control) 컨테이너가 있습니다. 이 기능은 의존성 주입에 기반하고 있습니다. 단순한 값, 클래스, 동기 비동기의 팩토리 프로바이더들을 정의할 수도 있어 아주 강력하게 쓸 수 있습니다.

Optional providers

때때로 처리될 필요가 없는 디펜던시도 있을 거에요. 예를 들어 클래스가 configuration 객체에 의존하나 아무것도 넘겨지지 않는다면 기본값을 사용할 텐데요. 이런 경우 configuration 프로바이더가 없어도 오류가 발생하지 않기 때문에 의존성 주입은 선택사항이 됩니다.

이렇게 프로바이더가 선택적이란 것을 지시하기 위해서는 @Optional() 데코레이터를 쓰면됩니다.

import { Injectable, Optional, Inject } from '@nestjs/common'

@Injectable()
export class HttpService<T> {
  constructor(@Optional() @Inject('HTTP_OPTIONS') private httpClient: T) {}
}

여기서는 HTTP_OPTIONS 라는 커스텀 토큰을 가져오기 위해서 커스텀 프로바이더를 사용했습니다. 이전에는 constructor 베이스의 의존성 주입을 다뤘는데요. 커스텀 프로바이더와 관련된 토큰은 여기서 읽어보세요 => https://docs.nestjs.com/fundamentals/custom-providers

Property-based injection

지금까지는 컨스터럭터 기반 인젝션이었는데. 특정 경우에는 프로퍼티 베이스 인젝션이 더 유용할 것입니다. 예를들어 우리 탑레벨 클래스가 여러 프로바이더에 의존적이라면, 서브 클래스에서 super를 호출하여 이들을 전달하는 것은 귀찮을 수 있습니다. 이걸 피하기 위해서 @Inject() 데코레이터를 사용하여 프로퍼티 레벨에서 쓸 수 있습니다.(위의 예시)

Provider registration

프로바이더를 정의한다음 이 프로바이더를 컨슘하는 클래스도 만들었어요. 그리고 이 의존성 주입이 작동하려면 nest에 해당 프로바이더를 등록해주어야합니다. module에 providers 어레이에 넣어주면 됩니다.

이를 통해 컨트롤러 등이 해당 프로바이더를 사용할 수 있습니다.

Manual instantiation

지금까지 nest의 자동 의존성 처리를 다루었는데요. 어떤 경우엔 내장 의존성 주입 외에 수동적으로 인스턴스화된 프로바이더를 가져와야할 수도 있습니다. 이건 아래 두 토픽에서 다루고 있습니다.

이미 존재하는 인스턴스 또는 동적으로 인스턴스화 하는 것이라면 module reference를 사용할 수 있습니다.

https://docs.nestjs.com/fundamentals/module-ref

부트스트랩 내의 프로바이더를 가져오려면 standalone application 을 참고하세요

https://docs.nestjs.com/standalone-applications