Services, Repositories, Factories, Helpers 등과 같은 클래스들이 포함
Nest를 사용하면 보다 OO 방식으로 종속성을 설계하고 구성할 수 있으므로 SOLID 원칙을 따르는 것이 좋습니다.
export interface Cat {
name: string;
age: number;
breed: string;
}
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명령을 실행하기만 하면 됩니다.
@Injectable()
데코레이터에 유의
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();
}
}
import { Controller, Get } from '@nestjs/common';
import { CatsService } from './cats.service';
@Controller('cats')
export class CatsController {
private readonly catsService: CatsService;
constructor(catsService: CatsService) {
this.catsService = catsService;
}
@Get()
findAll(): string {
return this.catsService.findAll();
}
}
DI 패턴을 기반으로 설계된 프레임워크
TS 형태로 종속성 관리의 이점
constructor(private catsService: CatsService) {}
Application 생명주기와 동기화된 수명 주기를 가짐
request-scoped 도 가능하다.
간혹 반드시 주입이 일어나지 않아도 되는 의존성이 있을 수 있음
@optional()
데코레이터를 통해 명시
하나 이상의 종속성 주입이 필요한 경우, 클래스 속성에 직접 의존성 주입
import { Injectable, Inject } from '@nestjs/common';
@Injectable()
export class HttpService<T> {
@Inject('HTTP_OPTIONS')
private readonly httpClient: T;
}
클래스가 다른 클래스를 확장하지 않는 경우 항상 생성자 기반 주입을 사용하는 것이 좋습니다 . 생성자는 어떤 종속성이 필요한지 명시적으로 설명하고
@Injct()
주석이 달린 클래스 속성보다 더 나은 가시성을 제공합니다.
provider 등록
import { Module } from '@nestjs/common';
import { CatsController } from './cats/cats.controller';
import { CatsService } from './cats/cats.service';
@Module({
controllers: [CatsController],
providers: [CatsService],
})
export class AppModule {}