본문 바로가기
학습/Java

Validation 어노테이션 직접 만들어보기

코동이 2021. 8. 12.

 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://docs.jboss.org/hibernate/validator/4.1/reference/en-US/html/validator-customconstraints.html#validator-customconstraints-validator

 

https://meetup.toast.com/posts/223

 

https://www.baeldung.com/spring-mvc-custom-validator

반응형

'학습 > 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