Advanced Java Config

2024. 10. 15. 05:50Spring Framework/Web on Servlet Stack

Advanced Java Configuration in Spring MVC

Spring MVC의 설정은 기본 모드고급 모드로 나뉠 수 있으며, 각각 다른 방식으로 MVC 설정을 구성할 수 있습니다. Spring MVC에서는 @EnableWebMvc를 사용하여 기본 설정을 활성화하고, WebMvcConfigurer를 통해 세부 설정을 추가하거나 커스터마이징할 수 있습니다. 하지만 더 고급 모드로 전환할 경우, @EnableWebMvc를 제거하고 DelegatingWebMvcConfiguration을 확장하여 직접 MVC 설정을 세밀하게 제어할 수 있습니다.

기본 모드와 고급 모드의 차이점

  1. 기본 모드:
    • @EnableWebMvc를 사용하여 Spring MVC의 디폴트 구성을 자동으로 적용합니다.
    • WebMvcConfigurer 인터페이스를 구현하여 필요한 구성을 커스터마이징할 수 있습니다.
    • 이 방식은 간단한 Spring MVC 애플리케이션에 적합하며, 필요한 구성을 손쉽게 추가할 수 있습니다.
  2. 고급 모드:
    • @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;
    }
}

고급 모드의 장점

  1. 빈 선언 오버라이드 가능: DelegatingWebMvcConfiguration을 확장하면, 디폴트로 제공되는 빈(예: RequestMappingHandlerMapping, ViewResolver, MessageConverter 등)을 오버라이드하여 더 세부적인 구성이 가능합니다.
    • 예를 들어, requestMappingHandlerMapping() 메서드를 오버라이드하여 핸들러 매핑에 대한 추가 구성을 적용할 수 있습니다. 여기서는 Order를 구성하여 매핑의 우선순위를 제어하고 있습니다.
  2. 더 높은 수준의 커스터마이징: Spring MVC의 거의 모든 구성을 재정의할 수 있어 더 복잡한 요구 사항에 맞춘 구성이 가능합니다. 예를 들어, 메시지 컨버터나 경로 매핑 설정을 더욱 세밀하게 관리할 수 있습니다.
  3. 디폴트 구성의 제어: WebMvcConfigurer로 제공되는 인터페이스 방식보다 더 세부적인 구성 제어가 가능하며, 디폴트 제공 구성을 직접 오버라이드할 수 있습니다.
  4. 다른 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