본문 바로가기
IT/Java

custom annotation 활용

by 성준하이 2023. 6. 2.
반응형

요즘 자바에선, 스프링에선 annotation에 대해서 많이 사용이 되고 없이는 개발이 많이 불편한 시대가 되어버렸다.

 

이전 포스팅에서 annotation에 대해서 많이 다뤘으니 참고를 하는것도 도움이 될것이다.

 

이번 포스팅에서는 aop를 사용할때 필자가 사용했던 custom annotation을 설명하려고 한다.

 

aop 에 대한 내용 역시 아래 참고 포스팅을 참고하길 바란다.(pointcut에 annotation 설정하는 경우)

 

annotation은 일단 interface 로 작동을 하게 된다. interface로 선언을 하니 당연한 내용이다.

 

그리고 annotation을 만들 interface를 만들어준다.

@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.FIELD, ElementType.PARAMETER})
@Documented

@Inherited
@Constraint(validatedBy = ValidTest.class)

public @interface Testanno {
    String value() default "";
    
    String message() default "";
    
    Class<?>[] groups() default { };


    Class<? extends Payload>[] payload() default { };
}

해당 인터페이스의 인자를 하나하나 설명하면 일단 annotation 이름은 Testanno이다.

 

Retention

파일러가 어노테이션을 다루는 방법을 기술, 어느 시점까지 영향을 미치는지를 결정

RetentionPolicy.SOURCE : 컴파일 전까지만 유효

RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효

RetentionPolicy.RUNTIME : 컴파일 이후 런타임 시기에도 JVM 의해 참조가 가능(리플렉션)

 

Target

어노테이션 적용할 위치 선택

ElementType.PACKAGE : 패키지 선언

ElementType.TYPE : 타입 선언

ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언

ElementType.CONSTRUCTOR : 생성자 선언

ElementType.FIELD : 멤버 변수 선언

ElementType.LOCAL_VARIABLE : 지역 변수 선언

ElementType.METHOD : 메서드 선언

ElementType.PARAMETER : 전달인자 선언

ElementType.TYPE_PARAMETER : 전달인자 타입 선언

ElementType.TYPE_USE : 타입 선언

 

Documented

@Documented : 해당 어노테이션을 Javadoc에 포함시킴
@Inherited : 어노테이션의 상속을 가능하게 함
@Repeatable : Java8 부터 지원하며, 연속적으로 어노테이션을 선언할 수 있게 함

 

Inherited

부모 클래스에 해당 Annotation이 선언됐다면 자식클래스에게도 상속시킨다.

 

Constraint

여기서 지정하는 설정은 어떤 검증 클래스를 사용해서 필드의 값을 검증할 건지 지정해준다.

현재는 ValidTest로 되어있는 class의 규칙을 지킨다는 의미이다.

클래스는 아래와 같다.

public class ValidTest
        implements ConstraintValidator<Testanno, Object> {


    @Override
    public void initialize(ProductConstraint annotation) {
      // annotation에 있는 정보를 멤버변수로 저장해서 isValid()에서 사용할 수 있습니다.
    }


    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        return (value !=null);
    }
}

isValid는 boolean 값을 리턴하며 검증을 할수가 있다.

 

그리고 마지막으로 

Custom Constraint Annotation 만들 때는 message, groups 그리고 payload 3개는 정의해야 한다.

message는 메세지 관리,

groups 는 상황별 validation 제어를 위해 사용,

payload는 심각도를 구분하기 위해 사용한다고 한다.

 

 

그럼 예를들어 DTO에 하나의 변수에 @Testanno annotation을 붙여주고
@Valid를 사용하여 검증을 할수가 있다.

 

Valid annotation은 아래 참고 포스팅을 참고하도록 하자.


참고 포스팅

https://thenicesj.tistory.com/91

 

Annotation 소개 및 설명

다른 프로그래밍 언어에도 사용은 되지만 java의 spring/ springboot에서 특히 효율적으로 사용이 되는 Annotation에 대해 알아볼것이다. 영어사전을 찾아보면 뜻은 '주석' 이라는 뜻을 가진 단어인 annotat

thenicesj.tistory.com

https://thenicesj.tistory.com/52

 

[java] lombok 사용법

mvc 패턴을 사용하다 보면 dto나 vo에 대해서 다룬적이 있을것이다. 요즘엔 ide에서 편하게 create getter/ setter 가 있어서 상관은없지만, 이 코드들 또한 너무 불필요하게 길다고 느껴진다. 그러기 위

thenicesj.tistory.com

https://thenicesj.tistory.com/565

 

aop pointcut 정리

저번 포스팅에서 aop 설정법에 대해서 다룬적이 있다. 자세한 내용은 아래 참고 포스팅을 참고 바란다. 사용법은 다음과 같다. 먼저 @Aspect를 선언할 클래스를 만들어준다. @Aspect @Component public class

thenicesj.tistory.com

https://thenicesj.tistory.com/305

 

@Valid annotation (BindingResult, Error)(유효성 검사)

지난번에 다뤘던 포스팅 중에서 not null관련 포스팅도 존재하고, jackson 관련 포스팅도 존재한다. 둘의 공통점은 dto 등에서 변수에 설정을 걸어주는것이다. 하지만 이 둘 말고도 또다른 annotation이

thenicesj.tistory.com

 

반응형

댓글