build.gradle에 추가한 spring-boot-starter-validation 덕분에 많은 Validaiton 어노테이션들을 사용했고 이것이 전부라고 생각했습니다. 하지만, 알고보니 제가 직접 커스터마이징을 해서 사용할 수 있었습니다. 따라서, 해당 방법에 대해 정리해보고자 합니다.
1. 의존성 추가
// Gradle
implementation 'org.springframework.boot:spring-boot-starter-validation'
2. 어노테이션 생성
"yyyyMM" 형식으로 문자열을 입력했는지 알아보는 어노테이션을 만들고자 한다.
아래는 어노테이션을 만드는 가장 기초적인 방법으로 처음에는 굉장히 낯설겠지만 하나씩 이해하다보면 생각보다 직접 만드는게 어렵지 않다.
@Constraint(validatedBy = { YearMonthValidator.class })
@Target({METHOD, FIELD, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
public @interface YearMonth {
String meessage() default "날짜형식이 유효하지 않습니다";
Class<?>[] groups default {};
Class<? extends Payload>[] payload() default {};
String pattern() default "yyyyMMdd";
}
(message, groups, payload의 내용은 추후에 알아보도록 한다.)
@Constraint : "어떠한 조건에 발동"되는지 정의한 클래스를 적어준다.
@Target : "어느 곳"에 사용이 가능한 어노테이션인지 정의한다. @YearMonth는 메서드, 필드, 생성자, 매개변수에 사용이 가능하다.
@Retention : "어노테이션이 어디서까지 살아서 존재하는지" 정의한다. Runtime 동안에 계속 유효할 것이다.
3. 제약조건 만들기
public class YearMonthValidator implements ConstraintValidator<YearMonth,String> {
private String pattern;
@Override
public void initialize(YearMonth constraintAnnotation) {
this.pattern = constraintAnnotation.pattern();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
//yyyyMM
try {
LocalDate localDate = LocalDate.parse(value+"01", DateTimeForammter.ofPattern("yyyyMMdd"));
} catch(Exception e) {
return false;
}
return true;
}
}
isValid에서 검증한다. value를 날짜형식으로 변환이 가능한지 try catch에서 검사하여 true false를 반환한다.
4. 사용하기
public class User {
private String name;
@Min(size=2)
@Max(size=6)
private int age;
@YearMonth
private String yearMonth;
}
평소 다른 어노테이션을 사용하는 것처럼 @YearMonth를 붙여서 사용하면 된다.
출처
https://meetup.toast.com/posts/223
반응형
'학습 > Java' 카테고리의 다른 글
RestTemplate (0) | 2021.08.15 |
---|---|
Filter vs Interceptor 차이 (Spring) (0) | 2021.08.13 |
@Qualifier & @Resource & @Autowired (0) | 2021.08.12 |
AOP (0) | 2021.08.11 |
Spring MVC (0) | 2021.08.08 |