Table of contents
Nestjs 공식문서를 번역한 내용입니다. 일부 오역, 의미 전달이 모호한 부분이 있을 수 있습니다.
Provider
는 Nest
의 근본 개념입니다. 많은 Nest
클래스들이 Provider
로 취급됩니다. -- services
, repositores
, factories
, helpers
. 프로바이더의 메인 아이디어는 그것이 의존성 주입(Dependency Inject)
이 될 수 있다는 것입니다. 이 말은 각 객체들이 서로 다양한 관계들을 맺을 수 있고, 1이 객체(인스턴스)들을 연결하는 기능이 대부분은 Nest
의 통제하에 있을 수 있다는 의미가 됩니다.
이 전 챕터에서 CatsController
를 만들어 보았습니다. 컨트롤러는 HTTP 요청
을 핸들링 해야하고 더 복잡한 일들은 프로바이이더에게 위임해야합니다. 프로바이더들은 module
에 providers
라고 선언되어 있는 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) {}