오늘 프로젝트를 진행하면서 커스텀 Guards를 만들 일이 있었는데, 커스텀 Guards를 적용시키는 방법에 대해 알아보다가 커스텀 프로바이더 지정 형식을 처음 보았다.
그때는 각 속성이 어떤 의미인지 잘 몰라서 다른 방식으로 적용했지만, 커스텀 프로바이더를 알아두면 많은 도움이 될 것 같다.
일반적인 경우 nestjs에서는 프로바이더를 모듈에 등록하는 방식을 사용한다.
그런데 다음 세 가지 경우 커스텀 프로바이더를 사용하는데,
이처럼 커스텀 프로바이더를 사용하는 방법은 다음과 같다
const value = {}
@Module({
imports: [],
provider: [
{
provide: valueService, // provide할 타입
useValue: value // 실제로 주입할 타입
}
]
})
// userValue: T // 변수
value라는 값을 valueService라는 타입으로 사용한다는 것을 뜻한다.
const authProvider={
provide: AuthService,
useClass:
process.env.Auth_TYPE === "jwt"
? JwtService
: SessionService
}
@Module({
imports: [],
provider: [AuthService]
})
// userClass: Type<T> // 클래스
여기서는 userClass속성을 사용한다. 따라서 scope를 지정할 수 있다.
상속관계를 통해 동적으로 자식 클래스를 주입할 수 있다.
const connectionFactory = {
provide: 'CONNECTION',
// 프로바이더 내에서 다른 프로바이더를 주입받을 수 있음
useFactory: (optionsProvider: OptionsProvider) => {
const options = optionsProvider.get();
return new DatabaseConnection(options);
},
// 다른 프로바이더를 주입받을 경우 아래처럼 inject속성에 추가해줘야 함
inject: [OptionsProvider]
}
@Module({
imports: [],
provider: [connectionFactory]
})
// userClass: (...args: any[]) => T // 함수