framwork/NestJs

[Nestjs] Custom Validator 데코레이터 적용하기

닉네임없음ㅎ 2024. 11. 22. 19:56



NestJs에서 요청에 대한 유효성 검사를 할때
class-validator, class-transformer에서 validationPipe를 제공해주어 유효성 검사를 할 수 있다.


https://github.com/typestack/class-validator#usage



 

GitHub - typestack/class-validator: Decorator-based property validation for classes.

Decorator-based property validation for classes. Contribute to typestack/class-validator development by creating an account on GitHub.

github.com

 

이렇게 기본적으로 제공되는 class-validator의 데코레이터가 아닌 custom Validator를 만들어서 사용할 수도 있다 ! 


*커스텀 데코레이터 만들기 


그럼 이메일을 입력받는데 메일 주소의 도메인을 검증해보자 ! 

// validator를 만들어서 사용할 수도 있음 -> ValidatorConstraintInterface를 implement 해야함
@ValidatorConstraint()
class emailAddressValidator implements ValidatorConstraintInterface{
    // validate() 와 defaultMessage() 를 사용하면됨. 
    validate(value: any, validationArguments?: ValidationArguments): Promise<boolean> | boolean {
        if(typeof value !== 'string') return false;
        return value.endsWith('@naver.com');
    } 
    defaultMessage(validationArguments?: ValidationArguments): string {
        return '메일 주소의 도메인은 @naver.com 이어야합니다. 입력된값 : ($value)'
    }
}


그리고 dto의 email 프로퍼티에

구현해둔 class를 @Validate 데코레이터의 첫번째 파라미터로 입력하면 데코레이터 적용이 된다 

    @Validate(emailAddressValidator)
    email: string;

 

요청을 보내봄. 

검증이 잘됨. 

 


그리고 이렇게 사용할수도 있지만 
나만의 데코레이터 이름을 만들어서 사용하고 싶다면 
'registerDecorator()'함수로 한번 감싸주면 됨 ! 

function IsEmailValidate(validationOptions?: ValidationOptions){
    return function(object: Object, propertyName: string) {
        registerDecorator({
            // target, propertyName, options는 default로 작성해줘야 하는 값임
            target: object.constructor,
            propertyName,
            options: validationOptions,
            validator: emailAddressValidator // 만들어둔 클래스를 validator에 입력
        });
    }
}



이렇게 function IsEmailValidate()를 생성하였고 
이제 @IsPasswordValid 라는 데코레이터로 바로 사용이 가능하다. 
그리고 @IsPasswordValid 의 파라미터로 validationOptions를 전달하여 사용할 수도 있음 !

 

 @IsEmailValidate()
    email: string;

 

 

구글 도메인으로 요청을 날려보면 

유효성 검증이 잘 되는것을 확인할 수 있다.