https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-config.html
https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-config/customize.html#page-title
WebMvcConfigurer는 Spring MVC에서 제공하는 인터페이스로, Spring의 기본 설정을 커스터마이징하는 데 사용됩니다.
주로 URL 매핑, 뷰 리졸버, 리소스 처리, CORS 설정, 인터셉터 등록 등과 같은 MVC 설정을 사용자 정의할 수 있도록 지원합니다.
| 메서드 | 역할 |
|---|---|
addViewControllers(ViewControllerRegistry registry) | 특정 URL에 대해 컨트롤러 없이 바로 뷰를 연결. |
configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) | 기본 서블릿 처리 활성화. |
addResourceHandlers(ResourceHandlerRegistry registry) | 정적 리소스(js, css, 이미지 등) 경로 설정. |
addCorsMappings(CorsRegistry registry) | 전역 CORS(Cross-Origin Resource Sharing) 설정. |
addFormatters(FormatterRegistry registry) | 커스텀 포맷터나 변환기 등록. |
addInterceptors(InterceptorRegistry registry) | 요청 처리 전에 가로채는 인터셉터 등록. |
configureMessageConverters(List<HttpMessageConverter<?>> converters) | HTTP 메시지 변환기 설정 (예: JSON → 객체). |
configureContentNegotiation(ContentNegotiationConfigurer configurer) | 클라이언트 요청에 따라 반환할 데이터 타입 설정 (JSON, XML 등). |
configurePathMatch(PathMatchConfigurer configurer) | URL 경로 매핑 규칙 설정. |
WebMvcConfigurer는 인터페이스이므로 원하는 메서드만 오버라이드하여 사용할 수 있습니다.
주로 @Configuration 어노테이션과 함께 사용됩니다.
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
// 필요한 메서드 오버라이드
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/home").setViewName("home");
registry.addViewController("/login").setViewName("login");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/");
}
/static/ 경로로 접근하면 src/main/resources/static/에서 정적 리소스를 제공.@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**") // CORS 적용 경로
.allowedOrigins("http://example.com") // 허용 도메인
.allowedMethods("GET", "POST") // 허용 HTTP 메서드
.allowCredentials(true); // 쿠키 허용 여부
}
import org.springframework.web.servlet.HandlerInterceptor;
public class CustomInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("Interceptor: Before request processing");
return true; // true일 경우 다음 단계로 진행
}
}
WebMvcConfigurer에 등록:
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new CustomInterceptor())
.addPathPatterns("/api/**") // 적용 경로
.excludePathPatterns("/api/login"); // 제외 경로
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new MappingJackson2HttpMessageConverter());
}
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatter(new DateFormatter("yyyy-MM-dd"));
}
2024-01-01 → 01/01/2024).@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseTrailingSlashMatch(false); // 슬래시 구분 활성화
}
/example/와 /example를 구분.| 특징 | WebMvcConfigurer | @EnableWebMvc |
|---|---|---|
| 사용 목적 | Spring Boot 기본 설정을 유지하며 커스터마이징 가능 | Spring Boot의 기본 MVC 설정을 완전히 대체 |
| 설정 범위 | 필요한 메서드만 오버라이드하여 선택적으로 설정 가능 | 모든 MVC 설정을 수동으로 정의해야 함 |
| 적합한 환경 | 대부분의 Spring Boot 애플리케이션 | 기본 설정을 모두 커스터마이징해야 하는 고급 애플리케이션 |
즉,기존에 설정된 bean 설정을 유지하고 기능을 확장하고 싶다면 @EnableWebMvc 없이 WebMvcConfigurer 타입의@Configuration 클래스를 추가하면 됩니다.
@Configuration
public class WebConfig implements WebMvcConfigurer{
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/",".jsp");
}
}
반면, Spring MVC 의 완전한 제어를 원한다면 @EnableWebMvc 로 어노테이트된 @Configuration 을 추가할 수 있습니다.
또는 @Configuration 어노테이트된 DelegatingWebMvcConfiguration 을 사용할 수 있습니다.
@Configuration
@EnableWebMvc
public class WebConfig{
@Override
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
RequestMappingHandlerMapping handlerMapping = super.requestMappingHandlerMapping();
handlerMapping.setRemoveSemicolonContent(false);
handlerMapping.setOrder(1);
return handlerMapping;
}
}
@Configuration
public class WebConfig extends DelegatingWebMvcConfiguration {
@Override
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
RequestMappingHandlerMapping handlerMapping = super.requestMappingHandlerMapping();
handlerMapping.setRemoveSemicolonContent(false);
handlerMapping.setOrder(1);
return handlerMapping;
}
}