NestJS API만들기

권태형·2023년 4월 13일
0

NestJS 연습

목록 보기
8/19
post-thumbnail

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 등등)를 가지고 있다.

profile
22년 12월 개발을 시작한 신입 개발자 ‘권태형’입니다. 포스팅 하나하나 내가 다시보기 위해 쓰는 것이지만, 다른 분들에게도 도움이 되었으면 좋겠습니다. 💯컬러폰트가 잘 안보이실 경우 🌙다크모드를 이용해주세요.😀 지적과 참견은 언제나 환영합니다. 많은 댓글 부탁드립니다.

0개의 댓글