Nestjs
Providers
KimJye
2019. 11. 5. 10:44
provider는 단순히 @Injectable()데코레이터로 주석이 달린 클래스.
controller는 HTTP 요청을 처리하고 더 복잡한 작업을 provider에게 위임해야한다.
SOLID
원칙을 따르는 것이 좋다 .
Service
cats.service.ts
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;
}
}
Interface Cat
export interface Cat {
name: string;
age: number;
breed: string;
}
controller 수정
cats.controller.ts
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 readonly catsService: CatsService) {}
@Post()
async create(@Body() createCatDto: CreateCatDto) {
this.catsService.create(createCatDto);
}
@Get()
async findAll(): Promise<Cat[]> {
return this.catsService.findAll();
}
}
속성 기반 주입
최상위 클래스가 하나 이상의 provider에 의존하는 경우, super()
생성자에서 하위 클래스를 호출하여 모든 클래스를 전달하는 것은 지양해야함. 따라서 @Inject()
속성 수준에서 데코레이터를 사용.
import { Injectable, Inject } from '@nestjs/common';
@Injectable()
export class HttpService<T> {
@Inject('HTTP_OPTIONS')
private readonly httpClient: T;
}
클래스가 다른 provider를 확장하지 않는 경우, 항상 생성자 기반 주입을 사용.