티스토리 뷰

Nest

#4 Nest 커스텀 프로바이더

림디 2024. 12. 5. 12:00

커스텀 프로바이더를 사용하는 경우 3가지 경우

  1. Nest 프레임워크가 만들어주는 인스턴스 또는 캐시된 인스턴스 대신 인스턴스를 직접 생성하려는 경우
  2. 여러 클래스가 의존관계에 있고, 이미 존재하는 클래스를 사용하려고 하는 경우
  3. 테스트를 위해 프로바이더를 재정의 하려는 경우 

Value providers: useValue
useValue 구문은 상수 값을 주입하거나, 외부 라이브러리를 Nest 컨테이너에 넣거나, 실제 구현을 모의 객체로 대체하는 데 유용합니다.

import { SomethingService } from './something.service';

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

@Module({
  imports: [SomthingModule],
  providers: [
    {
      provide: SomethingService,
      useValue: mockSomethingService,
    },
  ],
})
export class AppModule {}

 

문자열, 심벌 ,Abstract, Function 인터페이스를 토큰으로 사용하기 

import { connection } from './connection';

@Module({
  providers: [
    {
      provide: 'CONNECTION',
      useValue: connection,
    },
  ],
})
export class AppModule {}


@Injectable()
export class SomethingRepository {
  constructor(@Inject('CONNECTION') connection: Connection) {}
}

 

Class providers: useClass

useClass 구문을 사용하면 토큰이 해결해야 하는 클래스를 동적으로 결정할 수 있습니다.

configService를 상속 받는 DevelopmentConfigService, ProductionConfigServic를 환경 변수에 따라 동적으로 생성

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

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

 

Factory providers: useFactory

인스턴스를 동적으로 구성할때 사용합니다. 

타입이 함수로 정의 되어있어 원하는 인수와 리턴 타입으로 함수를 구성 가능합니다.

함수를 수행할 때, 다른 프로바이더가 필요하다면 주입 할 수 있습니다.

주입 시 inject[ ] 안에 선언해야 합니다.

const connectionProvider = {
  provide: 'CONNECTION',
  useFactory: (optionsProvider: MyOptionsProvider, optionalProvider?: string) => {
    const options = optionsProvider.get();
    return new DatabaseConnection(options);
  },
  inject: [MyOptionsProvider, { token: 'SomeOptionalProvider', optional: true }],
  //       \______________/             \__________________/
  //        This provider                The provider with this token
  //        is mandatory.                can resolve to `undefined`.
};

@Module({
  providers: [
    connectionProvider,
    MyOptionsProvider, // class-based provider
    // { provide: 'SomeOptionalProvider', useValue: 'anything' },
  ],
})
export class AppModule {}

Alias providers: useExisting

useExisting을 사용하면 기존 프로바이더에 대한 별칭을 만들 수 있습니다.

이렇게 하면 동일한 프로바이더에 접근하는 두 가지 방법을 생성 됩니다.

@Injectable()
class LoggerService {
  /* implementation details */
}

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

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


@Controller()
export class AppController {
	constructor(@Inject('AliasedLoggerService') private readonly serviceAlias:any){}
}

 

프로바이더 내보내기

1.토큰

const connectionFactory = {
  provide: 'CONNECTION',
  useFactory: (optionsProvider: OptionsProvider) => {
    const options = optionsProvider.get();
    return new DatabaseConnection(options);
  },
  inject: [OptionsProvider],
};

@Module({
  providers: [connectionFactory],
  exports: ['CONNECTION'],
})
export class AppModule {}

 

2.객체

const connectionFactory = {
  provide: 'CONNECTION',
  useFactory: (optionsProvider: OptionsProvider) => {
    const options = optionsProvider.get();
    return new DatabaseConnection(options);
  },
  inject: [OptionsProvider],
};

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

 

출처:

'Nest' 카테고리의 다른 글

#6 Nest Gateway  (0) 2024.12.06
#5 Nest 모듈 (Module)  (1) 2024.12.05
#3 Nest 프로바이더(Provider)  (0) 2024.12.04
#2 Nest Controller  (1) 2024.12.04
#1 Nest 와 데코레이터(Decorator)  (0) 2024.12.04
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함