[Spring Boot] Meta Annotation (@Target, @Retention)
들어가며
Spring 에서는 Annotation 사용에 대한 기능을 많이 제공하고 있다. @Controller, @Service, @Component, @Repository 등 많은 Annotation이 존재한다. 해당 Annotation은 각 기능에 필요한 만큼 많은 기능을 내포하고 있으며, 이러한 내용을 잘 알지 못해도 필요한 기능만 쉽게 사용할 수 있도록 제공되어지고 있다.
하지만 이러한 Annotation에 대해 불필요한 내용이 포함되거나 새롭게 필요한 내용이 있는 경우 Custom을 하기도 한다.
그 중 주로 사용되는 @Target과 @Retention에 대해 알아보도록 하겠다.
Meta-Annotation
meta-annotation은 다른 annotation 에서도 사용되는 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-annotation 중 @Target과 @Retention에 대해서 알아보도록 하겠다.
@Target
@Target은 Java Compiler가 annotation이 어디에 적용될지 결정하기 위해 사용한다.
예를 들어, 위에서 사용한 @Service의 ElememtType.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
@Retention은 annotation이 실제로 적용되고 유지되는 범위를 의미한다.
Policy에 관련된 annotation으로, 컴파일 이후에도 JVM에서 참조가 가능한 RUNTIME으로 지정한다.
- RetentionPolicy.RUNTIME : 컴파일 이후에도 JVM에 의해서 계속 참조가 가능
- 주로 reflection이나 logging에 많이 사용
- RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효
- RetentionPolicy.SOURCE : 컴파일 전까지 유효
- 컴파일 이후에는 사라짐
참고
https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Target.html
https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Retention.html
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://sanghye.tistory.com/39