[NestJS 공식문서 정독하기] Overview - Providers

2022. 5. 16. 18:13Web/NestJS

반응형
🔗  https://docs.nestjs.com/providers
 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Progamming), FP (Functional Programming), and FRP (Functional Reac

docs.nestjs.com

Providers

  • NestJS 클래스 대부분은 Provider임 (services, repositories, factories, helpers...)
  • Provider의 가장 큰 특징은 주입이 가능하다는 점임 (이 특징을 통해 객체를 연결하는 역할을 NestJS 런타임이 수행)
  • Contoller에 요청을 받는 핸들러를 선언하고 복잡한 로직은 Provider에게 위임해햐 함
  • NestJS는 객체지향적인 의존관계를 설정할 수 있기 때문에 SOLID 원칙을 따르는 것을 권장

Servies

import { Injectable } from '@nestjs/common';
import { Cat } from './interfaces/cat.interface';

@Injectable()
export class CatsService {
  private readonly cats: Cat[] = [];

  create(cat: Cat) {
    this.cats.push(cat);
  }

  findAll(): Cat[] {
    return this.cats;
  }
}
import { Controller, Get, Post, Body } from '@nestjs/common';
import { CreateCatDto } from './dto/create-cat.dto';
import { CatsService } from './cats.service';
import { Cat } from './interfaces/cat.interface';

@Controller('cats')
export class CatsController {
  constructor(private catsService: CatsService) {}

  @Post()
  async create(@Body() createCatDto: CreateCatDto) {
    this.catsService.create(createCatDto);
  }

  @Get()
  async findAll(): Promise<Cat[]> {
    return this.catsService.findAll();
  }
}
  • @Injectable() decorator로 NestJS의 IoC 컨테이너가 관리할 수 있는 클래스임을 선언
  • 클래스 생성자 파라미터로 주입을 받을 수 있음
  • 타입을 통해서 객체를 찾아서 DI(Dependency injection)해줌 (다른 곳에서 사용한 적이 있는 클래스일 경우 singleton 객체를 주입해줌)
  • 일반적으로는 애플리케이션이 bootstrap되면서 모든 의존 관계가 수립되어야 하므로 모든 Provider는 인스턴스화 되어야하고 애플리케이션 종료와 함께 제거되는데 Scope 설정을 통해 생명주기를 다르게 할 수도 있음

Optional providers

  • 생성자 파라미터에 @Optional() decorator를 사용해서 의존 관계가 필수가 아님을 선언할 수 있음

Property-based injection

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

@Injectable()
export class HttpService<T> {
  @Inject('HTTP_OPTIONS')
  private readonly httpClient: T;
}
  • @Inject decorator를 사용해서 생성자 파라미터로 주입받지 않고 프로퍼티로 직접 주입시킬 수 있음
  • Provider가 또 다른 Provider를 의존하는 관계에서는 super()를 호출해서 주입받은 인스턴스를 부모에게 올려보내야 하는데 이런 상황에서 사용할 수 있음
  • 특수한 경우가 아니면 생성자를 사용해서 DI하는 것을 권장

Provider registration

  • Provider 또한 Controller처럼 Module에 등록해줘야 함
반응형