❗️문제 상황
✉️ 오류 상황
Spring Boot가 아닌 순수 Spring mvc에서 interceptor를 적용하려고 했지만 계속해서 적용이 안된다.
다음과 같이 xml에서 interceptor를 등록해줬을 때는 정상적으로 인터셉터가 적용이 됐지만
mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/boards/edit/*"/>
<mvc:mapping path="/boards/write"/>
<ref bean="loginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
WebMvcConfigurer를 통해 적용하려고 하니 적용되지 않았음
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
System.out.println("InterceptorConfig.addInterceptors");
registry.addInterceptor(new LoginInterceptor())
.order(1)
.addPathPatterns("/boards/write")
.addPathPatterns("/boards/edit/*");
}
}
💡 해결 방법
🤔 오류가 발생한 이유 및 해결 방법
Comfig 클래스에 @EnableWebMvc를 붙여주지 않아서 발생한 문제였다.
@EnableWebMvc란?
@EnableWebMvc는 Spring의 MVC 설정을 활성화하며, WebMvcConfigurer 인터페이스를 구현한 클래스에서 정의된 설정들을 적용한다. 구체적으로, @EnableWebMvc는 다음과 같은 작업을 수행한다.
- Spring MVC 기본 설정 활성화: Spring MVC에서 필요한 기본적인 설정을 자동으로 구성합니다. 여기에는 뷰 리졸버(ViewResolver), 메시지 컨버터(MessageConverter), 정적 자원 핸들링 등이 포함
- WebMvcConfigurer 설정 적용: WebMvcConfigurer를 구현한 클래스에서 정의한 추가적인 설정(예: 인터셉터, 리소스 핸들러, CORS 설정 등)을 Spring MVC 설정에 통합
@EnableWebMvc를 사용하지 않았을 때, WebMvcConfigurer를 구현한 InterceptorConfig 클래스에서 정의한 인터셉터 설정이 자동으로 적용되지 않았을 가능성이 높다.
이는 Spring Boot의 경우 @SpringBootApplication이 기본적으로 Spring MVC 설정을 처리해주지만, 그렇지 않고 순수 Spring을 사용하는 경우 @EnableWebMvc가 필요하기 때문이다.
내 프로젝트는 Spring Boot가 아닌 전통적인 Spring MVC 설정 방식이기 때문에 이 경우 @EnableWebMvc 애노테이션이 없으면 WebMvcConfigurer에서 제공하는 설정이 적용되지 않는다.
결론
💡 SpringBoot가 아닌 순수 Spring 상황에서는 WebMvcConfigurer를 구현한 클래스에 @EnableWebMvc를 붙여야 한다.