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