단순히 @Injectable() 데코레이터가 있으면 Provider라고 하나보다.
정확히는 services, repositories, factories, helpers, and so on. '서비스, 레포지토리, 팩토리, 헬퍼 등을 포함하는 모든 것' 이라고 볼 수 있겠다.
controller는 http 요청을 받고 보내는 역할만 하고, 복잡한 작업은 provider에 책임을 준다.
복잡한 작업이라 함은 데이터베이스를 조작한다거나 다른 서버에 또 데이터를 요청한다거나...
이렇게 작성하는 것이 더 좋다고 판단한 듯
스프링에서 하는 방법을 조금 봐놔서 크게 어렵진 않을 것 같다.
이전의 Controller까지 만든 것에서 Service를 만들었다.
nest g s Cats로 Service를 만들어보자.
그리고 아래의 공식 예제를 써보자.
// cats.service.ts
import { Injectable } from '@nestjs/common';
import { Cat } from './interface/cat.interface';
@Injectable()
export class CatsService {
private readonly cats: Cat[] = [];
create(cat: Cat) {
this.cats.push(cat);
}
findAll(): Cat[] {
return this.cats;
}
}
// ./interfaces/cat.interface.ts
export interface Cat {
name: string;
age: number;
breed: string;
}
여기서 추가된거라고는 @Injecteable() 데코레이터밖에 없다.
이 데코레이터를 사용한 클래스는 Nest IoC container에 의해 관리될 수 있다고 한다.
Interface는 단순히 '데이터가 어떻게 될 것이다'를 알려주는 용도로 추측된다.
이제 controller를 수정해보자.
공식 예제를 사용하였다.
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();
}
}
과정을 요약하면
req → controller → service → database(서비스에 존재) → service return → controller return → res 이 된다.