NestJS

[NestJS] Pipe란? Pipe Validation Example

차노도리 2023. 7. 21. 21:58

Pipe

  • 들어오는 요청 데이터를 변환하거나, 유효성 검사를하여 컨트롤로러 전달하기전에 데이터를 가공하는 기능을 수행한다.
  • 들어오는 데이터의 유효성을 미리 검사하여 컨트롤러에서 불필요한 작업을 방지할수있다.
  • 컨트롤러에 반복되는 유혀성 코드를 줄이고, 유효성 검사와 데이터 변환등의 공통 작업을 한곳에서 처리할수있다.

 

파이프 사용 범위 

  • Global Pipes:
    •  애플리케이션 레벨의 파이프를 적용할떄 사용한다.
    • 클라이언트에서 들어오는 모든 요청에 적용된다.
  • Handler-level Pipes
    • @usePipes()라는 데코레이터 사용
    • 특정 핸들러 메서드에 적용할때 사용
    • 핸들러 메소드에 적용되는 파이프로 매개변수에 적용하여 요청 데이터의 변환 또는 유혀성 검사를 수행한다.
  • Parameter-level Pipes:
    • @Param(),@Query, @Body 같은 데코레이터와 함께 사용하여 파라미터에 파이프를 적용한다.
    • 특정 매개변수에 적용되는 파이프로 데이터 변환 또는 유효성 검사를 수행할 수 있다

 

 

https://jakekwak.gitbook.io/nestjs/overview/pipes

 

Pipes - nestjs

import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common'; const types: Function[] = [String, Boolean, Number, Array, Object];

jakekwak.gitbook.io

 

파이프에 필요한 모듈

class-validator

class-transformer

파이프에 필요한 모듈 설치

npm install class-validator class-transformer --save

 

Built-in Pipes Example

- 규칙 생성

import { IsNotEmpty } from 'class-validator';
...

/**단어 만들기 Request*/
export class CreateVocaBffRequest {
  /**
   * 영어 단어명
   *
   * example: word
   */
  @IsNotEmpty()
  word: string;
  
  ...
}

 

Custom Pipe Example

  • PipeTransform를 implements받아서 구현
  • transform()메소드
    • 첫번쨰 인자(value) : 파이프가 변환할 값의 타입
    • 두번째 인자(metadata: 요청과 관련된 메타데이터

- custom pipe 생성

import { ArgumentMetadata, PipeTransform } from '@nestjs/common';
...

export class VocaValidationPipe implements PipeTransform {
  transform(value: Voca, metadata: ArgumentMetadata) {
    ...
    
    return value;
  }
}

 

  • @UsePipes로 파이프 적용
  // Built-in Pipe
  @Post('/')
  @UsePipes(ValidationPipe)
  createVoca(
    @Body() createVocaBffRequest: CreateVocaBffRequest,
  ): Promise<CreateVocaBffResponse> {
	...
  }
  
  // Custom Pipe
  @Post('/')
  @UsePipesVocaValidationPipe)
  createVoca(
    @Body() createVocaBffRequest: CreateVocaBffRequest,
  ): Promise<CreateVocaBffResponse> {
	...
  }