내일배움캠프 TIL (230217): nestjs custom pipe 사용하기

Jiumn·2023년 2월 17일
0

nestjs 유효성 검사

built-in pipes 사용하기

  1. 빈 값이 들어왔을 때
    app.useGlobalpipe(ValidationPipes)
    Dto class 내 속성에 @IsNotEmpty() 데코레이터 사용

  2. 존재하지 않는 게시물일 때
    error 인스턴스 생성
    throw new NotFoundException('에러 메시지')

Custom Pipe 생성

예를 들어 게시물의 상태(status)를 변경할 때 유효성을 체크하는 커스텀 파이프를 만든다고 하자.
(게시물의 상태는 공개(public) 또는 비공개(private) 2가지 타입만 있어야 한다. 만약 다른 타입으로 변경하려고 하면 에러를 발생시키는 파이프를 만드는 것이 목표다.)

  1. custom pipe class 만들기
  • pipes 폴더 생성 ▶ custom pipe class 파일 생성
  • class를 만들 때는 nestjs에 기본 구현되어 있는 PipeTransform 인터페이스를 상속 받아야 한다.
export class boardStatusValidationPipe implements PipeTransfrom {}

해당 클래스 안에는 transform() 메서드를 반드시 포함해야 한다.
transform() 메서드 안에는 value, metadata 두 인자가 들어간다.
value는 처리될 값, 즉 입력 받은 status 값이다.
metadata는 이 값에 대한 메타 데이터가 들어 있다.

transform() 메서드를 통해서 입력 받은 값 value를 검사하고 만약 올바르지 않은 값이면 BadRequestException 에러를 던진다.
올바른 값이면 그 값을 return 하면 된다.

여기서 중요한 것은 올바르지 않은 값을 검사하는 함수를 추가해주는 것이다. 먼저 statusOptions라는 배열에 publicprivate을 담아놓는다. 그리고 만약 받은 값이 없다면 indexOf() 배열 메서드를 사용했을 때 -1 값이 반환될 것이다. (반대로 하면 값이 있다면 -1 값이 아닌 0이나 1 값이 반환될 것이다.)

이 로직을 코드로 작성하면 다음과 같다.

import { BadRequestException, Injectable, PipeTransform } from '@nestjs/common';
import { BoardStatus } from 'src/board/board.model';

@Injectable()
export class BoardStatusValidationPipe implements PipeTransform {
  readonly StatusOptions = [BoardStatus.PRIVATE, BoardStatus.PUBLIC];

  transform(value) {
    value = value.toUpperCase();
    if (!this.isStatusValidate(value)) {
      throw new BadRequestException(`${value} isn't in the status options`);
    }
    return value;
  }

  private isStatusValidate(status) {
    const indexOfStatus = this.StatusOptions.indexOf(status);
    return indexOfStatus !== -1;
  }
}

마지막으로 controller에서 status를 받는 부분 @Body의 인자에 해당 파이프(BoardStatusValidationPipe)를 심어주면 된다.

@Put('/:id/status')
  updateBoardStatus(
    @Param('id') id: string,
    @Body('status', BoardStatusValidationPipe) status: BoardStatus,
  ) {
    return this.boardsService.updateBoardStatus(id, status);
  }
profile
Back-End Wep Developer. 꾸준함이 능력이다. Node.js, React.js를 주로 다룹니다.

0개의 댓글