NestJS | docs | Provider
https://docs.nestjs.com/providers
Providers
Providers는 Nest에서 기본적인 개념이다. 공식 문서에 의하면, services, repositories, factories, helpers 등 Nest의 많은 기본 클래스들은 공급자로 여겨지고, 여기서 가장 중요한 아이디어가 바로 의존성 주입(Dependency Injection)이라고 한다.
//app.controller.ts
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
}
AppController를 소비자라고 생각해보자. 그리고 appService를 제품이라고 생각해보자. AppController는 Provider에 의해 AppService라는 제품을 받아서 this.appService.getHello(); 라는 방식으로 사용하고 있다. 그럼 이 AppService라는 제품은 어디에서 공급하고 있는걸까?
// app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
app.module.ts 파일에서 보면 @Module 데코레이터 내에 providers라는 속성이 보이고, 이 안에서 공급할 모듈을 주입할 수 있다. 즉 AppService는 providers에 등록하면서 공급자로 여겨지는 것이고, 소비자인 AppController가 이 모듈을 사용할 수 있게 되는 것이다. 이게 기본적인 Nest의 의존성 주입 패턴이라고 한다.
공식 문서의 그림에서도 볼 수 있듯이, Controller는 각 모듈들을 주입 받아서 사용하는 패턴임을 확인할 수 있다.
Services
services는 데이터를 저장하거나 검색하는 역할을 하고 Controller에 의해 사용된다. 즉 컨트롤러에서는 HTTP 요청을 처리하는 일을 하고, 그 외의 CRUD 작업들은 서비스에서 이루어지도록 코드를 작성하는 것이 좋다.
객체 지향 프로그래밍의 핵심 목표는 실생활과 유사하게 코드를 작성한다는 것이다. 이런 측면에서 봤을 때 의존성 주입 패턴은 명료하고, NestJS는 이를 잘 표현한다고 한다.