본문 바로가기

SpringFramework Core - I. IoC 컨테이너/9. 어노테이션 기반의 컨테이너 설정

9. 어노테이션 기반의 컨테이너 설정

                                       스프링 설정에 '어노테이션'이 'XML'보다 나은가?

어노테이션 기반의 설정을 소개할 때는, 과연 이 접근이 XML보다 나은가하는 질문을 하게된다. 결론부터 말하자면, '때에 따라 다르다'이다. 좀 더 길게 말하자면, 각 방법은 나름대로의 장단점을 가지고 있고 개발자가 더 적합한 전략을 택하는 것에 달려있다고 할 수 있다. 어노테이션들은 정의되는 방식 덕분에 선언 속에서 많은 맥락을 제공할 수 있다. 이는 더 짧고 간결한 설정을 가능하게 해준다. 그러나 XML은 소스코드의 변경없이, 재컴파일없이 컴포넌트들을 wiring up하는 것에 뛰어나다. 몇몇 개발자는 소스와 밀접하게 wiring하는 것을 선호하는 반면에, 다른 개발자는 어노테이션이 붙은 클래스는 더 이상 POJO가 아니라고 주장한다. 또한 어노테이션이 붙으면 설정이 분산되며 더 제어하기 어려워진다고 주장한다.

어떤 선택을 내렸든, 스프링은 두 스타일을 모두 수용하며 심지어 그 두 가지를 섞기도 한다. JavaConfig 옵션을 통해, 스프링은 어노테이션들이 비침투적으로 사용되도록 할 수 있다는 점을 주목할 필요가 있다. 이를 통해 대상 컴포넌트들은 소스코드가 변경되지 않으며, 도구의 관점에서도 모든 설정 스타일들이 Spring Tools for Eclipse에 의해 지원된다.

 

 XML 설정의 대체재로써 어노테이션 기반의 설정이 제공된다. 어노테이션 기반의 설정은, 꺾쇠괄호(<>) 선언들을 대신하여 바이트코드 메타데이터로 컴포넌트들을 wiring up한다. bean을 wiring하는 데에 XML을 쓰지 않는 대신, 개발자는 설정들을 컴포넌트 클래스 자체로 가지고 들어간다. 관련된 클래스, 메소드, 필드 선언부에 어노테이션을 사용함으로써 말이다. '예시: RequiredAnnotationBeanPostProcessor'에서 언급했듯이, BeanPostProcessor를 어노테이션들과 함께 사용하는 것은 스프링 IoC 컨테이너를 확장하는 일반적인 방법이다. 예를 들어, 스프링 2.0은 @Required 어노테이션을 통해 필수적인 프로퍼티들을 강제할 수 있도록 해준다. 또 스프링 2.5는 스프링의 의존성 주입에 그러한 일반적인 방법을 적용할 수 있도록 해준다. 본질적으로, @Autowired 어노테이션은 '협력자들 Autowiring하기'에서 설명했던 것과 같은 기능을 제공한다. 오히려 좀 더 정교한 제어가 가능하며, 더 넓은 적용범위를 가진다. 스프링 2.5는 또한 JSR-250 어노테이션 지원을 추가했다. @PostConstruct와 @PreDestroy와 같은 어노테이션이 해당된다. 스프링 3.0은 JSR-300의 자바를 위한 의존성 주입 어노테이션 지원을 추가했다. @Inject와 @Named와 같은 이 어노테이션들은 javax.inject 패키지 안에 포함되어 있다.

 

※ 어노테이션 주입은 XML 주입보다 먼저 이뤄진다. 그래서 두 설정 모두와 연결되어 있는 프로퍼티에 어노테이션이 해놓은 설정은 XML 설정에 의해 오버라이드된다. 

 

항상 그렇듯이, 여러분은 어노테이션들을 개별 bean 정의에 등록할 수 있다. 그런데 어노테이션들은 XML 기반의 스프링 설정에 있는 태그를 통해서도 명확하게 등록될 수 있다 ('context'라는 namespace를 포함하고 있음을 주의하라).

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">
        
    <context:annotation-config />
    
</beans>

 (명확히 등록된 후처리기들은 'AutowiredAnnotationBeanPostProcessor', 'CommonAnnotationBeanPostProcessor', 'PersistenceAnnotationBeanPostProcessor', 그리고 이전에 언급한 'RequiredAnnotationBeanPostProcessor'를 포함한다)

 

※ <context:annotation-config />는 애플리케이션 context 안의 bean들이 가진 어노테이션만 찾는다. 만약 DispatcherServlet을 위해서 WebApplicationContext 안에 <context:annotation-config/>를 설정한다면, 서비스가 아니라 컨트롤러인 @Autowired bean들만을 체크할 것이다. 더 자세한 정보는 The DispatcherServlet을 참고하라.