반응형

nest.js

 

PIPE 란?

파이프는 @Injectable () 데코레이터로 주석이 달린 클래스입니다. 파이프는 주로 요청 데이터의 변환유효성 검사, 응답 데이터의 가공 등을 처리하기 위해 사용됩니다. 


1. 데이터 유효성 검사 : 파이프를 사용하여 들어오는 데이터의 유효성을 검사할 수 있습니다. 이를 통해 잘못된 데이터가 들어오는 것을 방지하고, 안전한 데이터 처리를 보장할 수 있습니다.
2. 데이터 변환 : 클라이언트로부터 들어오는 데이터를 원하는 형식으로 변환할 수 있습니다. 예를 들어 JSON 형식의 데이터를 객체로 변환하거나, 문자열을 숫자로 변환할 수 있습니다.
3. 데이터 가공 : 파이프를 사용하여 요청 데이터나 응답 데이터를 가공할 수 있습니다. 예를 들어 문자열을 대문자로 변경하거나, 특정 필드를 추가하거나 제거할 수 있습니다.

 

Built-in pipe 종류

  • ValidationPipe
  • ParseIntPipe
  • ParseFloatPipe
  • ParseBoolPipe
  • ParseArrayPipe
  • ParseUUIDPipe
  • ParseEnumPipe
  • DefaultValuePipe
  • ParseFilePipe

 

PIPE 사용하는 방법

Handler-level Pipes

핸들러 레벨에서 @UsePipes() 데코레이터를 이용해서 사용 할 수 있습니다. 이 파이프는 모든 파라미터에 적용이 됩니다.

아래 "유효성 체크 해보기"에서 조금 구체적으로 사용하는 방법을 말씀드리겠습니다.

@UsePipes(ValidationPipe)
    createBoard(@Body() createBoardDto: CreateBoardDto) : Promise<Board> {
        return this.boardsService.createBoard(createBoardDto);
    }

 

Parameter-level Pipes

파라미터 레벨의 파이프 이기에 특정한 파라미터에게만 적용이 되는 파이프 입니다. 아래와 같은 경우에는 id만 파라미터 파이프가 적용이 됩니다.  

@Patch('/:id/status')
    updateBoardStatus(
        @Param('id', ParseIntPipe) id: number,
        @Body('status') status : BoardStatus
    ) {
        return this.boardsService.updateBoardStatus(id, status);
    }

 

Global Pipes

글로벌 파이프로서 애플리케이션 레벨의 파이브 입니다. 클라이언트에서 들어오는 모든 요청에 적용이 됩니다. 가장 상단 영역인 main.ts에 넣어주시면 됩니다.

 

유효성 체크 해보기

먼저 class-validator , class-transformer 모듈을 사용하기 위해서 아래와 같이 모듈을 설치해줍니다.

npm install class-validator class-transformer --save

참고 페이지 여기에서 여러가지 validation 데코레이터를 확인 할 수 있습니다.

 

1. create-board.dto.ts

  - board에 title과 description은 빈값이 안오도록 @IsNotEmpty() 데코레이터를 사용해보겠습니다.

import { IsNotEmpty } from "class-validator";

export class CreateBoardDto{
    @IsNotEmpty()
    title:string;

    @IsNotEmpty()
    description:string;
}

 

2. 위와 같이 데코레이터를 추가해줬다면 아래 컨트롤러에 @UsePipes(ValidationPipe) 데코레이터를 넣어주면 적용이 됩니다.

boards.controller.ts

@UsePipes(ValidationPipe)
    createBoard(@Body() createBoardDto: CreateBoardDto) : Promise<Board> {
        return this.boardsService.createBoard(createBoardDto);
    }

 

잘 적용된 걸 확인할 수 있습니다.

 

Custom PIPE 만들기

board-status-validation.pipe.ts

  - custom pipe를 만들기 위해서는 PipeTransform interface를 구현하여야 합니다.

  - transform 함수 안에 구현하고자 하는 비지니스 로직을 구현하면 됩니다.

  - status 상태 값이 PRIVATE, PUBLIC 으로만 수정될 수 있도록 구현하였습니다.

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, metadata: ArgumentMetadata) {

        if(!this.isStatusValid(value)) {
            throw new BadRequestException(`${value} isn't in the status options`); 
        }


        return value;
    }

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

 

boards.controller.ts

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

 

참고 

- https://docs.nestjs.com/first-steps

- 따라하며 배우는 NestJS

 

728x90
반응형

+ Recent posts