개요
이전에 Controller작성방법에 대해서 알아봤는데 이번엔 Provider를 통해 NestJS 에게 클래스의 제어권을 넘기고 Service라는 클래스를 통해 역할을 분리해본다
서비스 생성
$ nest g service cats
해당 명령어 사용시 /cats 라는 폴더 밑에 cats.service.ts 라는 파일을 생성할 것이다
import { Injectable } from '@nestjs/common'; @Injectable() export class CatsService { } // ============================================================================= // nest reposotory 에서 가져옴 export function Injectable(options?: InjectableOptions): ClassDecorator { return (target: object) => { Reflect.defineMetadata(INJECTABLE_WATERMARK, true, target); Reflect.defineMetadata(SCOPE_OPTIONS_METADATA, options, target); }; }
@Injectable 이라는 decorator는 nest의 컨테이너에게 관리대상인 클래스라는걸 알리는 구문이다
메타데이터 등록을 하는 구문밖에 없네?
module.ts의 providers 배열에 CatsService를 넣어주면 해당 구분 사용시 별도의 new CatsService() 와 같이 따로 호출할 필요없이 CatsController의 생성자에서 파라미터로 받아 사용할 수 있게된다
해당 서비스에 CRUD 기능을 추가해보자
우선 인터페이스 생성하고
// cats/interface/cat.interface.ts export interface cat { name: string; age: number; breed: string; }
CRUD 관련 클래스 메소드 생성
// cats/cats.controller.ts import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common'; import { CreateCatDto } from './dto/create-cat.dto'; import { UpdateCatDto } from './dto/update-cat.dto'; import { CatsService } from './cats.service'; @Controller('cats') export class CatsController { constructor(private readonly catsService: CatsService) {} @Post() create(@Body() createCatDto: CreateCatDto) { return this.catsService.create(createCatDto); } @Get() findAll() { return this.catsService.findAll(); } @Get(':id') findOne(@Param('id') id: string) { return this.catsService.findOne(+id); } @Patch(':id') update(@Param('id') id: string, @Body() updateCatDto: UpdateCatDto) { return this.catsService.update(+id, updateCatDto); } @Delete(':id') remove(@Param('id') id: string) { return this.catsService.remove(+id); } }