백엔드/NestJs

Validation 설정

STUFIT 2022. 8. 1. 16:47
반응형

nestjs에서는 requests 단의 자동 validation 처리를 해주는 모듈들이 다음과 같이 있다.

- ValidationPipe

- ParseIntPipe

- ParseBoolPipe

- ParseArrayPipe

- ParseUUIDPipe

 

이 중에, ValidationPipe 모듈은 class-validator 패키지와 유휴셩 검사 데코레이터를 제공하는데, class 혹은 작성된 dto 에 따른 유효성 검사를 체크한다.

해당 파이프를 사용하기 위해 모듈 설치가 필요하다.

npm i --save class-validator class-transformer

해당 패키지를 설치 후에는 전역 파이프를 선언하기 위해 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);
  
  // type Validation 전역 파이프 추가
  app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true, // true로 설정 시, 아무런 decorator도 없는 property들은 제거됨.
      forbidNonWhitelisted: true, // true로 설정 시, dto에 정의되지 않은 property를 request 하면 자동으로 validation 처리됨(400 에러).
      transform: true, //true로 설정 시, @Param에서 타입 변경 가능
      enableDebugMessages: true, // true로 설정 시, 유효성 검사기가 올바르지 않은 경우 콘솔에 추가 경고 메시지를 날려줌.
      skipNullProperties: true, //true로 설정 시, 유효성 검사기가 유효성 검사 개체에서 null인 모든 속성의 유효성 검사를 건너뜀.
      skipMissingProperties: true, // true로 설정 시, 유효성 검사기는 유효성 검사 개체에서 null이거나 정의되지 않은 모든 속성의 유효성 검사를 건너뜀.
    }),
  );
  
  await app.listen(5000);
}
bootstrap();

해당 코드를 main.ts에 선언해주게 되면 불필요하거나 잘못된 request 에 대한 validation, Param 타입 변환이 가능하다.

whitelist

해당 옵션은 dto에 타입 데코레이터를 설정하지 않은 프로퍼티가 있는 경우 validation 처리하게 된다.

아래의 타입 데코레이터를 선언해줘야하며, 만약 없는경우 validation처리됨.

forbidNonWhitelisted

해당 옵션은 dto에 정의되지 않은 프로퍼티를 validation 하기 위한 용도로 사용된다.

해당 옵션을 true로 설정하게 된다면, dto에 정의되지 않은 프로퍼티에 대해서 body에서 request시,

"property 'xxx' should not exist" 라는 400 에러가 발생하게 된다.

transform

원래 @Param으로 들어오는 값은 무조건 string 형식으로 들어오게 된다.

하지만 우리가 정의한 entity에 따르면 무조건 string 형식이 number나 array, object 등의 다른 형식도 있기 때문에 형변환이 필요한 경우가 있다.

그래서 nestjs 에서는 transform 옵션에 true로 설정하게 되면 타입 변환이 가능하도록 지원해주고 있다.

// 기존에 useGlobalPipe 선언 전 @Param의 타입 변환
// ParseIntPipe를 옆에 붙여줘야 타입변경이 가능
  @Patch('marketbsearch/regist/:vendorNo/:marketbNo')
  async syncMarketb(
    @Param('marketbNo', ParseIntPipe) marketbNo: number,
    @Param('vendorNo', ParseIntPipe) vendorNo: number,
  ): 
  
  
  // useGlobalPipe 선언 후, transform: true인 경우
  // ParseIntPipe를 붙이지 않아도 타입 변경 가능
  @Patch('marketbsearch/regist/:vendorNo/:marketbNo')
  async syncMarketb(
    @Param('marketbNo') marketbNo: number,
    @Param('vendorNo') vendorNo: number,);

 

그 이외의 nest.js에서 제공하는 class-validator 옵션목록

옵션 유형 설명
enableDebugMessages boolean true로 설정하면 유효성 검사기가 올바르지 않은 경우 콘솔에 추가 경고 메시지를 인쇄합니다.
skipUndefinedProperties boolean true로 설정하면 유효성 검사기가 유효성 검사 개체에 정의되지 않은 모든 속성의 유효성 검사를 건너뜁니다.
skipNullProperties boolean true로 설정하면 유효성 검사기가 유효성 검사 개체에서 null인 모든 속성의 유효성 검사를 건너뜁니다.
skipMissingProperties boolean true로 설정하면 유효성 검사기는 유효성 검사 개체에서 null이거나 정의되지 않은 모든 속성의 유효성 검사를 건너뜁니다.
whitelist boolean true로 설정하면 유효성 검사기는 유효성 검사 데코레이터를 사용하지 않는 모든 속성의 유효성이 검사된(반환된) 객체를 제거합니다.
forbidNonWhitelisted boolean true로 설정하면 화이트리스트에 없는 속성을 제거하는 대신 유효성 검사기가 예외를 throw합니다.
forbidUnknownValues boolean true로 설정하면 알 수 없는 개체의 유효성을 검사하려는 시도가 즉시 실패합니다.
disableErrorMessages boolean true로 설정하면 유효성 검사 오류가 클라이언트에 반환되지 않습니다.
errorHttpStatusCode number 이 설정을 사용하면 오류 발생 시 사용할 예외 유형을 지정할 수 있습니다. 기본적으로 BadRequestException.
exceptionFactory Function 유효성 검사 오류의 배열을 가져와 throw할 예외 개체를 반환합니다.
groups string[] 개체의 유효성을 검사하는 동안 사용할 그룹입니다.
always boolean always 데코레이터 옵션의 기본값을 설정 합니다. 데코레이터 옵션에서 기본값을 재정의할 수 있습니다.
strictGroups boolean groups 이 지정되지 않거나 비어 있으면 그룹이 하나 이상 있는 데코레이터를 무시합니다 .
dismissDefaultMessages boolean true로 설정하면 유효성 검사에서 기본 메시지를 사용하지 않습니다.
undefined 오류 메시지는 명시적으로 설정되지 않은 경우 항상 표시됩니다 .
validationError.target boolean 대상이 에 노출되어야 하는지 여부를 나타냅니다. ValidationError
validationError.value boolean 검증된 값을 에 노출해야 하는지 여부를 나타냅니다. ValidationError
stopAtFirstError boolean true로 설정하면 첫 번째 오류가 발생한 후 지정된 속성의 유효성 검사가 중지됩니다. 기본값은 false입니다.

 

반응형