[NestJS] | 유효성 검사와 DTO

Hayeon LEE·2024년 3월 28일
0

NestJS

목록 보기
3/4
post-thumbnail

ValidationPipe

공식문서에서 ValidationPipe를 다음과 같이 설명한다.

To automatically validate incoming requests, Nest provides several pipes available right out-of-the-box

자동으로 요청을 검증하기 위해 사용 가능한 여러 파이프를 제공한다. NestJs에선 전송된 모든 데이터를 자동으로 검증하기 위한 여러 pipes가 존재한다.

  • ValidationPipe
  • ParseIntPipe
  • ParseBoolPipe
  • ParseArrayPipe
  • ParseUUIDPipe

이 중 ValidationPipe는 모든 클라이언트 페이로드에 대해 유효성 검사를 하고, class/DTO에 선언해 사용한다.

내장된 ValidationPipe 사용

내장된 ValidationPipe를 사용하기 위해 먼저 필요한 종속성을 설치하자.

npm i --save class-validator class-transformer
  • ValidationPipe 옵션

    • whitelist : DTO에 정의되지 않은 속성은 무시된다.

    • forbidNonWhitelisted : DTO에 정의되지 않은 속성이 있으면 요청이 거부된다.

      -> 즉 요청이 오면, DTO 클래스에 정의된 속성만 허용되며, 정의되지 않은 속성이나 타입이 잘못된 속성이 있으면 요청이 거부할 수 있다. (요청 자체를 막음)

    • transform : 우리가 원하는 타입으로 자동으로 변환해주는 옵션이다.

  • 내장 파이프 공식문서

  • Validation 공식문서


DTO

  • DTO (Data Transfer Object)클래스는 데이터 전송을 위한 객체로, 주로 컨트롤러와 서비스 간에 데이터를 주고받을 때 DTO를 사용한다.(ex. req.body의 타입을 지정)
    class-validator 라이브러리에 많은 옵션이 있는데 class-validator 예제 깃헙 여기 잘 정리되어 있다.
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
profile
미래의 나를 위한 기록

0개의 댓글