@AutoConfiguration
를 잘 이해하려면 스프링 부트가 애노테이션을 활용할때 사용하는 기법을 잘 이해하고,
코드도 살펴보고, 응용하는 방법을 잘 알아야 합니다.
meta-annotation 은 다른 annation 에서도 사용되는 annotation 의 경우를 말하며
custom-annotation
을 생성할 때 주로 사용됩니다.
적용되는 메타어노테이션은ElementType.ANNOTATION_TYPE
를 사용해야 적용 될수 있습니다.
꼭@Target
과@Retention
을 설정해야 합니다.
예를 들어, @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 {
// ....
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Test
@interface UnitTest {
}
public class HelloServiceTest {
@UnitTest
void simpleHelloService_unit_test() {
SimpleHelloService helloService = new SimpleHelloService();
String ret = helloService.sayHello("Test");
Assertions.assertThat(ret).isEqualTo("Hello Test");
}
}
이런 meta-annotaion 중 @Target
과 @Retention
에 대해서 알아보도록 하겠습니다.
@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 : 타입 선언
@Retetion
은 Annotation 이 실제로 적용되고 유지되는 범위를 의미합니다.
RetentionPolicy.RUNTIME
RetentionPolicy.CLASS
RetentionPolicy.SOURCE
RetentionPolicy.RUNTIME
은 컴파일 이후에도 JVM 에 의해서 계속 참조가 가능합니다. 주로 리플렉션이나 로깅에 많이 사용됩니다.
RetentionPolicy.CLASS
은 컴파일러가 클래스를 참조할 때가지 유효합니다.
RetentionPolicy.SOURCE
은 컴파일 전까지만 유효합니다. 즉, 컴파일 이후에는 사라지게 됩니다.
메타 어노테이션을 만들면, 개발자가 어노테이션을 보고 기능을 분류하기 쉬워집니다.
애노테이션을 합쳐놓은 것입니다.
하지만 합쳐놓는것을 나열하다보면 코드가 지져분해집니다.
이때 애노테이션을 합성해서 만들 수 있습니다.
ex) @RestController