2024. 10. 15. 05:50ㆍSpring Framework/Web on Servlet Stack
Advanced Java Configuration in Spring MVC
Spring MVC의 설정은 기본 모드와 고급 모드로 나뉠 수 있으며, 각각 다른 방식으로 MVC 설정을 구성할 수 있습니다. Spring MVC에서는 @EnableWebMvc
를 사용하여 기본 설정을 활성화하고, WebMvcConfigurer
를 통해 세부 설정을 추가하거나 커스터마이징할 수 있습니다. 하지만 더 고급 모드로 전환할 경우, @EnableWebMvc
를 제거하고 DelegatingWebMvcConfiguration을 확장하여 직접 MVC 설정을 세밀하게 제어할 수 있습니다.
기본 모드와 고급 모드의 차이점
- 기본 모드:
@EnableWebMvc
를 사용하여 Spring MVC의 디폴트 구성을 자동으로 적용합니다.WebMvcConfigurer
인터페이스를 구현하여 필요한 구성을 커스터마이징할 수 있습니다.- 이 방식은 간단한 Spring MVC 애플리케이션에 적합하며, 필요한 구성을 손쉽게 추가할 수 있습니다.
- 고급 모드:
@EnableWebMvc
를 제거하고, DelegatingWebMvcConfiguration 클래스를 직접 확장하여 Spring MVC의 구성을 더 세밀하게 제어할 수 있습니다.DelegatingWebMvcConfiguration
을 확장하면 디폴트 Spring MVC 설정을 제공하면서, 클래스 내부의 빈 선언을 오버라이드할 수 있어 더 높은 수준의 커스터마이징이 가능합니다.- 이 방식은 더 복잡한 MVC 애플리케이션에 적합하며, Spring MVC의 동작 방식을 보다 구체적으로 제어하고 싶은 경우에 유용합니다.
디폴트 모드: @EnableWebMvc와 WebMvcConfigurer
기본적으로 Spring MVC에서 @EnableWebMvc
를 사용하면 DelegatingWebMvcConfiguration이 자동으로 등록됩니다. 이 클래스는 Spring MVC의 디폴트 구성을 처리하며, WebMvcConfigurer
를 통해 사용자 정의 구성을 추가할 수 있도록 설계되었습니다.
@EnableWebMvc
의 역할
@EnableWebMvc
는 Spring MVC를 활성화하고, 기본적인 MVC 구성 요소(예: 뷰 리졸버, 메시지 컨버터 등)를 등록합니다.@EnableWebMvc
는 내부적으로 DelegatingWebMvcConfiguration을 가져와 Spring MVC의 디폴트 구성을 제공하는 역할을 합니다.
WebMvcConfigurer
의 역할
WebMvcConfigurer
인터페이스를 구현함으로써 MVC 구성을 커스터마이징할 수 있습니다. 예를 들어, 뷰 리졸버, 메시지 컨버터, 경로 매칭 설정 등을 쉽게 추가하거나 수정할 수 있습니다.
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/views/", ".jsp");
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new MappingJackson2HttpMessageConverter());
}
}
고급 모드: DelegatingWebMvcConfiguration 확장
고급 모드에서는 @EnableWebMvc
를 사용하지 않고, DelegatingWebMvcConfiguration을 직접 확장하여 MVC 구성을 더 세밀하게 제어할 수 있습니다.
DelegatingWebMvcConfiguration 확장
DelegatingWebMvcConfiguration은 Spring MVC의 핵심 구성을 담당하는 클래스입니다. 이를 확장하면 MVC 구성을 직접 제어하고, 디폴트로 제공되는 구성을 커스터마이징할 수 있습니다.
@Configuration
public class WebConfig extends DelegatingWebMvcConfiguration {
@Override
protected void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/views/", ".jsp");
}
@Override
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new MappingJackson2HttpMessageConverter());
}
@Override
public RequestMappingHandlerMapping requestMappingHandlerMapping(
@Qualifier("mvcContentNegotiationManager") ContentNegotiationManager contentNegotiationManager,
FormattingConversionService mvcConversionService,
ResourceUrlProvider mvcResourceUrlProvider) {
RequestMappingHandlerMapping handlerMapping = super.requestMappingHandlerMapping(
contentNegotiationManager, mvcConversionService, mvcResourceUrlProvider);
handlerMapping.setOrder(0); // 우선순위 설정
return handlerMapping;
}
}
고급 모드의 장점
- 빈 선언 오버라이드 가능:
DelegatingWebMvcConfiguration
을 확장하면, 디폴트로 제공되는 빈(예:RequestMappingHandlerMapping
,ViewResolver
,MessageConverter
등)을 오버라이드하여 더 세부적인 구성이 가능합니다.- 예를 들어,
requestMappingHandlerMapping()
메서드를 오버라이드하여 핸들러 매핑에 대한 추가 구성을 적용할 수 있습니다. 여기서는Order
를 구성하여 매핑의 우선순위를 제어하고 있습니다.
- 예를 들어,
- 더 높은 수준의 커스터마이징: Spring MVC의 거의 모든 구성을 재정의할 수 있어 더 복잡한 요구 사항에 맞춘 구성이 가능합니다. 예를 들어, 메시지 컨버터나 경로 매핑 설정을 더욱 세밀하게 관리할 수 있습니다.
- 디폴트 구성의 제어:
WebMvcConfigurer
로 제공되는 인터페이스 방식보다 더 세부적인 구성 제어가 가능하며, 디폴트 제공 구성을 직접 오버라이드할 수 있습니다. - 다른 WebMvcConfigurer와 함께 사용 가능: 고급 모드에서도 여전히
WebMvcConfigurer
를 사용할 수 있습니다. 여러 개의WebMvcConfigurer
구현체가 클래스패스에 있으면, Spring은 이를 자동으로 탐지하고 구성을 적용합니다.
@Configuration
public class CustomWebConfigurer implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/login").setViewName("login");
}
}
고급 모드를 사용해야 할 때
- 복잡한 애플리케이션: 더 복잡한 애플리케이션에서 Spring MVC의 디폴트 구성을 확장하거나 수정할 필요가 있을 때.
- 커스터마이징 필요: MVC 설정의 세부 항목(예: 핸들러 매핑, 요청 처리 순서 등)을 세밀하게 제어해야 할 때.
- 기본 빈 재정의 필요: 디폴트로 제공되는
RequestMappingHandlerMapping
이나HandlerAdapter
와 같은 빈을 커스터마이징하거나 우선순위를 변경해야 할 때.
고급 모드에서 Spring MVC 구성을 사용하면 더 높은 수준의 커스터마이징을 통해 애플리케이션 요구 사항에 맞춘 세부 구성을 제어할 수 있습니다. @EnableWebMvc
를 사용하여 간편하게 Spring MVC를 구성할 수 있지만, 더 복잡한 요구 사항이 있을 경우 DelegatingWebMvcConfiguration을 직접 확장하여 세부 구성을 제어할 수 있습니다. 고급 모드는 특히 Spring MVC의 디폴트 구성을 넘어서는 애플리케이션에서 유용하게 사용됩니다.
'Spring Framework > Web on Servlet Stack' 카테고리의 다른 글
Spring Web MVC (0) | 2024.10.15 |
---|---|
Path Matching (0) | 2024.10.15 |
Default Servlet (0) | 2024.10.15 |
View Resolvers (0) | 2024.10.15 |
View Controllers (1) | 2024.10.15 |