본문 바로가기

SPRING

[Spring] Meta Annotation 이란?(@Target, @Retention)

Spring 에서는 Anntotation 사용에 대한 기능을 상당히 많이 제공하고 있습니다.

주로 사용하는 @Controller, @Service, @Repostiroy 등 많은 Annotation 이 존재합니다.

해당 Annotion 은 각 기능에 필요한 만큼 많은 기능을 내포하고 있으며, 이러한 내용을 잘 알지 못해도 필요한 기능만 쉽게 사용할 수 있도록 제공되어지고 있습니다.

하지만, 이러한 Annotion 에 대해 불필요한 내용이 포함되거나 필요한 내용이 있는 경우 Cusotom 을 할 경우가 존재합니다.

그 중 로깅 등 AOP 설정할 때 주로 사용되는 @Target@Retention 에 대해 알아보도록 하겠습니다.

 

 

 

meta-annotaiton ?

meta-annotation 은 다른 annation 에서도 사용되는 annotation 의 경우를 말하며 custom-annotation 을 생성할 때 주로 사용됩니다.

예를 들어, @Service 은 bean 으로 등록해주기 위해 @Component 을 내포하고 있는 형태로, 여기서 @Component 가 meta-annotation 입니다.

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component // Spring will see this and treat @Service in the same way as @Component
public @interface Service {

// ....
}
    

이런 meta-annotaion 중 @Target@Retention 에 대해서 알아보도록 하겠습니다.

 

 

 

@Target

@Target 은 Java compiler 가 annotation 이 어디에 적용될지 결정하기 위해 사용합니다.

예를 들어 위에서 사용한 @Service 의 ElementType.TYPE 은 해당 Annotation 은 타입 선언 시 사용한다는 의미입니다.

종류는 다음과 같습니다.

ElementType.PACKAGE : 패키지 선언
ElementType.TYPE : 타입 선언
ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언
ElementType.CONSTRUCTOR : 생성자 선언
ElementType.FIELD : 멤버 변수 선언
ElementType.LOCAL_VARIABLE : 지역 변수 선언
ElementType.METHOD : 메서드 선언
ElementType.PARAMETER : 전달인자 선언
ElementType.TYPE_PARAMETER : 전달인자 타입 선언
ElementType.TYPE_USE : 타입 선언
    

 

 

 

@Retention

@Retetion 은 Annotation 이 실제로 적용되고 유지되는 범위를 의미합니다.

Policy 에 관련된 Annotation 으로 컴파일 이후에도 JVM 에서 참조가 가능한 RUNTIME 으로 지정합니다.

종류는 다음과 같습니다.

RetentionPolicy.RUNTIME
RetentionPolicy.CLASS
RetentionPolicy.SOURCE
    

RetentionPolicy.RUNTIME 은 컴파일 이후에도 JVM 에 의해서 계속 참조가 가능합니다. 주로 리플렉션이나 로깅에 많이 사용됩니다.

RetentionPolicy.CLASS 은 컴파일러가 클래스를 참조할 때가지 유효합니다.

RetentionPolicy.SOURCE 은 컴파일 전까지만 유효합니다. 즉, 컴파일 이후에는 사라지게 됩니다.

 

 

 

결론

실제로 Built-in Annotaiton 을 이용해서 Spring 이나 Java 내에서도 해당 기능이나 상세 내용을 알지 못해도 쉽게 사용할 수 있도록 되어있습니다.

이처럼 해당 Interface 가 캡슐화와 ISP(Interface Segregation Principle) 이 잘되어 있기 때문에 필요한 기능만 손쉽게 사용할 수 있다고 생각합니다.

실무에서도 Annotation 이나 Interface 를 설계할 때 해당 meta-anntation 을 사용하면 원하는 기능을 Client 에게 제공할 수 있습니다.

 

참고

https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Target.htmlhttps://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch29s03.html

https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s11.html

https://docs.oracle.com/javase/7/docs/api/java/lang/annotation/RetentionPolicy.html

https://elfinlas.github.io/2017/12/14/java-annotation/

https://medium.com/@yongkyu.jang/spring-%EC%BB%A4%EC%8A%A4%ED%85%80-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98-custom-annotation-%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-aop%EC%97%90%EC%84%9C%EC%9D%98-%EB%A1%9C%EA%B9%85%EC%B2%98%EB%A6%AC-6f41ceaba091