[Nest.JS] class-validator를 활용한 유효성 검사

궁금하면 500원·2024년 8월 9일
0

NestJS의 class-validator는 TypeScript의 클래스에서 유효성 검사를 수행할 수 있게 도와주는 라이브러리입니다.

유효성 검사는 주로 사용자 입력 검증, 데이터 전송 객체(Data Transfer Object, DTO) 검증, 모델 유효성 검사 등에서 사용됩니다.

class-validator의 사용 이유

자동화된 유효성 검사

class-validator를 사용하면 DTO 클래스의 속성에 직접 유효성 검사 데코레이터를 붙여서 자동으로 유효성을 검사할 수 있습니다.

이는 코드의 유지보수를 용이하게 합니다.

코드 가독성 향상

유효성 검사를 클래스의 속성에 직접 정의하므로, 데이터 검증 로직이 명확하게 표현됩니다.

재사용성

다양한 DTO에서 동일한 유효성 검사 로직을 재사용할 수 있습니다.

커스터마이징

기본 제공되는 유효성 검사 외에도 사용자 정의 유효성 검사를 쉽게 추가할 수 있습니다.

주요 특성과 데코레이터

class-validator에서 제공하는 주요 데코레이터는 다음과 같습니다

  • @IsString(): 문자열 타입인지 검증
  • @IsInt(): 정수 타입인지 검증
  • @IsEmail(): 유효한 이메일 주소인지 검증
  • @Length(min, max): 문자열 길이 검증
  • @Min(value): 숫자가 지정한 최소값 이상인지 검증
  • @Max(value): 숫자가 지정한 최대값 이하인지 검증
  • @IsOptional(): 값이 선택 사항인지 검증
  • @ValidateNested(): 중첩된 객체의 유효성 검증

기본 제공 Class Validator 예제

다음은 NestJS와 class-validator를 사용한 간단한 예제입니다.

1. DTO 클래스 정의

import { IsString, IsInt, Min, Max, Length, IsEmail, ValidateNested } from 'class-validator';

export class CreateUserDto {
  @IsString()
  @Length(3, 50)
  name: string;

  @IsEmail()
  email: string;

  @IsInt()
  @Min(18)
  @Max(100)
  age: number;
}

2. NestJS Controller에서 DTO 사용

import { Body, Controller, Post } from '@nestjs/common';
import { CreateUserDto } from './create-user.dto';

@Controller('users')
export class UsersController {
  @Post()
  create(@Body() createUserDto: CreateUserDto) {
    // 유효성 검증이 자동으로 수행됩니다.
    return 'User created!';
  }
}

3. 에러 반환 구조

class-validator는 NestJS의 유효성 검사와 함께 사용될 때,
검증 실패 시 자동으로 HTTP 400 Bad Request 에러를 발생시키며,
에러 메시지는 다음과 같은 형태로 반환됩니다.

{
  "statusCode": 400,
  "message": [
    "name should not be empty",
    "name must be longer than or equal to 3 characters",
    "email must be an email",
    "age must be an integer number",
    "age must not be less than 18",
    "age must not be greater than 100"
  ],
  "error": "Bad Request"
}

4. 커스터마이징 에러 메시지

커스터마이즈된 에러 메시지를 사용하려면 데코레이터에 message 속성을 추가하면 됩니다.

import { IsString, Length, IsEmail, IsInt, Min, Max } from 'class-validator';

export class CreateUserDto {
  @IsString({ message: 'Name must be a string' })
  @Length(3, 50, { message: 'Name must be between 3 and 50 characters' })
  name: string;

  @IsEmail({}, { message: 'Email must be a valid email address' })
  email: string;

  @IsInt({ message: 'Age must be an integer' })
  @Min(18, { message: 'Age must be at least 18' })
  @Max(100, { message: 'Age must be less than or equal to 100' })
  age: number;
}

결론

  • class-validator는 DTO 클래스에서 유효성 검사를 자동으로 수행할 수 있게 도와주는 라이브러리입니다.

  • 주요 데코레이터로는 @IsString(), @IsInt(), @IsEmail() 등이 있으며, 이들을 활용해 다양한 검증 로직을 간편하게 구현할 수 있습니다.

  • 에러 반환은 기본적으로 HTTP 400 상태 코드와 함께 에러 메시지를 배열 형태로 제공합니다.

  • 커스터마이즈된 에러 메시지를 제공하려면 각 데코레이터의 message 속성을 사용하면 됩니다.

이렇게 class-validator를 활용하면 NestJS 프로젝트에서 데이터 유효성 검사를
효율적으로 관리하고, 가독성 높은 코드를 유지할 수 있다는것을 배웠습니다.

profile
꾸준히, 의미있는 사이드 프로젝트 경험과 문제해결 과정을 기록하기 위한 공간입니다.

0개의 댓글