Class Validator

김영훈·2024년 11월 16일

NestJS

목록 보기
1/9
post-thumbnail

📌 Class Validator 특성

✔️ TS Decorator 를 사용해서 클래스를 검증한다 (Validate)
✔️ 동기(Synchronous) 비동기 (Asynchronous) 방식 모두를 지원한다.
✔️ Class Validator 자체적으로 제공해주는 Validator 들을 사용 할 수 있다.
✔️ 커스텀 Validator 를 쉽게 만들 수 있다.
✔️ 커스텀 에러 메세지를 반환 할 수 있다.


사용

pnpm i class-validator class-transformer

    class User {
    @IsNotEmpty()
    name: string;
    
    @IsEmail()
    email: string;
}

📌 class Validator 에서 제공해주는 어떤 Validator 든 검증하고 싶은 프로퍼티에 Decorator로 제공해주면 된다.


const user = new User();
user.name = '';
user.email = 'invalid-email';

validate(user).then(errors => {
    // 에러 반환
})

📌 validate() 함수로 객체를 검증했을때 Class Validator 에 부합하지 않는 값이 입력됐다면 해당되는 에러가 반환된다.


기본 제공 Class Validator

DecoratorDescription
기본 Validator
@IsDefined(value: any)값(value)이 null 또는 undefined 이 아니여야 한다.
@IsOptional()만약 값(value) 자체가 정의되지 않았다면, 다른 validator를 실행하지 않는다.
@Equals(comparison: any)값(value)이 comparison 과 동일해야 한다.
@NotEquals(comparison: any)값(value)이 comparison 과 동일하지 않아야 한다.
@IsEmpty()값(value)이 empty('', undefined, null) 이여야 한다.
@IsNotEmpty()값(value)이 empty('', undefined, null)가 아니여야한다.
@IsIn(values: any[])값(value)이 허용된 값들의 배열(values) 안에 포함되어 있어야 한다.
@IsNotIn(values: any[])값(value)이 허용되지 않은 값들의 배열(values) 안에 포함되어 있지 않아야 한다.
타입 Validator
@IsBoolean()값(value)은 boolean 타입이여야 한다. true, false 는 가능하지만 "true", "false" 는 불가능
@IsDate()값(value)이 Date 객체인지 확인하는 유효성 검사 데코레이터.
@IsString()값(value)이 String 타입인지 확인하는 유효성 검사 데코레이터
@IsNumber(options: IsNumberOptions)값(value)이 Number 타입인지 확인하는 유효성 검사 데코레이터
@IsInt()값(value)이 Int(정수) 인지 확인하는 유효성 검사 데코레이터
@IsArray()값(value)이 Array(배열)타입인지 확인하는 유효성 검사 데코레이터
@IsEnum(entity: object)값(value)이 지정된 열거형(enum)에 속하는 유효한 값인지 확인하는 데 사용되는 유효성 검사 데코레이터
숫자 Validator
@IsDivisibleBy(num: number)값(value)이 지정된 num 으로 나눌수 있는지 확인하는 유효성 검사 데코레이터
@IsPositive()값(value)이 양수인지 확인하는 유효성 검사 데코레이터
@IsNegative()값(value)이 음수인지 확인하는 유효성 검사 데코레이터
@Min(min: number)값(value) 이 주어진 min 보다 큰지 확인하는 유효성 검사 데코레이터
@Max(max: number)값(value) 이 주어진 max 보다 작은지 확인하는 유효성 검사 데코레이터
문자 Validator
@Contains(seed: string)값(value) 에 지정한 seed 가 존재하는지 확인하는 유효성 검사 데코레이터
@IsDateString()문자열 타입 값(value) 이 ISO8601형식인지 확인하는 유효성 검사 데코레이터 ex) 2024-11-16T22:38:04.000Z
@NotContains(seed: string)값(value) 에 지정한 seed 가 존재하지않는지 확인하는 유효성 검사 데코레이터
@IsAlpha()값(value)이 알파벳으로 이루어져있는지 확인하는 유효성 검사 데코레이터
@IsAlphanumeric()값(value) 이 알파벳과 숫자로 이루어져있는지 확인하는 유효성 검사 데코레이터
@IsCreditCard()크레딧 카드 형식(****-****-****-****) 인지 확인하는 유효성 검사 데코레이터
@IsEmail(options?: IsEmailOptions)값(value) 이 이메일 형식인지 확인하는 유효성 검사 데코레이터
@IsHexColor()값(value)이 HexColor 형식(16진)인지 확인하는 유효성 검사 데코레이터
@IsISO8601(options?: IsISO8601Options)@IsDateString 과 동일함
@IsLatLong()값(value) 의 형식이 위도, 경도 인지 확인하는 유효성 검사 데코레이터
@IsUrl(options?: IsURLOptions)값(value)의 형식이 URL 형식인지 확인하는 유효성 검사 데코레이터
@IsUUID(version?: UUIDVersion)값(value)의 형식이 UUID 형식인지 확인하는 유효성 검사 데코레이터
@IsUppercase()값(value) 의 형식이 대문자인지 확인하는 유효성 검사 데코레이터
@Length(min: number, max?: number)값(value) 의 길이가 min, max(Optional) 값 사이인지 확인하는 유효성 검사 데코레이터
@MinLength(min: number)값(value) 의 길이가 지정한 min 보다 큰지 확인하는 유효성 검사 데코레이터
@MaxLength(max: number)값(value) 의 길이가 지정한 max 보다 작은지 확인하는 유효성 검사 데코레이터

💡 제공하는 더 많은 기본 제공 데코레이터는 class-validator gitHub 에서 확인 가능하다.


반환 에러 구조

{
  target: Object;
  property: string;
  value: any;
  constraints?: {
      [type: string]: string;
  };
  children?: ValidationError[];
}

target: 검증한 객체
property: 검증 실패한 프로퍼티
value: 검증 실패한 값
constraints: 검증 실패한 제약조건
children: 프로퍼티의 모든 검증 실패 제약조건


커스텀 에러 메세지

class User {
    @IsNotEmpty({message: '이름을 입력해주세요!'})
    name: string;
    
    @IsEmail({}, {message: '정확한 주소를 입력해주세요!'})
    email: string;
}

Decoratormessage 프로퍼티에 검증 실패했으때의 에러메세지를 입력한다.


커스텀 Validator 생성하기

@ValidatorConstraint()  
class PasswordValidator implements ValidatorConstraintInterface{  
    validate(value: any, validationArguments?: ValidationArguments): Promise<boolean> | boolean {  
        // 비밀번호 길이는 4-8        
        return value.length > 4 && value.length < 8;  
    }  
    defaultMessage(validationArguments?: ValidationArguments): string {  
        return '비밀번호의 길이는 4~8자 여야합니다. 입력된 비밀번호 ($value)'    }  
}

💡 커스텀 Validator 정의하는 방법
1. ValidatorConstraintInterface 의 구현하는 class를 생성한다.
2. validate 내부에 유효성 검증 로직을 작성하고, defaultMessage 에 출력할 메세지를 정의한다.
3. 구현체에 @ValidatorConstraint() 데코레이터를 붙여준다.

@Validate(PasswordValidator)  
test: string;

💡 커스텀 Validator 사용하는 방법
1. 검증할 값 위에 @Validate(생성한 구현체이름) 데코레이터를 붙여준다.

// 입력
{
    "test": "23"
}

// 결과
{
    "message": [
        "비밀번호의 길이는 4~8자 여야합니다. 입력된 비밀번호 (23)"
    ],
    "error": "Bad Request",
    "statusCode": 400
}

커스텀 데코레이터와 함께 사용하기

📌 @Validate 데코레이터를 사용하지 않고 정말 나만의 데코레이터 이름을 사용하고 싶다면
아래와 같이 사용할 수 있다.

function IsPasswordValid(validationOptions?: ValidationOptions){  
    return function(object: Object, propertyName: string){  
        registerDecorator({  
            target: object.constructor,  
            propertyName,  
            options: validationOptions,  
            validator: PasswordValidator,  
        })  
    }  
}

적용한 모습

@IsPasswordValid()
test: string;

0개의 댓글