2024. 10. 14. 20:50ㆍSpring Framework/Web on Servlet Stack
WebMvcConfigurer
와 WebFluxConfigurer
의 상세 설명
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
의 주요 메서드
addResourceHandlers
:WebMvcConfigurer
와 마찬가지로, 논블로킹 방식으로 정적 리소스를 처리합니다.configureViewResolvers
: reactive 템플릿 엔진(Thymeleaf, Mustache, FreeMarker 등)을 위한 view resolvers를 설정할 수 있습니다.addCorsMappings
: 논블로킹 요청을 위한 CORS 설정을 처리합니다.addInterceptors
: WebFlux에서의 인터셉터는 비동기 방식으로 동작하는 요청 처리 체인을 추가할 수 있습니다.configureHttpMessageCodecs
: WebFlux에서는 메시지 컨버터 대신 메시지 코덱을 설정합니다. 이는 HTTP 요청 및 응답 본문을 비동기 방식으로 직렬화 및 역직렬화하는 데 사용됩니다.
WebMvcConfigurer
와 WebFluxConfigurer
의 주요 차이점
Programming Model:
WebMvcConfigurer
는 동기식, 요청 당 하나의 스레드를 사용하는 애플리케이션을 위해 설계되었고,WebFluxConfigurer
는 논블로킹, 이벤트 기반의 반응형 애플리케이션을 위한 것입니다.Message Handling: Spring MVC에서는 메시지 컨버터를 사용하고, WebFlux에서는 코덱을 설정합니다. 둘 다 JSON 및 XML과 같은 미디어 타입을 처리하지만, 실행 모델은 다릅니다(블로킹 vs 논블로킹).
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 |