MVC Config API

2024. 10. 14. 20:50Spring Framework/Web on Servlet Stack

WebMvcConfigurerWebFluxConfigurer의 상세 설명

Spring MVC에서, 기본 MVC 구성을 커스터마이즈하려면 WebMvcConfigurer 인터페이스를 구현할 수 있습니다. 이는 Spring의 Java 기반 설정 모델의 일부로, 뷰 해석기, 리소스 핸들러, 인터셉터 등을 포함한 특정 구성 요소를 설정할 수 있습니다. 이 방법은 매우 유연하고 모듈화되어 있으며, 필요한 부분만 재정의할 수 있고, 나머지는 Spring의 기본 동작에 의존할 수 있습니다.

Spring MVC에서의 WebMvcConfigurer

WebMvcConfigurer 개요

WebMvcConfigurer는 Spring MVC 구성을 커스터마이즈하기 위한 콜백 메서드 집합을 제공하는 인터페이스입니다. 이 인터페이스를 구현하면, MVC 프레임워크의 다양한 측면을 제어할 수 있지만 Spring의 기본 구성을 비활성화하지는 않습니다. 이는 다음과 같은 부분의 동작을 조정할 때 유용합니다:

  • Resource handling (예: 정적 리소스 제공)
  • View resolution (뷰 이름을 실제 템플릿으로 매핑)
  • Message converters (JSON, XML 등)
  • CORS (Cross-Origin Resource Sharing) 설정
  • Argument resolvers (Controller의 핸들러 메서드의 아규먼트 처리 방식 커스터마이즈)
  • Interceptors (request의 pre- and post-processing)

Java로 구현한 커스텀 Configuration 예시

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    // Example: Configure static resource handling
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**")
                .addResourceLocations("/public", "classpath:/static/");
    }

    // Example: Configure view resolution
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/views/", ".jsp");
    }

    // Example: Configure CORS settings globally
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
                .allowedOrigins("http://example.com")
                .allowedMethods("GET", "POST");
    }

    // Example: Add interceptors for pre- and post-processing of requests
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyCustomInterceptor());
    }

    // Example: Configure message converters for handling JSON and XML
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new MappingJackson2HttpMessageConverter());
        converters.add(new Jaxb2RootElementHttpMessageConverter());
    }
}


#### `WebMvcConfigurer`의 주요 메서드
1. **`addResourceHandlers`**: 정적 리소스(이미지, JavaScript, CSS 등)를 제공하는 URL 경로와 리소스 위치를 설정합니다. 파일 시스템이나 클래스패스 리소스에서 특정 리소스를 제공할 수 있습니다.

2. **`configureViewResolvers`**: 컨트롤러가 반환하는 뷰 이름을 실제 뷰 템플릿으로 해석하는 방법을 설정합니다. 여기서는 JSP, Thymeleaf, FreeMarker 등의 뷰 기술을 설정할 수 있습니다.

3. **`addCorsMappings`**: CORS 설정을 통해 특정 도메인에서 API에 접근할 수 있도록 하고, 허용되는 HTTP 메서드를 지정할 수 있습니다.

4. **`addInterceptors`**: 요청을 처리하기 전에 또는 후에 실행될 인터셉터를 추가할 수 있습니다. 로깅, 인증, 메트릭 추적 등에 유용합니다.

5. **`configureMessageConverters`**: 객체의 직렬화 및 역직렬화를 처리하는 메시지 컨버터를 설정합니다. 주로 Java 객체를 JSON 또는 XML로 변환하여 HTTP 요청 및 응답을 처리할 때 사용됩니다.

### Reactive 스택에서의 동등한 기능: `WebFluxConfigurer`

Spring WebFlux (반응형 스택)에서는 `WebMvcConfigurer`의 동등한 기능을 `WebFluxConfigurer`로 구현합니다. 이 인터페이스의 목적은 유사하지만, Reactive 환경을 위해 설계되었습니다. WebFlux는 Project Reactor를 기반으로 하며, 논블로킹(non-blocking) 아키텍처를 제공하여 높은 동시성을 적은 스레드로 처리할 수 있습니다.

#### `WebFluxConfigurer`의 주요 개념
`WebFluxConfigurer`는 `WebMvcConfigurer`와 동일한 원칙을 따르지만, Reactive 환경을 위한 것입니다. WebFlux는 비동기식, 논블로킹 요청 처리를 제공하며, 고성능 애플리케이션에 적합합니다.

다음은 Spring WebFlux 애플리케이션에서 `WebFluxConfigurer`를 구현한 예시입니다:

```java
@Configuration
@EnableWebFlux
public class WebFluxConfig implements WebFluxConfigurer {

    // Example: Configure static resource handling for WebFlux
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**")
                .addResourceLocations("/public", "classpath:/static/");
    }

    // Example: Configure view resolution for WebFlux
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.freeMarker().prefix("/WEB-INF/views/").suffix(".ftl");
    }

    // Example: Configure CORS settings for WebFlux
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
                .allowedOrigins("http://example.com")
                .allowedMethods("GET", "POST");
    }

    // Example: Add interceptors in WebFlux
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addWebRequestInterceptor(new MyCustomWebRequestInterceptor());
    }

    // Example: Configure message codecs in WebFlux (similar to message converters in MVC)
    @Override
    public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
        configurer.defaultCodecs().jackson2JsonEncoder(new Jackson2JsonEncoder());
        configurer.defaultCodecs().jackson2JsonDecoder(new Jackson2JsonDecoder());
    }
}

WebFluxConfigurer의 주요 메서드

  1. addResourceHandlers: WebMvcConfigurer와 마찬가지로, 논블로킹 방식으로 정적 리소스를 처리합니다.

  2. configureViewResolvers: reactive 템플릿 엔진(Thymeleaf, Mustache, FreeMarker 등)을 위한 view resolvers를 설정할 수 있습니다.

  3. addCorsMappings: 논블로킹 요청을 위한 CORS 설정을 처리합니다.

  4. addInterceptors: WebFlux에서의 인터셉터는 비동기 방식으로 동작하는 요청 처리 체인을 추가할 수 있습니다.

  5. configureHttpMessageCodecs: WebFlux에서는 메시지 컨버터 대신 메시지 코덱을 설정합니다. 이는 HTTP 요청 및 응답 본문을 비동기 방식으로 직렬화 및 역직렬화하는 데 사용됩니다.

WebMvcConfigurerWebFluxConfigurer의 주요 차이점

  1. Programming Model: WebMvcConfigurer는 동기식, 요청 당 하나의 스레드를 사용하는 애플리케이션을 위해 설계되었고, WebFluxConfigurer는 논블로킹, 이벤트 기반의 반응형 애플리케이션을 위한 것입니다.

  2. Message Handling: Spring MVC에서는 메시지 컨버터를 사용하고, WebFlux에서는 코덱을 설정합니다. 둘 다 JSON 및 XML과 같은 미디어 타입을 처리하지만, 실행 모델은 다릅니다(블로킹 vs 논블로킹).

  3. Concurrency: WebFlux는 논블로킹 동시성 모델을 사용하여, 적은 스레드로 더 많은 동시 요청을 처리할 수 있습니다. 반면 Spring MVC는 요청 당 하나의 스레드 모델로 요청을 처리합니다.

두 프레임워크 모두에서 이러한 설정 인터페이스는 애플리케이션이 요청을 처리하는 방식, 리소스를 처리하는 방법, 뷰를 해석하는 방식 등을 세밀하게 제어할 수 있는 기능을 제공하며, 실행 모델에 따른 차이점이 존재합니다 (블로킹 vs 논블로킹).

'Spring Framework > Web on Servlet Stack' 카테고리의 다른 글

Validation  (0) 2024.10.14
Type Conversion  (0) 2024.10.14
Enable MVC Configuration  (0) 2024.10.14
MVC Config  (0) 2024.10.14
Functional Endpoints  (0) 2024.10.13