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/
'SPRING' 카테고리의 다른 글
[Spring] HandlerMethodArgumentResolver 사용하여 Custom Annotation 구현 및 테스트하기 (0) | 2020.09.15 |
---|---|
[Spring] Optional 의 3가지 생성 방법 (0) | 2020.07.25 |
[Spring Boot] @NotNull, @NotEmpty, @NotBlank 의 차이점 및 사용법 (6) | 2020.04.01 |
[Spring] Maven Wrapper 설명 및 실행방법 (1) | 2020.01.31 |
[Spring boot] java 파일을 특정 패키지로 이동 시 발생하는 ConflictingBeanDefinitionException 문제 해결 (9) | 2020.01.03 |