- 스프링 메타 애노테이션 이란?
스프링에서는 기본적으로 클래스 선언부 위에 @Component 애노테이션이 붙어 있으면 스프링 빈으로 생성한다.
하지만 실무에서는 다음과 같이 한다.
Controller 클래스에는 @Controller
Service 클래스에는 @Service
DAO 클래스에는 @Repository
위의 3가지 애노테이션도 스프링 빈으로 생성해주는 애노테이션들이다.
분명 위에서 설명하기를 @Component 애노테이션이 스프링 빈으로 생성해준다고 했는데 왜 위의 3가지 애노테이션도 빈으로 생성해 주는 걸까?
이유는 @Component 애너테이션이 메타 에노테이션으로 달려 있기 때문이다.
이말이 무슨 말이냐하면
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface Service {
public String value() default “”;
}
위와 같이 Service라는 애노테이션 위에 @Component 애노테이션이 달라 붙어 있다는 말이다.
그래서 @Component 애노테이션을 메타 애노테이션이라고 부른다.
결국 스프링에서는 @Service의 애노테이션을 만나면 그 상위의 애노테이션을 검색하여 @Component가 있는지 찾게 되는 것이다.
만약 있으면 빈 후보
없으면 빈 후보 탈락
- meta annotation에 대해서 부가적인 설명
@Target
– ElementType.TYPE : 클래스, 인터페이스, enum 선언부
– ElementType.CONSTRUCTOR : 생성자 선언부
– ElementType.LOCAL_VARIABLE : 지역 변수 선언부
– ElementType.METHOD : 메소드 선언부
– ElementType.PACKAGE : 패키지 선언부
– ElementType.PARAMETER : 파라미터 선언부
@Retention
– RetentionPolicy.RUNTIME : VM에서 유지 (리플렉션을 이용하여 검색 가능)
– RetentionPolicy.SOURCE : 컴파일 시 class 파일에 추가되지 않는다.
– RetentionPolicy.CLASS : 클래스 안에 애노테이션이 추가되지만 VM에서는 사용되지 않는다.
@Documented
– 해당 어노테이션을 Javadoc에 포함한다.
@Inherited
– 서브 클래스가 부모 어노테이션을 상속받도록 한다.