애너테이션을 사용하다보면 기존 애너테이션의 추가적인 기능까지 넣고 싶을 때 커스텀 애너테이션을 사용하게 된다.
애너테이션으로 클래스를 생성하고
@Constraint(validatedBy = {GenderValidator.class})
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidGender {
String message() default "올바른 성별을 입력해주세요";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
이러한 형식으로 작성한다.
설명을 하자면 에너테이션을 만들때는 반드시 아래 3가지 메서드를 구현해야 한다.
하지만 아쉽게도 message()메소드를 제외하면 나머지들은 어떻게 사용하는지 감이 잡히지 않는다...
@Constraint
어노테이션을 활용하면 사용자가 원하는 Constraint
와 Validation
을 만들어 이를 적용할 수 있다.
@Target
어노테이션을 활용하면 적용될 범위를 지정할 수 있다.
@Retention
어노테이션을 활용하면 어노테이션이 어느레벨까지 유지되는지를 결정짓는다.
우리가 커스텀 애너테이션에 적용할 기능을 만들어주어야한다.
GenderValidator로 클래스를 생성하고 ConstraintValidator<>을 구현해야한다.
ConstraintValidator 인터페이스는 <A extends Annotation, T>로 구성되어있다.
그뒤 override를 initialize()
, isValid()
메서드들을 구현해야한다.
initialize메소드는 기능을 상속한 애너테이션을 그대로 쓰겠다는 메서드를 구현하면되고,
isValid메소드는 추가적인 기능을 넣어주면 되는것 같다.