Posts 커스텀 Annotation
Post
Cancel

커스텀 Annotation

Annotation

애노테이션은 Java 5 부터 등장한 기능으로, 사전적의미는 “주석”이지만, 클래스나 메서드 등 타켓에 라벨을 붙여준다. 비즈니스 로직에는 영향을 주지는 않지만, 해당 타켓의 연결 방법이나 소스 코드의 구조를 변경할 수도 있다. 애노테이션은 소스코드에 메타데이터를 삽입하는 것이기 때문에 잘 이용하면 구독성뿐만 아니라 체계적인 소스코드 구성에도 도움을 준다.

1
2
3
// 애노테이션 예시
@Service
public class ArticleService


커스텀 Annotation

커스텀 애노테이션은 메타 애노테이션을 사용하여 다음과 같은 구조를 가진다.

1
2
3
4
5
6
@Target({ElementType.[적용대상]})
@Retention(RetentionPolicy.[정보유지되는 대상])
public @interface [어노테이션명] {
  public 타입 elementName() [default ]
  ...
}
  • @Target@Retention 등과 같은 메타 애노테이션으로 애노테이션의 성질을 정의한다.

  • 애노테이션이 가질 수 있는 필드 타입은 enum, String, 원시형, 원시형의 배열만 사용할 수 있다.

  • 다음처럼 다른 애노테이션을 추가할 수도 있다.

    1
    2
    3
    4
    5
    
    @Target({ElementType.[적용대상]})
    @Retention(RetentionPolicy.[정보유지되는 대상])
    @Service
    @RequiredArgsConstructor
    public @interface [어노테이션명]
    

메타 애노테이션

  • @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 : 해당 애노테이션이 붙은 대상을 javadoc에 포함시킴
  • @Inherited : 애노테이션의 상속을 가능하게 함
  • @Repeatable : Java8부터 지원하며, 연속적으로 애노테이션을 선언할 수 있게함

속성 정의

애노테이션을 정의할 땐 마치 인터페이스처럼 다양한 속성을 정의할 수 있다.

1
2
3
4
5
6
public @interface MyAnnotation {
  public String name() default "";
  public int age() default 20;
  public String value() default "";
    ...
}

이 중에서 value라는 이름을 가진 속성은 특별한 속성으로, 애노테이션을 사용할 때 아무런 속성이름 없이 하나의 값만 사용하면 자동으로 value 속성에 할당된다.

1
2
3
4
// 여러 속성을 부여할 때
@MyAnnotation(name="Shin", age=20, value="this will be assigned to value")
// 한가지 값만 넣으면 value에 할당된다.
@MyAnnotation("this will be assigned to value")


자바 리플랙션

어플리케이션 실행시 커스텀 애노테이션을 사용한 곳과 지정한 값들을 얻어오려면 자바 리플랙션을 사용해야한다.

1
2
3
4
5
Method method = MyClass.class.getMethod("doThis"); //자바 리플렉션 getMethod로 메서드 doThis를 얻어온다
Annotation[] annotations = method.getDeclaredAnnotations(); //메서드에 선언된 어노테이션 객체를 얻어온다

//메서드 doThat에 선언된 MyAnnotation의 어노테이션 객체를 얻어온다
Annotation annotation = MyClass.class.getMethod("doThat").getAnnotation(MyAnnotation.class);


출처

https://www.nextree.co.kr/p5864/

https://jeong-pro.tistory.com/234

https://velog.io/@potato_song/Java-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98-%EC%BB%A4%EC%8A%A4%ED%85%80-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98-%EB%A7%8C%EB%93%A4%EA%B8%B0

This post is licensed under CC BY 4.0 by the author.

STOMP

Apache Kafka

Comments powered by Disqus.