DB까지 연결하고 Entity로 모델도 만들었으니 이제 남은건 API를 이용한 데이터 전송을 해보도록하자
이미 Entity까지 다 만들었지만, 새로 알게 된 nest의 generate옵션중에 resource를 사용하면 한번에 entity와 DTO, 컨트롤러, 모듈, 서비스 파일 즉 CRUD를 위한 기본적인 모든파일을 만들어 준다는 것을 알게 되었다.
이제는 한가지의 항목에 대한 API를 새로 추가할 때는 resource를 이용하도록 하자
nest g res cats
이제 간단하게 API를 만들어보자. Cat 고양이의 이름 나이 종 에 대해서 데이터베이스에 CRUD를 진행해 보도록 하겠다.
일단 엔티티에 들어가는 컬럼들의 데이터를 받기 위해서 CatDTO를 만들어준다.
//src/cats/dto/cat.dto.ts
export class CatDTO {
name: string;
age: number;
breed: string;
}
이제 이 고양이의 정보를 주고 받을 API를 만들어줄 것이다.
일반적으로 사용되는 전체조회, 개별조회, 생성, 수정, 삭제의 API코드이다.
//src/cats/cats.controller.ts
import {
Body,
Controller,
Delete,
Get,
Param,
Post,
Put,
} from '@nestjs/common';
import { CatsService } from './cats.service';
import { CatDTO } from './dto/cat.dto';
@Controller('cats') // 기본으로 들어오는 경로 ex)localhost:3000/cats
export class CatsController {
constructor(private catsService: CatsService) {}
@Get()
findAll(): Promise<CatDTO[]> {
return this.catsService.findAll();
}
@Get(':id') // 경로 path 추가 ex)localhost:3000/cats/1
findOne(@Param('id') id: number): Promise<CatDTO> {
return this.catsService.findOne(id);
}
@Post()
create(@Body() cat: CatDTO) {
this.catsService.create(cat);
}
@Put(':id')
update(@Param('id') id: number, @Body() cat: CatDTO) {
this.catsService.update(id, cat);
}
@Delete(':id')
remove(@Param('id') id: number) {
return this.catsService.remove(id);
}
}
//src/cats/cats.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Cat } from './entity/cats.entity';
import { Repository } from 'typeorm';
import { CatDTO } from './dto/cat.dto';
@Injectable()
export class CatsService {
constructor(
@InjectRepository(Cat)
private catsRepository: Repository<Cat>,
) {}
findAll(): Promise<CatDTO[]> {
return this.catsRepository.find();
}
findOne(id: number): Promise<CatDTO> {
return this.catsRepository.findOne({ where: { id } });
}
async create(cat: CatDTO): Promise<void> {
await this.catsRepository.save(cat);
}
async update(id: number, cat: CatDTO): Promise<void> {
const existedCat = await this.findOne(id);
if (existedCat)
await this.catsRepository.update(id, {
name: cat.name,
age: cat.age,
breed: cat.breed,
});
}
async remove(id: number): Promise<void> {
await this.catsRepository.delete(id);
}
}
@InjectRepository 데코레이터를 사용하면 NestJS가 해당 Repository 객체를 생성하고 주입해준다.
@InjectRepository는 TypeORM을 NestJS에서 사용할 때, Repository 객체를 주입하는 데 사용되는 데코레이터로, TypeORM에서 제공하는 Repository 객체는 데이터베이스와 상호작용하기 위한 메소드(find, save, update 등등)를 가지고 있다.