참고
Provider 란
NestJS의 기본개념 services, repositories, factories, helpers 등 많은 Nest 클래스들을 provider로 취급될 수 있다. 이들 provider들은 의존성을 주입할 수 있다(DI, Dependency Injection). 이들의 객체 생성과 사용, 제거 등은 Nest IoC container가 관리한다(IoC, Inversion of Control).
사용법
기본 사용법
@Injectable()
데코레이터를 사용
import { Injectable } from '@nestjs/common';
import { CreateTreeDto } from './dto/create-tree.dto';
@Injectable()
export class TreesService {
async create(createTreeDto: CreateTreeDto) {
return createTreeDto;
}
}
위에서 만든 서비스를 컨트롤러에 주입하여 사용할 수 있다.
@Controller('trees')
export class TreesController {
constructor(private readonly treesService: TreesService) {}
@Post()
async create(@Body() createTreeDto: CreateTreeDto) {
return await this.treesService.create(createTreeDto);
}
}
Optional providers
@Optional()
데코레이터를 사용
반드시 resolve 되어야 할 dependency가 아닌 경우 사용할 수 있다.
예를 들어 configuration 객체에 의존관계가 있는데 주입되지 않을 경우 디폴트 값을 사용한다고 한다면 아래와 같이 구현할 수 있다.
import { Injectable, Optional, Inject } from '@nestjs/common';
@Injectable()
export class HttpService<T> {
constructor(@Optional() @Inject('HTTP_OPTIONS') private httpClient: T) {}
}
Property-based injection
@Inject
데코레이터를 사용
위에서 사용한 것은 생성자를 통해서 provider가 주입된 것으로 constructor-based injection 이다.
만약 최상위 클래스가 하나 이상의 provider에 의존관계가 있다면 하위 클래스에서 super를 통해 넘겨 받기 보다
아래 예시와 같이 property 레벨에서 주입받아 사용할 수 있다.
import { Injectable, Inject } from '@nestjs/common';
@Injectable()
export class HttpService<T> {
@Inject('HTTP_OPTIONS')
private readonly httpClient: T;
}