본문 바로가기

SpringFramework Core - I. IoC 컨테이너/10. 클래스패스 스캐닝과 관리받는 컴포넌트들

10.2. 메타 어노테이션과 구성 어노테이션 사용하기

원문: https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-meta-annotations

 

 

스프링으로부터 제공되는 많은 어노테이션들이 메타 어노테이션으로써 사용될 수 있다. 메타 어노테이션은 다른 어노테이션에 적용될 수 있는 어노테이션이다. 예를 들어, @Service 어노테이션은 @Component에 대한 메타 어노테이션이다. 다음 예시를 보자.

 @Target(ElementType.TYPE)
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
 @Component
 public @interface Service {
 
     // ...
 }

메타 어노테이션들을 결합해 "구성 어노테이션"들을 만들어낼 수도 있다. 예를 들어, 스프링 MVC의 @RestController 어노테이션은 @Controller와 @ResponseBody가 구성된 것이다.

 

이와 더불어, 구성 어노테이션들은 커스터마이징을 위해 메타 어노테이션의 속성들을 선택적으로 재선언할 수 있다. 이는 메타 어노테이션 속성들의 부분집합만을 노출하고 싶을 때 특히 유용하다. 예를 들어, 스프링의 @SessionScope 어노테이션은 'session'이라는 scope명으로 하드코딩되어있다. 하지만 여전히 proxyMode의 커스터마이징을 허용한다. 다음은 SessionScope 어노테이션의 정의를 보여준다.

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Scope(WebApplicationContext.SCOPE_SESSION)
public @interface SessionScope {

    /**
    * {@link Scope#proxyMode}에 대한 Alias
    * <p> {@link ScopedProxyMode#TARGET_CLASS}의 기본
    */
    @AliasFor(annotation = Scope.class}
    ScopedProxyMode proxyMode() default ScopedProxyMode.TARGET_CLASS;
    
}

따라서 다음과 같이 proxyMode를 선언하지 않고도 @SessionScope를 사용할 수 있다.

@Service
@SessionScope
public class SessionScopedService {
    // ...
}

다음 예시와 같이 proxyMode의 값을 오버라이드할 수도 있다. 

@Service
@SessionScope(proxyMode = ScopedProxyMode.INTERFACES)
public class SessionScopedUserService implements UserService {
    // ...
}

더 자세한 내용은 '스프링 어노테이션 프로그래밍 모델' 위키페이지를 참조하라.