🧩 WebMvcConfigurer란

정의

WebMvcConfigurerSpring MVC의 기본 설정을 유지하면서 필요한 부분만 선택적으로 커스터마이징할 수 있게 해주는 인터페이스이다. 주로 @EnableWebMvc와 함께 사용한다.

  • 보일러플레이트 설정을 줄여준다.
  • 인터셉터, 뷰 리졸버, 정적 리소스, CORS 등을 조정할 수 있다.
  • Spring MVC의 세부 동작을 앱 요구사항에 맞게 바꿀 수 있다.

⚙️ Gradle 설정

dependencies {
	implementation 'org.springframework:spring-webmvc:5.3.8'
}

🛠 주요 용도

인터셉터 등록

  • 요청을 처리하기 전후에 공통 로직이 필요할 때 사용한다.
@Configuration  
@EnableWebMvc  
@ComponentScan(basePackages = "org.infinity.server.controller.api")
public class MvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor());
    }
}

뷰 리졸버

  • 컨트롤러에서 반환된 뷰 이름을 실제 뷰 객체로 변환한다.
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    registry.viewResolver(resolver);
}

함께 알아둘 점

@EnableWebMvc가 있어야 Spring MVC 기본 설정이 활성화되고, WebMvcConfigurer로 그 설정을 확장할 수 있다.

리소스 핸들링

  • JavaScript, CSS, 이미지 같은 정적 리소스를 제어한다.
  • 요청 경로와 실제 리소스 위치를 매핑한다.
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/assets/**")  
        .addResourceLocations("classpath:/static/assets/");  
	registry.addResourceHandler("/static/**")  
        .addResourceLocations("classpath:/static/");
}

경로 구분

ResourceHandler는 요청 경로이고, ResourceLocation은 실제 리소스 위치다.

example

http://localhost:8080/assets/my.js 요청이 들어오면 classpath:/static/assets/ 경로에서 파일을 찾는다.

Exception 핸들링

  • 컨트롤러 밖으로 던져진 예외를 처리하고 응답 방식을 조정한다.
@Override  
public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {  
    resolvers.add(new MyHandlerExceptionResolver());  
}

메세지 변환

  • 메시지 컨버터를 추가해 JSON, XML 같은 형식의 데이터를 읽고 쓸 수 있게 한다.
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(new MyCustomMessageConverter());
}

Path Matching

  • URL 패턴 매칭 방식을 조정한다.
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
    configurer.setUseTrailingSlashMatch(true);
}

Content Negotiation

  • 클라이언트가 어떤 타입의 응답을 원하는지 협상하는 방식을 설정한다.
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.favorPathExtension(false)
              .favorParameter(true)
              .parameterName("mediaType")
              .ignoreAcceptHeader(true)
              .useRegisteredExtensionsOnly(false)
              .defaultContentType(MediaType.APPLICATION_JSON)
              .mediaType("xml", MediaType.APPLICATION_XML);
}

CORS Configuration

  • 다른 도메인에서 접근할 때 필요한 CORS 규칙을 정의한다.
@Override
public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**")
            .allowedOrigins("http://allowed-origin.com")
            .allowedMethods("GET", "POST")
            .allowCredentials(true);
}

⚠️ 주의사항

  • WebMvcConfigurer는 필요한 설정만 덧붙이는 용도다.
  • @EnableWebMvc 없이 쓰면 기대한 설정이 반영되지 않을 수 있다.
  • 정적 리소스, CORS, 메시지 컨버터는 함께 영향받는 경우가 많다.
  • 오래된 WebMvcConfigurerAdapter는 사용하지 않는 편이 좋다.

📌 정리

  • WebMvcConfigurer는 Spring MVC의 기본 동작을 유지하면서 일부를 커스터마이징하는 인터페이스다.
  • 인터셉터, 뷰 리졸버, 정적 리소스, 예외 처리, 메시지 변환, CORS 설정에 자주 쓴다.
  • @EnableWebMvc와 함께 이해하면 전체 구조가 보인다.

연결문서

댓글남기기