Spring

Spring Boot 유효성 검증 어노테이션 만들기

Beekei 2022. 1. 28. 15:16
반응형

보통 기본적인 유효성 검증은 Validation 어노테이션들로 설정한다.

만약 더 섬세한 유효성 검증이 필요할때는 자신만에 어노테이션을 만들어 설정할 수 있다.

 

만약 연락처 필드의 유효성 검증(PhoneValidator)을 만든다고 가정해보겠다.

// @Phone 어노테이션
@Inherited
@Documented
@Repeatable
@Constraint(validatedBy = PhoneValidator.class)
@Target({ ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@ReportAsSingleViolation
public @Interface Phone {

    Stirng message() default "please input a phone number.";
    
    Class<?>[] groups() default {}; 
	
    Class<? extends Payload>[] payload() default {};
    
    boolean onlyNumber() default false; // true일땐 숫자 검증
    
}

// @Phone 어노테이션 구현체
public class PhoneValidator implements ConstraintValidator<Phone, String> {
    
    private boolean onlyNumber = false;

    @Override
    public void initialize(Phone phone) {
		this.onlyNumber = phone.onlyNumber();
    }
    
    @Override
    public boolean isValid(String input, ConstraintValidatorContext cxt) {
        if (input == null) return false;
        if (this.onlyNumber) {
            return input.matches("[0-9]*");
        } else {
            return input.matches("[0-9()-]*");
        }
    }
    
}

// 사용법
@Phone(onlyNumber=true)
private String phone;

 

사용한 어노테이션들은 다음과 같다

  • @Constraint : Validation을 수행할 구현체를 설정한다.
  • @Inherited : 자식클래스가 어노테이션을 상속 받을 수 있다.
  • @Documented : 문서에도 어노테이션의 정보가 표현된다.
  • @Repeatable - 반복적으로 어노테이션을 선언할 수 있게 한다.
  • @ReportAsSingleViolation : 여러 어노테이션을 상속해서 사용할 경우, 메세지를 하나만 사용하도록 설정 
  • @Retention : 어노테이션이 적용되는 범위를 설정한다.
    - RetentionPolicy.RUNTIME : 컴파일 이후에도 JVM에 의해서 참조가 가능하다.
    RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효하다.
    - RetentionPolicy.SOURCE : 어노테이션 정보는 컴파일 이후 없어진다.
  • @Target : 어노테이션이 사용될 위치를 설정한다.
    - ElementType.PACKAGE : 패키지 선언 시 사용
    - ElementType.TYPE : 타입 선언 시 사용
    - ElementType.CONSTRUCTOR : 생성자 선언 시 사용
    - ElementType.FIELD : 멤버 변수 선언 시 사용
    - ElementType.METHOD : 메소드 선언 시 사용
    - ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언 시 사용
    - ElementType.LOCAL_VARIABLE : 지역 변수 선언 시 사용
    - ElementType.PARAMETER : 매개 변수 선언 시 사용
    - ElementType.TYPE_PARAMETER : 매개 변수 타입 선언 시 사용
    - ElementType.TYPE_USE : 타입 사용 시 사용​
반응형