ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 서버 유효성 검사 - Custom Validator 구현 (2) - 날짜 검증
    Programming :: 프로그래밍/JAVA & Spring :: 자바 & 스프링 2023. 9. 22. 14:42

    Spring boot 서버 유효성 검사 Custom Validator 구현 (2)

    이번에는 스프링 부트의 spring-boot-starter-validation을 사용하여 날짜를 검증하는 Custom Validator를 작성해 보았다.

    순서는 지난번 포스팅과 동일하다.

     

    목차
    1. 어노테이션 생성
    2. ConstraintValidator를 구현한 검증 클래스 작성
    3. 검증 대상 필드에 어노테이션 적용

     

     

    1. 먼저 필드에 사용할 어노테이션 클래스를 만든다.

    날짜를 검증할 목적으로 ValidDate라고 이름을 붙여보았다.

    package org.ks.talent.common.validation.annotaion;
    
    import static java.lang.annotation.ElementType.FIELD;
    import static java.lang.annotation.RetentionPolicy.RUNTIME;
    
    import java.lang.annotation.Retention;
    import java.lang.annotation.Target;
    
    import org.ks.talent.common.validation.DateValidator;
    
    import jakarta.validation.Constraint;
    import jakarta.validation.Payload;
    
    @Retention(RUNTIME)
    @Target(FIELD)
    @Constraint(validatedBy = DateValidator.class)
    public @interface ValidDate {
    	String message() default "날짜 입력 형식이 올바르지 않습니다.";
    	Class<?>[] groups() default { };
    	Class<? extends Payload>[] payload() default { };
    }

    기본 템플릿에 메시지만 입력하였고 추가적인 필드는 생성하지 않았다.

     

     

    2. 다음은 실제 검증 로직을 구현한 클래스이다.

    날짜 패턴을 문자열로 직접 입력하고 정규식으로 확인할 수도 있겠지만 그러면 @Pattern을 사용하여 검증을 하는 것과 마찬가지이므로(물론 검증이 필요한 모든 필드에 정규식 문자열 패턴을 각각 입력해주어야 한다...) 굳이 Custom Validator를 만들어서 사용할 이유가 없을 것이다.

    실제 검증이 구현되는 isValid를 override하여 java.time.LocalDate의 parse 메소드를 통해 ISO_LOCAL_DATE (yyyy-MM-dd) 형식으로파싱이 되는지 확인하고 예외 발생 시 검증 실패(false 값 리턴) 처리를 하였다.

    package org.ks.talent.common.validation;
    
    import java.time.LocalDate;
    import java.time.format.DateTimeFormatter;
    import java.time.format.DateTimeParseException;
    
    import org.apache.commons.lang3.StringUtils;
    import org.ks.talent.common.validation.annotaion.ValidDate;
    
    import jakarta.validation.ConstraintValidator;
    import jakarta.validation.ConstraintValidatorContext;
    
    public class DateValidator implements ConstraintValidator<ValidDate, String>{
    
    	@Override
    	public boolean isValid(String value, ConstraintValidatorContext context) {
    		if(StringUtils.isEmpty(value)) return true;
    		try {
    			LocalDate.parse(StringUtils.trim(value), DateTimeFormatter.ISO_LOCAL_DATE);
    			return true;
    		} catch (DateTimeParseException e) {
    			return false;
    		}
    	}
    
    }

     

    3. 마지막으로 해당 annotation을 실제로 필드에 적용한 예이다.

    @Getter
    @Setter
    public class HistorySearchVo extends SearchVo {
    	private int userNo;
    	@ValidDate
    	private String fromDate;
    	@ValidDate
    	private String toDate;
    	@ValidYn
    	private String delYn = "N";
    }
Designed by Tistory.