Nestjs#2 Providers

Nestjs 공식문서를 번역한 내용입니다. 일부 오역, 의미 전달이 모호한 부분이 있을 수 있습니다.

ProviderNest의 근본 개념입니다. 많은 Nest 클래스들이 Provider로 취급됩니다. -- services, repositores, factories, helpers. 프로바이더의 메인 아이디어는 그것이 의존성 주입(Dependency Inject)이 될 수 있다는 것입니다. 이 말은 각 객체들이 서로 다양한 관계들을 맺을 수 있고, 1이 객체(인스턴스)들을 연결하는 기능이 대부분은 Nest의 통제하에 있을 수 있다는 의미가 됩니다.

이 전 챕터에서 CatsController를 만들어 보았습니다. 컨트롤러는 HTTP 요청을 핸들링 해야하고 더 복잡한 일들은 프로바이이더에게 위임해야합니다. 프로바이더들은 moduleproviders라고 선언되어 있는 plain 자바스크립트 클래스입니다.

Nest는 종속성을 설계하고 구성하는 것을 조금 더 Object Oriented하게 할 수 있으므로 SOLID 원칙을 따를 것을 권고 합니다.

Services

CatsService를 만들어 봅시다. 이 서비스는 데이터 저장과 검색을 담당하고 CatsController에 의해서 사용되도록 설계됩니다. 그래서 프로바이더로 정의되기에 좋은 대상입니다.

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

CLI를 통해서 서비스를 생성하려면 $ nest g service cats 명령어를 실행하면 됩니다.

CatsService는 한 개의 속성과 두 개의 메소드로 구성된 기본적인 클래스 입니다. 새로워보이는 것은 @Injectable() 데코레이터를 사용하고 있다는 것입니다. @Injectable() 데코레이터는 CatsService가 Nest IoC 컨테이너에 의해 관리될 수 있는 클래스임이 정의되는 메타데이터를 붙입니다. 그리고 이 예시는 아래와 같이 Cat interface도 사용합니다.

export interface Cat {
  name: string;
  age: number;
  breed: string;
}

이제 우리는 고양이를 검색할 수 있는 서비스 클래스를 가지고 만들었습니다. 이것을 CatsController에서 사용해 봅시다.

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

CatsService가 클래스의 생성자를 통해서 주입되었습니다. private 문법이 사용된 것을 눈여겨 보십시오. 이와 같은 코드를 이용하면 catsService를 멤버 속성으로 선언하고 초기화(initialize)하는 것을 한 곳에서 할 수 있습니다.

의존성 주입(Dependency injection)

Nest는 일반적으로 종속성 주입으로 알려진 강력한 디자인 패턴을 기반으로 만들어져 있습니다. 이 컨셉에 대해 작성되어 있는 공식 Angular 문서를 읽어보는 것이 많은 도움이 될 것 입니다.

TypeScript의 기능들덕분에 Nest에서는 종속성들이 타입에 의해서 정리되기 때문에 관리하기가 매우 쉽습니다. 아래의 예시에서 Nest는 CatsService의 인스턴스를 생성하고 반환하는 방식으로 catsService를 정리(resolve)할 것입니다.(혹은, 보통의 경우에는 싱글톤이기 때문에 어디선의 요청에 의해서 생성되었다면 이미 존재하는 인스턴스를 반환할 것입니다.) 이 종속성은 해결(resolve)되어 컨트롤러의 생성자에게 전달됩니다.(혹은 특정한 속성값에)

constructor(private catsService: CatsService) {}