javaScript/nestJs

데이터 검증하기 dto

부엉이사장 2025. 6. 14. 05:20
Introduction
express 사용할때는 각 함수마다 받아오는 데이터를 직접 검증했음.
예를들어 로그인하려는데 아이디 길이나 비밀번호 이런거 정규식 주로 사용함.
nestJs에서는 dto라는게 있어서 매우 편한거같음. 이걸 소개할까함

 

# 먼저 설치

npm install class-validator class-transformer

 

 

# main.ts 수정

  app.useGlobalPipes(new ValidationPipe({
    transform: true,            // DTO 타입 자동 변환
    whitelist: true,            // DTO에 정의되지 않은 속성 제거
    forbidNonWhitelisted: true, // 정의되지 않은 속성이 있으면 400 에러
  }));

 

 

 

# 디렉토리 구조

이런식으로 dto 디렉토리에 원하는 검증 dto듣을 넣어주샘

 

 

 

# 검증값 / test.dto

import {
  IsDefined,
  IsString,
  MinLength,
  MaxLength,
  Matches,
  IsNotEmpty,
} from 'class-validator';

export class BaboDto {
  @IsDefined({ message: '이름을 입력해주세요.' })
  @IsString()
  @MaxLength(4, { message: '이름은 5자 미만이어야 합니다.' })
  @Matches(/^[가-힣a-zA-Z0-9]+$/, {
    message: '이름에는 특수문자를 포함할 수 없습니다.',
  })
  name: string;
  @IsDefined({ message: '메시지를 안 받았어요.' }) // 이게 꼭 있어야 함
  @IsString({ message: 'message must be a string' })
  @IsNotEmpty({ message: '메시지를 안 받았어요.' })
  @MinLength(10, { message: '메시지는 10자 이상이어야 합니다.' })
  message: string;
}

test.dto꺼

해당 프로퍼티들을 어떻게 검증할건지 체크해주는거임.

 

1. IsDefined 얘는 이 값이 있어야하는거. 없으면 message 응답

2. isString 얘는 문자열타입이어야 하는거

3. MaxLength 는 최대길이. 안맞으면 메세지 응답

4. Matches는 정규식으로 검사까지

 

이런식으로 여러가지 dto를 만들고 재사용할 수 있음

타입을 따로 정해뒀으면 타입을 임포트해서 class에 implements로 할수도 있을듯

 

 

 

 

 

# 컨트롤러에서 설정

  @Post('babo')
  PostBabo(@Body() dto: BaboDto) {
    //여기부터는 dto검사 끝난 상태임
    return {
      message: '데이터 잘 받았어요!',
      data: dto,
    };
  }

babo라는 post요청을 받았을때, 

body를 BaboDto로 검증한다는 거임

 

 

 

 

# 테스트

정상요청시

 

 

비정상 요청시

 

1. 프로퍼티 하나 더 추가

 

 

2. 프로퍼티 하나 뺴기

 

 

3. 아이디 규격위반

 

 

 

뭐 이런식으로 400번대 에러 던져줌. 매우매우 편리할것같다

예전에 하드코딩할떄는 아예 규격 미들웨어 다 정해서 힘들었는데

nestJs로 하면 데이터 받아오는걸 컨트롤러단에서 검증하고 끊어줄 수 있음.