ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Nest.js 에서의 Pipe
    Nest.js 2025. 2. 12. 10:04

    * 목적

    : 요청이 controller로 인수를 보내기 전에 요청 객체를 변환 및 검증 할 수 있는 기회를 제공

    : 종류는 2가지가 있다. 1. 검증 (validator), 2. 변경 (transformer)

     

    * 왜 쓰는가?

    : api 서버 개발시 프론트에서 잘못된 인수를 넘겨주는 경우에 대해 대응 하기 위해서!

    : 즉! 프론트에서 아무리 개떡같이 줘도, 백엔드는 찰떡같이 알아 들어야 한다.

    : 개인적으로 백엔드 개발자의 역량은 이런 디테일을 얼마나 잘 살려줘야 고수로 갈수 있는게 아닐까 싶다.

     

    * nestjs 에 내장된 파이프 종류

    : ValidationPipe, ParseIntPipe, ParseBoolPipe, ParseArrayPipe, ParseUUIDPipe, DefaultValuePipe

     

    * 필요 패키지

    npm install class-validator class-transformer --save

    - 패키지에 어떤 기능들이 있는지 나와있는 문서

    : https://github.com/typestack/class-validator#manual-validation

     

    GitHub - typestack/class-validator: Decorator-based property validation for classes.

    Decorator-based property validation for classes. Contribute to typestack/class-validator development by creating an account on GitHub.

    github.com

     

    * 사용 예시

    - Validation Pipe

    : Validation Pipe 는 DTO에 정의한 validation decorator 기준들을 체킹 해준다.

    export class AuthCredentialDto {
      @IsNotEmpty()
      @IsString()
      @MinLength(4)
      @MaxLength(20)
      username: string;
    
      @IsNotEmpty()
      @IsString()
      @MinLength(8)
      @MaxLength(20)
      @Matches(/^[a-zA-Z0-9]*$/, {
        message: 'password only accepts english and number',
      })
      password: string;
    }
    // src/auth/auth.controller.ts
    
      @Post('/signup')
      @UsePipes(ValidationPipe)
      createUser(
        @Body(ValidationPipe) authCredentialDto: AuthCredentialDto,
      ): Promise<User> {
        return this.authService.createUser(authCredentialDto);
      }

     

    - ParseIntPipe

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

     

    - Transformer

    // src/boards/pipes/board-status-validation.pipe.ts
    
    import { BadRequestException, PipeTransform } from '@nestjs/common';
    import { BoardStatus } from '../board-status-enum';
    
    // custom pipe
    export class BoardStatusValidationPipe implements PipeTransform {
      readonly StatusOptions = [BoardStatus.PUBLIC, BoardStatus.PRIVATE];
      transform(value: any) {
        value = value.toUpperCase();
    
        if (!this.isStatusValid(value)) {
          throw new BadRequestException(`${value} is an invalid status`);
        }
        return value;
      }
    
      private isStatusValid(status: any) {
        const index = this.StatusOptions.indexOf(status);
        return index !== -1;
      }
    }
    // src/boards/boards.controller.ts
    
      @Patch('/:id')
      updateBoardStatus(
        @Param('id', ParseIntPipe) id: number,
        @Body('status', BoardStatusValidationPipe) status: BoardStatus,
      ): Promise<Board> {
        return this.boardsService.updateBoardStatus(id, status);
      }

     

    'Nest.js' 카테고리의 다른 글

    Nest.js 모듈 생성(추가) 퀵가이드  (0) 2025.03.05
    Nest.js 로그  (0) 2025.02.26
Designed by Tistory.