포스트

NestJS에서 Class Validator가 형변환된 객체에 대한 검증 오류를 발생시키지 않음

문제 개요

NestJS에서는 Class Validator를 이용해 객체의 유효성을 검사할 수 있습니다. 그러나, 때로는 형변환된 객체에 대한 검증 오류가 발생하지 않는 경우가 있습니다. 본 글에서는 이러한 문제점을 자세히 살펴보고 해결 방안을 제시하겠습니다.

Class Validator란?

Class Validator는 TypeScript와 JavaScript에서 클래스 기반으로 객체를 검증하기 위한 라이브러리입니다. 이 라이브러리를 사용하면 객체의 필드나 속성에 다양한 검증 조건을 적용할 수 있습니다. 예를 들어, 이메일 형식이 올바른지, 문자열의 길이가 특정 범위 내에 있는지 등을 검증할 수 있습니다.

형변환과 검증 오류

문제는 자동 형변환(캐스팅)된 객체에서 발생합니다. Class Validator는 원래의 객체 유형을 기반으로 검증을 수행하기 때문에, 형변환이 이루어진 객체에 대한 검증이 제대로 이루어지지 않을 수 있습니다.

예시: ValidationError

아래와 같이 string으로 형변환된 객체를 검증할 때 ValidationError가 발생하지 않는 경우를 살펴보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
class CreateUserDto {
  @IsString()
  name: string;
}

const user = {
  name: 1234,
};

validateOrReject(user as CreateUserDto).catch(errors => {
  // ValidationError가 발생하지 않음
});

해결 방안

  1. 형변환 전에 검증: 객체를 형변환하기 전에 먼저 검증을 수행합니다.
  2. Whitelist 사용: Class Validator에서 제공하는 whitelist 옵션을 활용해, 허용된 필드만을 검증합니다.
1
2
3
4
const options = { whitelist: true, forbidNonWhitelisted: true };
validateOrReject(user as CreateUserDto, options).catch(errors => {
  // 이제 ValidationError가 발생
});
  1. 트랜스포머 사용: class-transformer 라이브러리를 이용해 객체를 올바른 형태로 변환한 후 검증을 수행합니다.

결론

NestJS의 Class Validator는 매우 유용하지만, 형변환된 객체에 대한 검증에서는 주의가 필요합니다. 이를 해결하기 위해 몇 가지 방법이 있으며, 이 중에서 가장 적합한 방법을 선택하여 사용하면 됩니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.