본문 바로가기

[NestJS]

[NestJS] - 5편 (파이프)

반응형

NestJS - 5편 (파이프)

파이프 개념

파이프란? 파이프는 클라이언트의 요청이 왔을 때 요청된 객체를 변환할 수 있는 기회를 제공한다.

파이프 사용 목적

파이프는 주로 2가지 목적으로 사용된다.

  • 변환: 입력 데이터의 형변환
  • 유효성검사: 입력데이터가 내가 정한 기준에 맞는지 검사하고 아닐경우 예외 처리

@nest/common

@nest/common 패키지에는 내장파이프가 들어있다.

  • ValidationPipe
  • ParseIntPipe
  • ParseBoolPipe
  • ParseArrayPipe
  • ParseUUIDPipe
  • DefaultValuePipe

ParseIntPipe, ParseBoolPipe, ParseArrayPipe, ParseUUIDPipe

여기서 ParseIntPipe, ParseBoolPipe, ParseArrayPipe, ParseUUIDPipe는 전달된 인자의 타입을 검사하는 용도이다.
컨트롤러

@Get(':id')
findOne(@Param('id', ParseIntPipe) id: number) {
  return this.usersService.findOne(id);
}

에러응답

{
  "statusCode": 400,
  "message": "Validation failed (numeric string is expected)",
  "error": "Bad Request"
}

형변환할 코드를 따로 작성 필요 없이 저렇게 쉽게 이용가능하다.

에러시 클래스 전달이 아닌 파이프 객체를 직접 생성해 전달도 가능하다.
컨트롤러

@Get(':id')
findOne(@Param('id', new ParseIntPipe({ errorHttpStatusCode: HttpStatus.NOT_ACCEPTABLE })) id: number) {
  return this.usersService.findOne(id);
}

에러응답

{
  "statusCode": 406,
  "message": "Validation failed (numeric string is expected)",
  "error": "Not Acceptable"
}

DefaultValuePipe

그럼 DefaultValuePipe는??
직역시 기본값 파이프인것처럼 기본값을 설정할 때 사용된다.

컨트롤러

@Get()
findAll(
  @Query('offset', new DefaultValuePipe(0), ParseIntPipe) offset: number,
  @Query('limit', new DefaultValuePipe(10), ParseIntPipe) limit: number,
) {
  console.log(offset, limit);

  return this.usersService.findAll();
}

class-validator

이렇게 중간에 잘못된 값인지 검사하는 로직을 따로 안넣어도 되서 편리하다. 하지만 우리는 더 편리함을 추구하는 개발자다.
문제점

  1. 매번 validation 관련 로직을 추가해야한다.
  2. 만약 요청된 객체도 복잡하고 검증도 복잡하다면??? 코드도 복잡해진다..

이런 문제점들을 해결하는게 class-validator이다.

여기서는 정말 많은 검증하는 데코레이터들을 제공한다.
https://github.com/typestack/class-validator/blob/develop/README.md#validation-decorators
여기서 지원하는 전체 데코레이터들을 확인할 수 있다.

그럼 이제 사용법을 알아보자.

class-validator 사용법

  1. 설치
    npm i --save class-validator class-transformer

  2. 전역으로 ValidationPipe 추가하기
    main.ts파일

    import { ValidationPipe } from "@nestjs/common";
    import { NestFactory } from "@nestjs/core";
    import { AppModule } from "./app.module";
    
       async function bootstrap() {
           const app = await NestFactory.create(AppModule);
           await app.listen(3000);
           app.useGlobalPipes(new ValidationPipe());
       }
       bootstrap();
       ```
  3. 모듈의 provider에 추가하기
    app.module.ts파일

    import { ValidationPipe } from "@nestjs/common";
    import { APP_PIPE } from "@nestjs/core";
    ...
    
    @Module({
        providers: [
            {
                provide: APP_PIPE,
                useClass: ValidationPipe,
            },
        ],
    })
  4. DTO에 class-validator 추가해서 검증하기
    DTO파일

     import { IsString } from 'class-validator';
    
     export class CreateProductDTO {
         @IsString()
         name: string;
    
         @IsString()
         description: string;
    
         @IsString()
         price: string;
     }
    

이런식으로 추가해서 사용하면된다. 컨트롤러에 따로 설정할 필요도 없다. 편안~~!!!

참조 : NestJS로 배우는 백엔드 프로그래밍

반응형