NestJS - Custom Provider

바그다드·2023년 11월 29일
0

오늘 프로젝트를 진행하면서 커스텀 Guards를 만들 일이 있었는데, 커스텀 Guards를 적용시키는 방법에 대해 알아보다가 커스텀 프로바이더 지정 형식을 처음 보았다.
그때는 각 속성이 어떤 의미인지 잘 몰라서 다른 방식으로 적용했지만, 커스텀 프로바이더를 알아두면 많은 도움이 될 것 같다.

일반적인 경우 nestjs에서는 프로바이더를 모듈에 등록하는 방식을 사용한다.
그런데 다음 세 가지 경우 커스텀 프로바이더를 사용하는데,

  1. 인스턴스를 직접 생성하고 싶을 때
  2. 여러 클래스가 의존관계에 있을 때 기존의 클래스를 재사용할 경우
  3. 테스트를 위해 모의 프로바이더를 생성할 경우

이처럼 커스텀 프로바이더를 사용하는 방법은 다음과 같다

1. 밸류 프로바이더

const value = {}

@Module({
	imports: [],
    provider: [
    	{
        	provide: valueService, // provide할 타입
            useValue: value // 실제로 주입할 타입
        }
    ]
})

// userValue: T // 변수

value라는 값을 valueService라는 타입으로 사용한다는 것을 뜻한다.

2. 클래스 프로바이더

const authProvider={
	provide: AuthService,
    useClass:
    	process.env.Auth_TYPE === "jwt"
        ? JwtService
        : SessionService
}

@Module({
	imports: [],
    provider: [AuthService]
})

// userClass: Type<T> // 클래스

여기서는 userClass속성을 사용한다. 따라서 scope를 지정할 수 있다.
상속관계를 통해 동적으로 자식 클래스를 주입할 수 있다.

3. 팩토리 프로바이더

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 // 함수
profile
꾸준히 하자!

0개의 댓글