티스토리 뷰

springboot의 version을 2.1.x에서 2.3.x로 변경을 하는 작업을 하였다. 역시 version up에 따른 migration 작업은 호락호락하지 않다. 필자는 다른 곳에서는 아무런 문제도 없었지만 아래 코드부분에서 문제가 발생하였다. 

@Bean
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
    RequestMappingHandlerMapping handlerMapping = createRequestMappingHandlerMapping();
    handlerMapping.setUseSuffixPatternMatch(true);
    handlerMapping.setAlwaysUseFullPath(true);
    handlerMapping.setOrder(0);
    handlerMapping.setInterceptors(sampleInterceptor());
    return handlerMapping;
}

바로 custom interceptor를 적용하는 부분이다. DefaultAnnotationHandlerMapping가 deprecated가 되고 그와 동시에 나온 RequestMappingHandlerMapping을 정의해서 interceptor를 set하는 방식을 사용하고 있었는데 이 부분이 springboot version을 올리면서 문제가 되어서 아예 설정한 interceptor에 진입을 하지 못하는 상황이 발생하였다. Spring Doc을 살펴보니 다음과 같은 구문이 있었다. 

public class RequestMappingHandlerMapping
extends RequestMappingInfoHandlerMapping
implements MatchableHandlerMapping, EmbeddedValueResolverAware
Creates RequestMappingInfo instances from type and method-level @RequestMapping annotations in @Controller classes.
Deprecation Note:

In 5.2.4, useSuffixPatternMatch and useRegisteredSuffixPatternMatch were deprecated in order to discourage use of path extensions for request mapping and for content negotiation (with similar deprecations in ContentNegotiationManagerFactoryBean). For further context, please read issue #24719.

springboot 2.1.x는 spring 5.1.x를 사용하고 springboot 2.3.x는 spring 5.2.x를 사용한다. 그래서 2.1.x에서 2.3.x로 전환을 할대 이 RequestMappingHandlerMapping 부분에 문제가 있는것 같다. 아직 정확하게 파악은 못했지만 useSuffixPatternMatch, useRegisteredSuffixPatternMatch 이런 옵션들이 deprecated 되면서 setInterceptors 부분에도 어떤 영향이 미치는것 같다. 실제로 버전을 변경하고 useSuffixPatternMatch 이 부분을 보면 

이렇게 springboot의 버전 변경에 따라 변경이 되는것을 확인 할 수 있다. 

 

이를 계기로 공부를 해보니 요즘은 이렇게 RequestMappingHandlerMapping 에 interceptor를 설정하지 않고 WebMvcConfigurationSupport의 addInterceptors를 통해서 interceptor를 등록한다. 

 

위의 RequestMappingHandlerMapping 설정 부분을 지우고 WebMvcConfigurationSupport 를 사용하여 interceptor를 등록하자. 

@Configuration
public class WebConfig extends WebMvcConfigurationSupport {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(sampleInterceptor())
            .excludePathPatterns("/css/**")
            .excludePathPatterns("/js/**")
            .excludePathPatterns("/images/**");
    }
}

WebConfig에서 WebMvcConfigurationSupport를 extends 받자. 그리고 addInterceptors를 override하여 구현해준다. 이렇게 하면 springboot version에 관계없이 사용이 가능하다. 또한 includePath, excludePath 등을 지정할 수 있어서 조건에 맞는 interceptor만 작동이 가능하게 할 수도 있다. 

 

끝!

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31