- Published on
Nestjs Provider | Nestjs Docs
- Authors

- Name
- JaeHyeok CHOI
- none
Nestjs Provider

Nest의 기본 클래스들 (services, repositories, factories, helpers...) 은 providers로 처리될 수 있습니다.
Provider의 핵심 아이디어는 이 기본 요소들이 종속성으로서 주입되어 객체가 서로 다양한 관계를 형성할 수 있다는 것에 있습니다. 이러한 객체를 연결하는 작업은 Nest 런타임 시스템에서 처리됩니다.
Service
다음의 예시 코드로 Nestjs의 핵심 Provider 기능을 살펴 봅시다.
| Nest를 사용하면 객체 지향적 방식으로 종속성을 설계하고 구성할 수 있으므로 SOLID 원칙을 따르는 것이 좋습니다.
//cat.service.ts
import { Injectable } from '@nestjs/common';
@Injectable()
export class CatsService {
constructor() {
this.cats = [];
}
create(cat) {
this.cats.push(cat);
}
findAll() {
return this.cats;
}
}
//cats.controller.ts
import { Controller, Get, Post, Body, Bind, Dependencies } from '@nestjs/common';
import { CatsService } from './cats.service';
@Controller('cats')
@Dependencies(CatsService)
export class CatsController {
constructor(catsService) {
this.catsService = catsService;
}
@Post()
@Bind(Body())
async create(createCatDto) {
this.catsService.create(createCatDto);
}
@Get()
async findAll() {
return this.catsService.findAll();
}
}
이 컨트롤러 코드에서 CatsService는 클래스 생성자로 주입되었습니다. 또한, private 키워드로 생성자에 선언과 초기화를 동시에 진행할 수 있도록 지원합니다.
Scopes
Provider는 일반적으로 애플리케이션 수명 주기와 일치하는 수명 "범위"를 갖습니다. 앱이 bootstrap 될 때 각 종속성을 해결해야 하므로 모든 provider들이 인스턴스화됩니다. 마찬가지로 앱이 종료되면 모든 공급자가 삭제되나, provider를 요청 범위로 지정할 수도 있습니다. 즉, 이는 provider의 수명이 앱의 라이프 사이클이 아닌 특정 요청에 따라 결정될 수도 있다는 것 입니다.
Custom Provider
Option provider
Property-based injection
지금까지 사용한 방법들은 생성자 기반 주입이라고 하며, 생성자 메서드를 통해 Provider가 주입됩니다.
특정 상황에서는 속성 기반 주입이 유용할 수 있습니다.
예를 들어, 최상위 클래스가 하나 이상의 공급자에 의존할 경우, super() 하위 클래스까지 모든 Provider를 전달하는 것은 번거로울 수 있습니다. 이를 방지하기 위해 @Inject() 속성 수준에서 데코레이터를 직접 사용할 수 있습니다.
import { Injectable, Inject } from '@nestjs/common';
@Injectable()
export class HttpService<T> {
@Inject('HTTP_OPTIONS')
private readonly httpClient: T;
}
Provider 등록
컨트롤러(소비자)와 서비스(공급자)를 등록하기 위해서는 nest의 Module을 사용합니다.
@Module({
providers: [CatsService],
controllers: [CatsController],
})
export class CatsModule {}