[spring] WebMvcConfigurer란??

Minyoung kim·2024년 11월 26일
0

Spring

목록 보기
5/9

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

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/WebMvcConfigurer.html

1. WebMvcConfigurer란?

WebMvcConfigurer는 Spring MVC에서 제공하는 인터페이스로, Spring의 기본 설정을 커스터마이징하는 데 사용됩니다.

주로 URL 매핑, 뷰 리졸버, 리소스 처리, CORS 설정, 인터셉터 등록 등과 같은 MVC 설정을 사용자 정의할 수 있도록 지원합니다.


2. WebMvcConfigurer의 역할

  1. Spring Boot의 자동 설정을 유지하면서 필요한 부분만 변경:
    • Spring Boot의 기본 설정을 덮어쓰지 않고, 커스터마이징이 필요한 부분만 설정 가능.
  2. 애플리케이션 전역 설정 적용:
    • 공통적으로 적용할 규칙(예: 전역 URL 패턴, 리소스 핸들링, 포맷 설정 등)을 설정.
  3. Spring MVC 기능 확장:
    • 인터셉터, 포맷터, 메시지 컨버터 등을 추가하여 애플리케이션의 요구 사항에 맞게 확장 가능.

3. WebMvcConfigurer의 주요 메서드

메서드역할
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 경로 매핑 규칙 설정.

4. WebMvcConfigurer를 구현하는 방법

WebMvcConfigurer는 인터페이스이므로 원하는 메서드만 오버라이드하여 사용할 수 있습니다.

주로 @Configuration 어노테이션과 함께 사용됩니다.

4.1 기본 구조

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    // 필요한 메서드 오버라이드
}

5. 주요 설정 예제

5.1 뷰 컨트롤러 추가

  • 특정 URL을 처리하기 위해 별도의 컨트롤러 없이 뷰만 연결.
@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/home").setViewName("home");
    registry.addViewController("/login").setViewName("login");
}

사용 사례

  • 로그인 페이지나 정적 페이지와 같이 간단한 URL 매핑이 필요한 경우.

5.2 정적 리소스 핸들링

  • 정적 리소스(js, css, 이미지 등)의 경로를 설정.

코드 예제

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/static/**")
            .addResourceLocations("classpath:/static/");
}

사용 사례

  • /static/ 경로로 접근하면 src/main/resources/static/에서 정적 리소스를 제공.

5.3 CORS 설정

  • 특정 도메인에서 애플리케이션에 접근할 수 있도록 허용(CORS).
@Override
public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/api/**")  // CORS 적용 경로
            .allowedOrigins("http://example.com")  // 허용 도메인
            .allowedMethods("GET", "POST")  // 허용 HTTP 메서드
            .allowCredentials(true);  // 쿠키 허용 여부
}

사용 사례

  • 클라이언트와 서버가 다른 도메인에 있을 때 API 호출 허용.

5.4 인터셉터 추가

  • 요청/응답 전에 특정 로직을 실행.

인터셉터 구현:

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");  // 제외 경로
}

사용 사례

  • 인증, 로깅, 사용자 권한 검사 등 요청 처리 전에 실행해야 하는 로직.

5.5 메시지 컨버터 추가

  • 클라이언트 요청(JSON, XML 등)을 객체로 변환하거나, 객체를 응답으로 변환.
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(new MappingJackson2HttpMessageConverter());
}

사용 사례

  • JSON 요청/응답 변환을 커스터마이징.

5.6 포맷터 및 변환기 등록

  • 데이터 포맷 변환(예: 날짜 형식 변경).
@Override
public void addFormatters(FormatterRegistry registry) {
    registry.addFormatter(new DateFormatter("yyyy-MM-dd"));
}

사용 사례

  • 날짜 형식 변경(2024-01-0101/01/2024).

5.7 PathMatch 설정

  • URL 경로 매핑 규칙을 설정.
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
    configurer.setUseTrailingSlashMatch(false);  // 슬래시 구분 활성화
}

사용 사례

  • /example//example를 구분.

6. WebMvcConfigurer vs @EnableWebMvc

특징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;
    }
}

0개의 댓글