뚜sh뚜sh

Custom Validation Annotation 만들기 본문

Framework/Spring

Custom Validation Annotation 만들기

뚜sh뚜sh 2024. 1. 27. 12:10
package qt.qr_backend.annotation;

import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Constraint(validatedBy = EnumValidator.class)
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidEnum {
    String message() default "Invalid value. This.is not permitted";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    Class<? extends java.lang.Enum<?>> enumClass();
}

message 메서드

  • 어노테이션이 유효하지 않을 때 출력할 오류 메시지를 반환하는 역할
  • 주로 사용자에게 오류에 대한 설명을 제공하기 위해 활용됨
  • 이 메서드를 정의하지 않으면 기본 오류 메시지가 사용됨

 

group 메서드

  • 어노테이션을 어떤 검증 그룹에 속하게 할 지를 지정하는 데 사용됨
  • Bean Validation에서는 검증 그룹을 정의하여 특정 상황에만 어노테이션을 검사할 수 있도록 할 수 있음
  • 만약 특정 검증 그룹에 어노테이션을 속하게 하려면 이 메서드를 정의하고 해당 그룹을 반환해야 함
  • 그룹을 사용하지 않는 경우 빈 배열({})을 반환하면 됨

 

payload 메서드

  • 어노테이션과 관련된 메타데이터 정보를 제공하는 데 사용됨
  • 주로 사용자 정보의 어노테이션의 특별한 용도에 맞게 활용됨
  • 일반적으로 사용하지 않는 경우 빈 배열({})을 반환하면 됨

 

enumClass 메서드

  • 어노테이션을 사용할 때 사용자가 지정해야 하는 값으로, 어떤 Enum 클래스를 유효성 검사의 대상으로 할 것인지를 나타냄
  • Class 타입의 반환값을 가지며, 이 반환값은 어떤 Enum 클래스를 지정하는 데 사용됨
  • <? extends java.lang.Enum<?>>는 모든 Enum 클래스를 다룰 수 있도록 하는 와일드카드(wildcard) 형태로 표현되어 있으며, 어떤 Enum 타입도 받을 수 있음을 의미함

 

@Constraint

  • 자바 표준 검증인 Bean Validation에서 사용되는 애노테이션 중 하나
  • 커스텀 유효성 검사 애노테이션을 정의할 때 사용
  • 속성
    • 'validatedBy' : 해당 유효성 검사 애노테이션이 어떤 검증기(validator) 클래스에 의해 처리되는 지를 지정함, 이 클래스는 'ConstraintValidator' 인터페이스를 구현해야 함

 

@Target

  • 자바 어노테이션을 어떤 요소에 적용할 수 있는 지를 지정하는 데 사용됨
  • 'ElementType' 열거형을 인수로 받음
  • ElementType 예시
    • ElementType.TYPE: 클래스, 인터페이스, 열거형 등의 선언에 적용 가능
    • ElementType.FIELD: 필드(멤버 변수)에 적용 가능
    • ElementType.METHOD: 메서드에 적용 가능
    • ElementType.PARAMETER: 매개 변수에 적용 가능
    • ElementType.CONSTRUCTOR: 생성자에 적용 가능
    • ElementType.LOCAL_VARIABLE: 지역 변수에 적용 가능
    • ElementType.ANNOTATION_TYPE: 어노테이션 타입(다른 어노테이션에 대한 어노테이션)에 적용 가능
    • ElementType.PACKAGE: 패키지 선언에 적용 가능

 

@Retention

  • 자바 어노테이션이 어느 시점까지 유지되어야 하는 지를 지정하는 데 사용됨
  • 'RetentionPolicy' 열거형을 인수로 받음
  • RetentionPolicy 예시
    • RetentionPolicy.SOURCE: 어노테이션은 컴파일 시간에만 유효하며 클래스 파일에는 포함되지 않음, 따라서 런타임 시에는 어노테이션 정보를 사용할 수 없음
    • RetentionPolicy.CLASS: 어노테이션은 클래스 파일에는 포함되지만, 런타임 시에는 유효하지 않음, 즉, 어노테이션 정보는 런타임 시에는 제공되지 않음
    • RetentionPolicy.RUNTIME: 어노테이션은 컴파일된 클래스 파일에 포함되며, 런타임 시에도 유효함, 이 옵션을 선택하면 어노테이션 정보를 런타임 시에 반영할 수 있음

 

 

 

package qt.qr_backend.annotation;

import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

public class EnumValidator implements ConstraintValidator<ValidEnum, Enum> {
	// 'ValidEnum' 어노테이션의 정보를 저장하기 위한 멤버 변수
    private ValidEnum annotation;

	// 유효성 검사 클래스가 초기화될 때 호출됨
    @Override
    public void initialize(ValidEnum constraintAnnotation) {
        this.annotation = constraintAnnotation;
    }

	// 실제 유효성 검사를 수행하는 메서드
    // value는 검사 대상 값
    @Override
    public boolean isValid(Enum value, ConstraintValidatorContext context) {
        boolean result = false;
        Object[] enumValues = this.annotation.enumClass().getEnumConstants();
        if (enumValues != null) {
            for (Object enumValue : enumValues) {
                if (value.equals(enumValue)) {
                    result = true;
                    break;
                }
            }
        }
        return result;
    }
}
  • 커스텀 어노테이션 '@ValidEnum'을 지원하기 위한 유효성 검사 클래스임
  • 'ConstraintValidator<어노테이션 타입, 검사 대상 필드의 타입>' 인터페이스를 구현하여 실제 유효성 검사 로직 구현
Comments