NestJS Custom providers

paduck·2024년 6월 13일
0

NestJS

목록 보기
12/24
providers: [
  {
    provide: CatsService,
    useClass: CatsService,
  },
];

providers 에서 IoC 하는 과정은 실제로 구체적으로 보면 이렇게 됌

  • 토큰(service 클래스 명) 과 실제 클래스를 연결하는 것

기본 provider 의 기능 범위를 넘어서는 일에 custom provider 동작

  • Nest가 클래스를 인스턴스화하는 대신 사용자 정의 인스턴스를 만들고 싶을 때
  • 기존 클래스를 두 번째 의존성에서 재사용하고 싶을 때
  • 테스트를 위해 클래스를 모의 버전으로 재정의하고 싶을 때
  1. useValue
  • 상수 값을 주입하거나
    외부 라이브러리를 Nest 컨테이너에 넣거나
    실제 구현을 모의 객체로 교체하는 데 유용
import { CatsService } from './cats.service';

const mockCatsService = {
  /* mock implementation
  ...
  */
};

@Module({
  imports: [CatsModule],
  providers: [
    {
      provide: CatsService,
      useValue: mockCatsService,
    },
  ],
})
export class AppModule {}
  • DI 토큰으로 문자열이나 심볼을 사용하는 유연성
import { connection } from './connection';

@Module({
  providers: [
    {
      provide: 'CONNECTION',
      useValue: connection,
    },
  ],
})
export class AppModule {}
  • Inject() 데코레이터로 주입 가능
@Injectable()
export class CatsRepository {
  constructor(@Inject('CONNECTION') connection: Connection) {}
}
  1. useClass

토큰이 해결해야 하는 클래스를 동적으로 결정

const configServiceProvider = {
  provide: ConfigService,
  useClass:
    process.env.NODE_ENV === 'development'
      ? DevelopmentConfigService
      : ProductionConfigService,
};

@Module({
  providers: [configServiceProvider],
})
export class AppModule {}
  • 여기서는 다시 또 class 이름을 토큰으로 사용
  1. useFactory
    제공자를 동적으로 생성
  • 팩토리 함수에서 반환된 값에 의해 제공
const connectionProvider = {
  provide: 'CONNECTION',
  useFactory: (optionsProvider: OptionsProvider, optionalProvider?: string) => {
    const options = optionsProvider.get();
    return new DatabaseConnection(options);
  },
  inject: [OptionsProvider, { token: 'SomeOptionalProvider', optional: true }],
};

@Module({
  providers: [
    connectionProvider,
    OptionsProvider,
  ],
})
export class AppModule {}
  1. useExisting
    기존 제공자에 대한 별칭
@Injectable()
class LoggerService {
  /* implementation details */
}

const loggerAliasProvider = {
  provide: 'AliasedLoggerService',
  useExisting: LoggerService,
};

@Module({
  providers: [LoggerService, loggerAliasProvider],
})
export class AppModule {}

서비스가 아닌 모든 기능 을 provider 로 처리할 수 있음

  • 환경 구성 등
const configFactory = {
  provide: 'CONFIG',
  useFactory: () => {
    return process.env.NODE_ENV === 'development' ? devConfig : prodConfig;
  },
};

@Module({
  providers: [configFactory],
})
export class AppModule {}

export 는 token 이나 provider 객체 자체로도 가능

profile
학습 velog

0개의 댓글