[NestJS] 7. Pipes

Hannah·2023년 4월 14일
0

nestjs

목록 보기
7/9

! 읽기 전
이 시리즈에 있는 모든 글은 블로그 지향 기반 개발 & 공식 문서 기반으로 작성되었습니다 내용은 정확하지 않을 수도 있으며, 100% 신뢰하지 마시길 바랍니다


1. 파이프란?

  • 파이프는 @Injectable() 데코레이터로 주석이 달린 클래스입니다. 파이프는 PipeTransform 인터페이스를 구현해야 합니다.
  • 일반적인 사용 사례
    1. transformation: 입력 데이터를 원하는 출력으로 변환
    2. validation: 입력 데이터를 평가하고 유효하다면 변경없이 그대로 전달. 그렇지 않으면 데이터가 정확하지 않을 때 예외를 던짐
  • 두 경우 모두 파이프는 컨트롤러 경로 처리기에 의해 처리되는 인수에서 작동
  • NestJs에서는 기본적으로 즉시 사용할 수 있는 pipe가 있음
    • VaildationPipe
    • ParseIntPipe
    • ParseUUIDPipe

2. ValidationPipe

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

@Injectable()
export class ValidationPipe implements PipeTransform {
  transform(value: any, metadata: ArgumentMetadata) {
    return value;
  }
}
  • 처음에는 단순히 입력 값을 가져 와서 동일 기능으로 동작하는 같은 값을 즉시 반환
  • 모든 파이프는 transform()메소드를 제공해야함
  • Validation Pipe는 값을 변경하지 않고 반환하거나 예외를 발생
  • 매개 변수 : value, metadata
type인수가 body @Body(), query @Query(), param @Param() 또는 사용자 정의 매개 변수인지 여부를 나타냅니다 (여기에서 자세히 알아보십시오).
metatype인수의 메타 타입 (예: String)을 제공합니다. 참고: 라우트 핸들러 메소드 서명에서 유형 선언을 생략하거나 바닐라 JavaScript를 사용하는 경우 값은 undefined입니다.
data문자열이 데코레이터에 전달되었습니다 (예: @Body('string')). 데코레이터 괄호를 비워두면 정의되지 않습니다(undefined).

적용(controller.ts)

@Post()
@UsePipes(new ValidationPipe({ transform: true }))
async create(@Body() createCatDto: CreateCatDto) {
  this.catsService.create(createCatDto);
}

3. ParseIntPipe

  • 문자열을 정수 값으로 구문 분석하는 파이프
@Injectable()
export class ParseIntPipe implements PipeTransform<string, number> {
  transform(value: string, metadata: ArgumentMetadata): number {
    const val = parseInt(value, 10);
    if (isNaN(val)) {
      throw new BadRequestException('Validation failed');
    }
    return val;
  }
}

사용 방법 (service.ts)

async findOne(@Param('id', new ParseIntPipe()) id) {
  return await this.catsService.findOne(id);
}

4. ParseUUIDPipe

  • 문자열을 구문 분석하고 UUID인지 확인하는 파이프
@Get(':id')
async findOne(@Param('id', new ParseUUIDPipe()) id) {
  return await this.catsService.findOne(id);
}

5. pipe 관련 lib

  • Joi (validation)
  • class-validator, class-transformer
profile
backend developer

0개의 댓글