개발일지

Nest.js Pipe

index.ys 2023. 8. 15. 01:35

파이프(Pipe)

  • 요청이 라우터 핸들러로 전달되기 전에 요청 객체를 변환할 수 있는 기회를 제공
  • 미들웨어의 역할과 비슷하지만 미들웨어는 애플리케이션의 모든 콘텍스트에서 사용하도록 할 수 없음 => 미들웨어는 현재 요청이 어떤 핸들러에서 수행되는지, 어떤 매개변수를 가지고 있는지에 대한 실행 콘텍스트를 알지 못함

파이프의 목적

  • 변환(trasform): 입력 데이터를 원하는 형식으로 변환, => users/user/1 의 경로 매개변수 1을 문자열에서 정수로 변환
  • 유효성 검사(validation): 입력 데이터가 사용자가 정한 기준에 유효하지 않은 경우 예외 처리를 반환함

파이프의 종류

ValidationPipe

  • 용도: 들어오는 데이터의 유효성 검사를 수행함
  @Post()
  //ValidationPipe를 통해 전달된 입력값 유효성검사
  create(@Body(ValidationPipe) createUserDto: CreateUserDto) {
    console.log(createUserDto);
    return this.usersService.create(createUserDto);
  }
  
  //{ name: 'kim', email: 'ystar5008@naver.com' }

User-dto

import { IsString, MinLength, MaxLength, IsEmail } from 'class-validator';

export class CreateUserDto {
  @IsString()
  @MinLength(1)
  @MaxLength(20)
  readonly name: string;

  @IsEmail()
  @MinLength(2)
  @MaxLength(30)
  readonly email: string;
}

요청

parseIntPipe

  • 용도: 문자열을 정수로 변환
  • ex) 매개변수로 전달된 id:1를 정수로 변환
@Get(':id')
findOne(@Param('id', new ParseIntPipe()) id: number) {
  // id는 정수로 변환된 값입니다.
  // ...
}

ParseBoolPipe

  • 용도 : 문자열을 boolean으로 변환
@Get(':isActive')
findActive(@Param('isActive', new ParseBoolPipe()) isActive: boolean) {
  // isActive는 불리언으로 변환된 값입니다.
  // ...
}

ParseArrayPipe

  • 용도: 문자열을 배열로 변환
@Get()
findMany(@Query('ids', new ParseArrayPipe({ items: Number, separator: ',' })) ids: number[]) {
 console.log(ids);
}

//[1]

요청

ParseUUIDPipe

  • 용도 : 문자열을 UUID로 변환
@Get(':uuid')
find(@Param('uuid', new ParseUUIDPipe()) uuid: string) {
  // uuid는 UUID 문자열로 변환된 값입니다.
  // ...
}

DefaultValuePipe

  • 용도 : 파라미터가 제공되지 않았을떄 기본값을 설정
@Get()
findAll(@Query('page', new DefaultValuePipe(1), ParseIntPipe) page: number) {
  // page가 제공되지 않으면 기본값으로 1이 할당됩니다.
  // ...
}