본문 바로가기

STUDY/Node.js

NestJS | 유효성 검사 validation

NestJS재밌다..

DTO클래스 생성

글 작성 요청시 사용하는 DTO를 만든다.

export class CreateRequestDto {
     readonly title: string;
      readonly author: string;
      readonly regDate: Date;
}

아직 유효성 검사 처리가 되어있지 않아서, 아무런 값이나 요청해도 예외처리가 되지 않는다.

@Controller('boards')
export class BoradsController {

      constructor(private readonly boardService: BoardService) {}

    @Post()
    create(@Body() createDto: CreateRequestDto) {
        return this.boardService.create(createDto); 
    }

}

클래스 유효성 검사 라이브러리 설치

class-validatorclass-transformer를 사용하면 데코레이터 기반 유효성 검사가 가능하다.

$ npm i --save class-validator class-transformer

https://github.com/typestack/class-validator

DTO 수정

데코레이터를 사용해서 유효성 검사

import { IsDate, IsString } from 'class-validator';

export class CreateRequestDto {

      @IsString()
     readonly title: string;

      @IsString()
      readonly author: string;

      @IsDate()
      readonly regDate: Date;
}

ValidationPipe 바인딩

@Body()데코레이터에 ValidationPipe를 바인딩하여 유효성 검사를 하도록 한다.
ValidationPipe는 매개변수, 메서드, 컨트롤러 그리고 전역에 바인딩할 수 있다. 아래는 매개변수에 바인딩

@Controller('boards')
export class BoradsController {

      constructor(private readonly boardService: BoardService) {}

    @Post()
    create(@Body(new ValidationPipe()) createDto: CreateRequestDto) {
        return this.boardService.create(createDto); 
    }

}

전역에 바인딩하고자 한다면, main.ts에서 처리할 수 있다.
appuseGlobalPipe를 적용

// 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);
  app.useGlobalPipes(
    new ValidationPipe(),
  );
  await app.listen(3000);
}
bootstrap();

ValidationPipe에는 여러 옵션을 설정할 수 있다.

  • whitelsit: 유효성 검사 데코레이터를 사용하지 않는 값은 무시(제거)한다
  • forbidNonWhitelisted: 유효성 검사 데코레이드터를 사용하지 않는 값은 요청조차 불가, 바로 에러 응답 반환
  • disableErrorMessage: 기본으로 생성되는 에러 메시지를 클라이언트에게 반환하지 않음
  • errorHttpStatusCode: 특정 예외처리를 할 수 있음. 기본은 BadRequestException
  • transform: 일반 JavaScript객체로 들어오는 요청을 자동으로 DTO클래스로 변환

https://docs.nestjs.com/techniques/validation에서 더 많은 옵션 확인 가능