공식문서에서 ValidationPipe를 다음과 같이 설명한다.
To automatically validate incoming requests, Nest provides several pipes available right out-of-the-box
자동으로 요청을 검증하기 위해 사용 가능한 여러 파이프를 제공한다. NestJs에선 전송된 모든 데이터를 자동으로 검증하기 위한 여러 pipes가 존재한다.
이 중 ValidationPipe
는 모든 클라이언트 페이로드에 대해 유효성 검사를 하고, class/DTO에 선언해 사용한다.
내장된 ValidationPipe를 사용하기 위해 먼저 필요한 종속성을 설치하자.
npm i --save class-validator class-transformer
ValidationPipe 옵션
whitelist : DTO에 정의되지 않은 속성은 무시된다.
forbidNonWhitelisted : DTO에 정의되지 않은 속성이 있으면 요청이 거부된다.
-> 즉 요청이 오면, DTO 클래스에 정의된 속성만 허용되며, 정의되지 않은 속성이나 타입이 잘못된 속성이 있으면 요청이 거부할 수 있다. (요청 자체를 막음)
transform : 우리가 원하는 타입으로 자동으로 변환해주는 옵션이다.
컨트롤러와 서비스 간에 데이터를 주고받을 때
DTO를 사용한다.(ex. req.body의 타입을 지정)import { IsString, IsNumber, IsArray } from 'class-validator';
export class CreateMovieDto {
@IsString()
readonly title: string;
@IsNumber()
readonly year: number;
@IsArray() // 필드가 배열임을 검사
@IsString({ each: true }) // 배열의 각 요소가 문자열임을 검사,검증 옵션들은 ValidationOptions.d.ts파일에 자세히 나와있음
readonly genres: string[];
}
@IsString()
데코레이터는 title
필드가 문자열인지 확인하고, @IsNumber()
데코레이터는 year
필드가 숫자인지 확인한다.@IsArray()
데코레이터는 genres
필드가 배열인지 확인하고, @IsString({ each: true })
데코레이터는 genres 배열의 각 요소가 문자열인지 확인한다.
다음 동일한 구조에서 모든 필드가 선택적으로 처리되도록 처리하려면? @nestjs/mapped-types
라이브러리의 PartialType
을 사용할 수 있다.
npm i @nestjs/mapped-types
import { PartialType } from '@nestjs/mapped-types';
import { CreateMovieDto } from './create-movie-dto';
export class UpdateMovieDto extends PartialType(CreateMovieDto) {}
// CreateMovieDto 그대로 옵셔널로 바꿔주는 유틸리티 기능을 제공
// https://docs.nestjs.com/openapi/mapped-types