nest js

NestJs Pipe에 대하여 알아보자

호리둥절 2023. 4. 6. 17:17

파이프란?

파이프의 경우에 두가지 사용 사례가 있습니다.

  • 변환 : 입력 데이터를 원하는 형식으로 변환(예: 문자열에서 정수로)
  • validation : 입력 데이터를 평가하고 유효한 경우 변경되지 않은 상태로 전달합니다. 그렇지 않으면 예외를 throw합니다.

빌드인 파이프와 바인딩 파이프

빌트인 파이프는 NestJS 프레임워크에서 제공하는 파이프입니다. 예를 들어 

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

 

바인딩 파이프는 라우트 핸들러에 파이프를 바인딩하는 것을 의미합니다.

예를 들어 다음과 같이 작성할 수 있습니다.

  @Get(':id')
  findOne(@Param('id', ParseIntPipe) id: string) {
    return this.userService.findOne(+id);
  }

 

위의 코드에서 @Param('id', ParseIntPipe) 데코레이터를 사용하여 id 파라미터에 ParseIntPipe 파이프를 바인딩합니다. 이렇게 하면 id 파라미터가 정수로 변환되어 라우트 핸들러에 전달됩니다.

빌트인 파이프와 사용자 정의 파이프 모두 바인딩할 수 있습니다.

@Get()
async findAll(@Query('limit', new DefaultValuePipe(10), ParseIntPipe) limit: number) {
  return this.catsService.findAll(limit);
}

 

위의 코드에서 @Query('limit', new DefaultValuePipe(10), ParseIntPipe) 데코레이터를 사용하여 limit 쿼리 파라미터에 DefaultValuePipe와 ParseIntPipe 파이프를 바인딩합니다. 이렇게 하면 limit 쿼리 파라미터가 정수로 변환되고 기본값으로 10이 설정됩니다.

파이프를 사용하는 방법 3가지

핸들러 수준 파이프: 핸들러 수준 파이프는 특정 라우트 핸들러에만 적용됩니다. @UsePipes() 데코레이터를 사용하여 라우트 핸들러에 바인딩할 수 있습니다. 예를 들어 다음과 같이 작성할 수 있습니다.

@Get(':id')
@UsePipes(MyPipe)
async findOne(@Param('id') id: number) {
  return this.userService.findOne(id);
}

위의 코드에서 @UsePipes(MyPipe) 데코레이터를 사용하여 findOne() 라우트 핸들러에 MyPipe 파이프를 바인딩합니다. 이렇게 하면 findOne() 라우트 핸들러모든 인수가 MyPipe 파이프를 통과합니다

 

파라미터 수준 파이프: 파라미터 수준 파이프는 특정 파라미터에만 적용됩니다. @Param(), @Query(), @Body() 등의 데코레이터를 사용하여 파라미터에 바인딩할 수 있습니다. 예를 들어 다음과 같이 작성할 수 있습니다.

@Get(':id')
async findOne(@Param('id', MyPipe) id: number) {
  return this.userService.findOne(id);
}

 

전역 수준 파이프: 전역 수준 파이프는 애플리케이션의 모든 라우트 핸들러에 적용됩니다. app.useGlobalPipes() 메소드를 사용하여 전역적으로 바인딩할 수 있습니다. 예를 들어 다음과 같이 작성할 수 있습니다.

const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new MyPipe());
await app.listen(3000);

위의 코드에서 app.useGlobalPipes(new MyPipe()) 메소드를 사용하여 애플리케이션의 모든 라우트 핸들러에 MyPipe 파이프를 전역적으로 바인딩합니다. 이렇게 하면 애플리케이션의 모든 인수가 MyPipe 파이프를 통과합니다.

유효성 검사 Pipe

NestJS에서 파이프를 사용하여 유효성 검사를 수행할 수 있습니다. ValidationPipe 파이프를 사용하면 클래스 검증기 라이브러리와 함께 유효성 검사를 수행할 수 있습니다.

npm i class-validator
import { IsInt, IsString } from 'class-validator';

export class CreateUserDto {
  @IsString()
  name: string;

  @IsInt()
  age: number;
}

@Post()
@UsePipes(new ValidationPipe())
async create(@Body() createUserDto: CreateUserDto) {
  this.catsService.create(createUserDto);
}

위의 코드에서 CreateUserDto 클래스는 name 속성이 문자열이어야 하고 age 속성이 정수여야 함을 나타냅니다. @UsePipes(new ValidationPipe()) 데코레이터를 사용하여 create() 라우트 핸들러에 ValidationPipe 파이프를 바인딩합니다. 이렇게 하면 createUserDto 객체가 유효성 검사를 통과해야 라우트 핸들러가 실행됩니다.

유효성 검사에 실패하면 NestJS는 자동으로 예외를 발생시킵니다.

 

더 자세한것을 알고싶다면 npm 사이트를 참고하세요!!

https://www.npmjs.com/package/class-validator

 

class-validator

Decorator-based property validation for classes.. Latest version: 0.14.0, last published: 4 months ago. Start using class-validator in your project by running `npm i class-validator`. There are 4411 other projects in the npm registry using class-validator.

www.npmjs.com

pipe로 예외처리 하는법

NestJS에서 파이프를 사용하여 예외 처리를 수행할 수 있습니다. 파이프에서 예외를 발생시키면 NestJS는 자동으로 예외 필터를 호출하여 예외를 처리합니다.

 

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

@Injectable()
export class MyPipe implements PipeTransform {
  transform(value: any, metadata: ArgumentMetadata) {
    if (!value) {
      throw new BadRequestException('아이디가 존재하지 않습니다!!!!');
    }
    return value;
  }
}

@Get(':id')
async findOne(@Param('id', MyPipe) id: number) {
  return this.userService.findOne(id);
}

 

위 코드에서 MyPipe 클래스는 PipeTransform 인터페이스를 구현합니다. transform() 메소드에서는 value가 없으면 BadRequestException 예외를 발생시킵니다. 이렇게 하면 id 파라미터가 없으면 NestJS가 자동으로 예외 필터를 호출하여 예외를 처리합니다.

이외에도 삭제할 객체가 있는지 없는지 pipe를 통하여 확인할 수 있습니다.

'nest js' 카테고리의 다른 글

NestJs Custom decorator에 대해 알아보자  (0) 2023.04.07
NestJs custom pipe 에 대해 알아보자  (0) 2023.04.06
NestJs 미들웨어  (0) 2023.04.06
NestJs Provider(공급자)  (0) 2023.04.06
NestJs controller에 대해 이해하기  (0) 2023.04.06