장쫄깃 기술블로그

[Spring Boot] Meta Annotation (@Target, @Retention) 본문

Spring Framework/Spring Boot

[Spring Boot] Meta Annotation (@Target, @Retention)

장쫄깃 2022. 6. 26. 02:02
728x90


들어가며


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

 

728x90