[Nest JS] Factory Providers

minidoo·2021년 10월 9일
1

NestJS

목록 보기
6/8
post-thumbnail

useFactory 구문을 사용하면 동적으로 프로바이더를 만들 수 있다. 실제 프로바이더는 팩토리 함수에서 반환된 값으로 제공된다.

팩토리 함수는 인수를 받을 수 있으며, inject 속성은 팩토리 함수에 인수로 전달할 프로바이더 배열을 허용한다. Nest는 inject 목록의 인스턴스를 동일한 순서로 팩토리 함수에 대한 인수로 전달한다.

다음은 AWS S3 연결 프로바이더를 만들어 글로벌로 사용한 예시이다.

// src/global/providers/S3Provider.ts

import { S3 } from 'aws-sdk';

const S3Provider = {
  provide: 'S3_CONNECTION',
  useFactory: async (): Promise<any> => {
    const s3 = new S3({
      accessKeyId: 'accessKeyId',
      secretAccessKey: 'secretAccessKey',
    });
    return s3;
  },
};

export const S3Providers = [S3Provider];
// src/global/global.module.ts

import { Module, Global } from '@nestjs/common';
import { S3Provider } from './providers/S3Provider';

@Global()
@Module({
  providers: [...S3Provider],
  exports: [...S3Provider],
})

export class GlobalModule {}
  • provide : 프로바이더를 사용할 이름을 정한다.
  • useFactory : 프로바이더가 동작할 방식을 결정한다.

위에서 만든 프로바이더는 전체 서비스에서 공통적으로 사용되기 때문에 글로벌 모듈로 만들어 준다. 해당 모듈 외부에서 S3_CONNECTION을 주입해야 하는 경우 exports 해준다.

// src/order/order.service.ts

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

@Injectable()
export class OrderService {
  constructor(
  @Inject('S3_CONNECTION') private readonly S3,
  ) {}

  async getOrder() {
    const params = { ... };
    const result = await this.S3.putObject(params).promise();
    return result;
  }
}

프로바이더를 사용하려면 이 프로바이더가 필요한 서비스 생성자 내에서 @Inject 데코레이터만 호출하면 된다.

참고사이트

Custom providers | 네스트JS 한국어 매뉴얼
Creating Dynamic NestJS Providers/Service

0개의 댓글