[NestJS 공식문서 정독하기] Overview - Providers
2022. 5. 16. 18:13ㆍWeb/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에 등록해줘야 함
반응형