전화번호를 검증하는 것을 진행했었는데, 날짜 입력도 검증해보자
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
var val = value+"01";
var pat = pattern+"dd";
try{
LocalDate date = LocalDate.parse(val, DateTimeFormatter.ofPattern(pat));
System.out.println(date);
return true;
} catch (Exception e){
return false;
}
}
기존의 PhoneNumber와 다른 것은 검증하는 로직이 조금 길어졌다는 것이다.
날짜 입력은 터무니없는 값이 입력될 수 있기 때문에 입력 값을 파싱해 LocalDate값과 비교한다.
val과 pat은 위 설명과 상충한다.
지금은 2024년이므로 LocalDate내 존재하는 값과 비교하도록 01을 붙였고,
내가 정한 입력 포맷은 "yyyy-mm"이므로 LocalDate의 기본 포맷인 "yyyy-mm-dd"와 비교하기 위해서 "dd"를 붙여줬다.
@Constraint(validatedBy = {YearMonthValidator.class})
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@NotBlank
public @interface YearMonth {
String message() default "날짜 양식에 맞지 않습니다. ex)20240608";
String pattern() default "yyyyMM";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
마찬가지로 어노테이션을 만들어주는 인터페이스를 작성해주면
@YearMonth(pattern = "yyyy-MM")
private String yearMonth;
내가 원하는 입력을 검증하도록 어노테이션을 만들 수 있다.

0000년과 3000년은 상식에 맞지 않는 날짜이기 때문에 입력을 받지 않고 싶을 때 할 수 있는 방법이겠다.