NestJS는 REST API에 따라 GET, POST, PUT, DELETE 전송을 통해 CRUD 가능하다
일단 Controller를 만들어 보자.
Spring을 사용해 본 사람이라면 누구나 아주 익숙한 어노테이션을 통해 Controller
를 만들 수 있다.
// ./cat/cats.controller.ts
import { Body, Controller, Get, Post } from '@nestjs/common';
import { CatsService } from './cats.service';
import { CreateCatDto } from './dto/create-cat.dto';
import { Cat } from './interfaces/cat.interface';
@Controller('cats')
export class CatsController {
constructor(private catsService: CatsService) {} // DI(Dependency Injection)
@Post()
async create(@Body() createCatDto: CreateCatDto) {
this.catsService.create(createCatDto);
}
@Get()
async findAll(): Promise<Cat[]> {
return this.catsService.findAll();
}
}
위에 DI(의존성 주입)으로 Controller
에 Service
가 주입된 것을 볼 수 있다.
이번앤 Service
를 만들어 보겠다
// ./cats/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;
}
}
create
, findAll
기능 정의import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
@Module({
// imports: [], // 이 모듈에서 사용하기 위한 프로바이더를 가지고 있는 다른 모듈 가져오기
controllers: [CatsController],
providers: [CatsService],
exports: [CatsService], // 다른 모듈에서 해당 모듈을 사용하고자 할 때 필요
})
export class CatsModule {
// constructor(private catsService: CatsService) {} // DI(Dependency injection)
}
controllers
, providers
, exports
지정💡 단, 모듈간 순환 종속성이 발생할 수 있으므로 모듈은 프로바이더처럼 주입해서 사용할 수 없다.
최종적으로 아래와 같은 구조로 기본 모듈을 구성하면 된다.
src
├── cats
│ ├── dto
│ │ ├──create-cat.dto.ts
│ ├── interfaces
│ │ ├──cat.interface.ts
│ ├── cats.controller.ts
│ ├── cats.module.ts
│ ├── cats.service.ts
├── app.module.ts
└── main.ts