[NestJS] Providers

참고

  1. NestJS Providers
  2. 프로바이더 - 쉽게 풀어 쓴 Nest.js

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;
}

links

social