본문 바로가기

Development/TIL

Nest.js (feat.Pipe)

Nest.js의 Pipe란?

클라이언트의 요청 데이터를 변환하거나 유효성을 검사하는데 사용되는 중간 처리기이다.

Pipe는 메서드 실행 전에 데이터를 사전 처리하고, 유효성 검사 및 변환 작업을 수행하여 요청의

유효성을 보장하고 일관된 데이터 형식으로 변환할 수 있다.

 

Pipe의 주요 목적

  1. 데이터 변환
    들어오는 요청 데이터를 원하는 형식으로 변환한다.
    예를들어 문자열을 숫자로 변환하거나, 문자열의 공백을 제거하는 등의 작업을 수행할 수 있다.

  2. 데이터 유효성 검사
    들어오는 요청 데이터의 유효성을 검사한다.
    예를 들어 데이터의 길이, 형식, 범위, 필수 여부 등을 확인하여 올바른 데이터인지 확인할 수 있다.

  3. 예외 처리
    유효성 검사를 통과하지 못한 경우 Pipe는 예외를 throw하여 해당 요청을 처리하는 핸들러로 예외를 전달한다.
    이를 통해 예외 처리를 중앙에서 관리하고 일관된 방식으로 예외를 처리할 수 있다.

 

Nest.js에서 Pipe는 빌트인 파이프와 커스텀 파이프의 두 종류가 있다.

빌트인 파이프는 Nest.js에서 기본적으로 제공하는 것이고 커스텀 파이프는 사용자가 정의하는 것이다.

자주 사용되는 빌트인 파이프의 종류는 다음과 같다.

  • ValidationPipe
    들어오는 요청 데이터의 유효성을 검사하는데 사용되는 Pipe이다.
    class-validator와 class-transformer 라이브러리와 함께 사용하여 객체 유효성 검사를 간편하게 처리할 수 있다.

  • ParsIntPipe
    문자열을 숫자로 변환하는 Pipe이다.
    들어오는 요청 파라미터나 쿼리 문자열을 숫자로 자동 변환한다.

  • DefaultValuePipe
    들어오는 요청 파라미터나 쿼리에서 값을 가져오지 못한 경우 기본값을 제공하는 Pipe이다.

  • TransformPipe
    요청 데이터를 원하는 형식으로 변환하는 일반적인 목적의 Pipe이다.
    사용자 정의 변환 로직을 구현할 수 있다.

Pipe는 @UsePipes() 데코레이터를 통해 컨트롤러나 핸들러에 적용할 수 있다.

예시 코드

@UsePipes(new ValidationPipe())

 

 

빌트인 Pipe 적용 코드

게시물 삭제 api이다.

param으로 받은 id를 숫자로 변환해주는 pipe를 적용하였다.

// controller 계층

    @Delete('/:id')
    deleteBoard(@Param('id', ParseIntPipe) id): Promise<void> {
        return this.boardsService.deleteBoard(id);
    }

 

 

커스텀 Pipe 적용 코드

게시물의 상태를 변경하는 api이다.

게시물의 상태는 private 또는 public으로 설정되어 있는데 해당 api를 통해 body로 변경할 상태 값을 받으면

board-status-validation.pipe.ts에 설정해둔 커스텀 pipe인 BoardStatusValidationPipe를 통해
데이터의 유효성을 검사하고 값을 대문자로 변경해준다.

// controller 계층

    @Patch('/:id/status')
    updateBoardStatus(
        @Param('id', ParseIntPipe) id: number,
        @Body('status', BoardStatusValidationPipe) status: BoardStatus
    ) {
        return this.boardsService.updateBoardStatus(id, status);
    }
// board-status-validation.pipe.ts file

import { ArgumentMetadata, BadRequestException, PipeTransform } from "@nestjs/common";
import { BoardStatus } from "../board-status.enum";

export class BoardStatusValidationPipe implements PipeTransform {
    readonly StatusOptions = [
        BoardStatus.PRIVATE,
        BoardStatus.PUBLIC
    ]

    transform(value: any){
        value = value.toUpperCase();

        if(!this.isStatusValid(value)) {
            throw new BadRequestException(`${value} 올바른 옵션이 아닙니다.`)
        }

        return value;
    }

    private isStatusValid(status: any) {
        const index = this.StatusOptions.indexOf(status);
        return index !== -1
    }
}

'Development > TIL' 카테고리의 다른 글

Typeorm Transaction  (0) 2023.05.29
NestJS_Configuration  (0) 2023.05.26
Nest.js(feat.DTO)  (0) 2023.05.22
기획 단계의 소통과 의사 결정에 대하여  (0) 2023.05.20
최종 프로젝트 시작  (0) 2023.05.20