본문 바로가기
프로그래밍

spring meta annotation 정리

by 탁구치는 개발자 2012. 11. 21.
  • 스프링 메타 애노테이션 이란?


스프링에서는 기본적으로 클래스 선언부 위에 @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

 - 서브 클래스가 부모 어노테이션을 상속받도록 한다.