커스텀 어노테이션
포스트
취소

커스텀 어노테이션

커스텀 어노테이션

  • API 개발 시 @Valid와 BindingResult를 통해 유효성 검사를 하게 되는 경우가 많다.
  • 그런데 유효성 검사가 필요한데, 필요한 어노테이션은 없고, 그 와중에 비슷하게 처리할만한 곳이 여러 곳인 경우가 있다.
  • 한,두군데라면 그냥 if문 써도 무방하지만 그 개수가 많은 경우에는 직접 커스텀 어노테이션을 만드는 것이 좋다.

어노테이션 만들기

  • 아래 예제는 예전에 Fcm을 사용하는 케이스를 위해 만든 구글에서 이것저것 찾아보면서 만든 첫번째 어노테이션이다.
  • 자세히 들어가면 내용이 많아지니 간단하게만 알아보자.
  • @Documented
    • javadoc으로 API 문서를 만들 때 어노테이션에 대한 설명도 포함하도록 지정한다.
  • @Constraint
    • 유효성 검사를 위한 어노테이션일 경우 유효성을 검증하기 위한 클래스를 지정한다.
  • @Target
    • 해당 어노테이션이 동작할 수 있는 범위를 지정한다. (enum)
    • 클래스, 생성자, 지역 변수 등 종류가 다양하다.
    • 자세한 것은 java.lang.annotation.ElementType에서 확인해볼 수 있다.
  • @Retention
    • 어노테이션의 유지 정책을 지정한다.
    • 종류
      • SOURCE
        • 이름 그대로 소스까지만 유지
        • 컴파일 시 사라진다.
      • CLASS
        • 컴파일까지만 유지된다.
        • 컴파일 후 생성되는 .class 파일에는 남아있다.
        • 다만 Java가 실행되는 동안인 런타임 중에는 사용할 수 없다.
      • RUNTIME
        • Java가 VM에서 실행되는 동안에도 유지된다.
@Documented
@Constraint(validatedBy = { CheckFcmTypeValidator.class })
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface CheckFcmType {
    String message() default "지원하지 않는 형식의 송신 유형입니다.";
    Class<?>[] groups() default { };
    Class<? extends Payload>[] payload() default { };
}

Validator

  • 유효성을 검증하는 방식을 만드는 클래스다.
  • 실제 사용될 어노테이션을 제네릭으로 지정한다.
  • 오버라이딩한 isValid 메소드에서의 결과에 따라 유효 여부가 달라진다.
public class CheckFcmTypeValidator implements ConstraintValidator<CheckFcmType, String> {
    List<String> target = Arrays.asList("token", "topic");

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return target.contains(value);
    }
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.