2017년 6월 16일 금요일

context:component-scan vs context:annotation-config vs mvc:annotation-driven

1. context:component-scan

@Component 
@Repository 
@Service 
@Controller 
을 bean으로 등록하고
@Autowired 
@Qualifier
을 인식한다.

2. context:annotation-config

<!--RequiredAnnotationBeanPostProcessor @Required 사용시
         AutowiredAnnotationBeanPostProcessor @Autowired 사용시
         CommonAnnotationBeanPostProcessor @Resource, @PoastConstruct, @PreDestroy 사용시
         ConfigurationClassPostProcessor @Configuration 사용시  
         context를 명시하면 context태그 하나로 사용가능  
        <context:annotation-config/> -->

(context:component-scan 을 정의한 경우 Annotation 인식을 위한 설정 context:annotation-config 을 별도로 추가하지 않아도 됩니다.)

3. mvc:annotation-driven

- DefaultAnnotationHandlerMapping


가장 우선으로 적용되도록 @RequestMapping 을 이용한 핸들러 매핑 전략을 등록한다. 따라서 다른 디폴트 핸들러 매핑 전략은 자동 등록되지 않는다는 점을 기억해두자.


- AnnotationMethodHandlerAdapter


AnnotationMethodHandlerAdapter 는 DispatcherServlet 이 자동으로 등록해주는 디폴트 핸들러 어댑터다. 하지만 디폴트 설정을 변경하려면 빈으로 등록해야 한다. <mvc:annotation-driven> 은 기본적으로 이 AnnotationMethodHandlerAdapter 를 빈으로 등록한다. 따라서 <mvc:annotation-driven> 을 사용했을 때는 직접 AnnotationMethodHandlerAdapter 빈을 등록해서는 안된다. 또, 핸들러 어댑터 전략을 빈으로 등록했으므로 그 밖의 디폴트 핸들러 어댑터 전략은 자동등록되지 않는다.

- ConfigurableWebBindingInitializer


모든 컨트롤러 메소드에 자동으로 적용되는 WebDataBinder 초기화용 빈을 등록하고 AnnotationMethodHandlerAdapter 의 프로퍼티로 연결해 준다.

기본적으로 컨버전 서비스는 @NumberFormat 과 같은 애노테이션 방식의 포맷터를 지원하는 FormattingConversionServiceFactoryBean 이 등록된다.

글로벌 검증기는 LocalValidatorFactoryBean 으로 설정된다. 따라서 JSR-303 의 검증용 애노테이션 기능이 자동으로 제공된다. 단, 이 기능이 적용되려면 JSR-303 지원 라이브러리가 클래스패스에 등록되어 있어야 한다. JSR-303 라이브러리가 없다면 LocalValidatorFactoryBean 은 등록되지 않는다.

- 메시지 컨버터


AnnotationMethodHandlerAdapter 의 messageConverters 프로퍼티로 메시지 컨버터들이 등록된다. 네 개의 디폴트 메시지 컨버터와 함께 Jaxb2RootElementHttpMessageConverter 와 MappingJacksonHttpMessageConverter 가 추가로 등록된다. 단, 각각 JAXB2 와 Jackson 라이브러리가 클래스 패스에 존재하는 경우에만 등록된다.

- <spring:eval> 을 위한 컨버전 서비스 노출용 인터셉터


<spring:eval> 은 기본적으로 표준 컨버터를 이용해서 모델의 프로퍼티 값을 JSP 에 출력할 문자열로 변환한다. 하지만 <mvc:annotation-driven> 을 등록해 주면 <spring:eval> 에서 컨버전 서비스를 이용할 수 있다. ConfigurableWebBindingInitializer 에 등록되는 것과 동일한 컨버전 서비스를 인터셉터를 이용해서 <spring:eval> 태그에서 사용할 수 있도록 제공해주는 기능이 자동으로 추가된다. 이 덕분에 폼에 모델 정보를 출력할 때와 마찬가지로 스프링 컨버터나 포맷터의 강력한 오브젝트-스트링 타입변환 기능이 <spring:eval> 에 적용된다.

<mvc:annotation-driven> 이 자동으로 등록해주는 몇 가지 설정정보는 애트리뷰트를 이용해 바꿀 수 있다. 직접 만든 커스텀 검증기, 컨버전 서비스 등을 적용할 때는 다음과 같은 애트리뷰트를 사용해 등록해주면 된다.


- validator


자동 등록되는 ConfigurableWebBindingInitializer 의 validator 프로퍼티에 적용할 Validator 타입의 빈을 지정할 수 있다. 모든 컨테이너에 일괄 적용하는 검증기는 디폴트로 추가되는 JSR-303 방식의 LocalValidatorFactoryBean 이면 충분하다. 모델 단위의 검증기는 컨트롤러 레벨에서 직접 DI 받아서 사용하는 편이 낫기 때문이다. 하지만 LocalValidatorFactoryBean 을 확장하거나 재구성하려면 직접 빈으로 등록해줄 필요가 있다. 이때 validator 애트리뷰트를 이용해 다음과 같이 등록해 줘야 한다.

- conversion-service


ConfigurableWebBindingInitializer 의 conversionService 프로퍼티에 설정될 빈을 직접 지정할 수 있다. 스프링이 제공하는 컨버전 서비스만 사용한다면 디폴트로 등록되는 FormattingConversionServiceFactoryBean 으로 충분하겠지만, 직접 개발한 컨버터나 포맷터를 적용하려면 FormattingConversionServiceFactoryBean 을 빈으로 직접 등록하고 재구성해줘야 한다. 이때는 conversion-service 애트리뷰트를 이용해 다음과 같이 설정해주면 된다.


<mvc:annotation-driven> 은 매우 빠르고 간편하게 @MVC 의 주요 빈을 설정하고 최신 기능을 사용하게 해준다. 하지만 검증기와 컨버전 서비스를 제외하면 기본적으로 등록되는 빈의 설정을 변경할 수 없다. AnnotationMethodHandlerAdapter 와 DefaultAnnotationHandlerMapping 등의 설정을 변경해야할 때는 <mvc:annotation-driven> 을 사용할 수 없다. 이때는 직접 필요한 빈을 등록하고 프로퍼티를 통해 설정해줘야 한다.

*출처 : http://springsource.tistory.com/90

Share:

0 개의 댓글:

댓글 쓰기