개발

[Spring MVC] DispatcherServlet과 Interceptor 연결 문제 해결

qwas15788hj 2025. 11. 26. 00:08

📝 상황

실무 개발 중에 Spring MVC 프로젝트에서 인터셉터(SessionInterceptor.java)가 정상적으로 동작하지 않는 현상이 발생했습니다.
원인을 살펴보니, 기존 프로젝트의 web.xml에서 DispatcherServlet 설정이 dispatcher-servlet.xml만 참조하고 있었고, context-interceptor.xml은 로드되지 않는 상태였습니다.
즉, <mvc:interceptor>를 선언한 context-interceptor.xml이 DispatcherServlet 컨텍스트에 포함되지 않아 Spring MVC가 SessionInterceptor를 인식하지 못했던 상황입니다.

*** web.xml ***
DispatcherServlet 설정이 dispatcher-servlet.xml만 되어있음

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:springmvc/dispatcher-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

*** context-interceptor.xml ***
SessionInterceptor.java 파일이 bean 등록 되어있지만, DispatcherServlet 으로 잡혀있지 않음

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.example.security.interceptor.SessionInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

 

 1. 인터셉터의 동작 구조 이해

  • 인터셉터는 Service/DAO가 아니라 Controller 앞에서 동작합니다.
  • 즉, 모든 요청을 컨트롤러로 전달하기 전에 동작하며, 요청 처리 전후에 공통 기능을 수행합니다 (예: 세션 체크, 로그인 검증, 로깅 등).
  • 따라서 인터셉터를 Spring MVC에 등록하려면 DispatcherServlet 컨텍스트 내에서 정의해야 합니다.

 

2. 왜 인터셉터가 동작하지 않았나?

  • 기존 코드는 context-interceptor.xml에 SessionInterceptor.java 파일을 등록했지만, 이 XML 파일은 DispatcherServlet 컨텍스트에 포함되지 않았습니다.
  • Spring MVC에서 Controller 앞에서 동작하는 모든 기능은 DispatcherServlet 컨텍스트 안에 등록된 Bean만 인식합니다.
  • 따라서 context-interceptor.xml에 등록된 SessionInterceptor.java는 DispatcherServlet이 관리하지 않아, 요청 시 적용되지 않았던 것입니다.

 

3. 해결 방법

  1. dispatcher-servlet.xml에 context-interceptor.xml을 import 합니다.
  2. DispatcherServlet이 context-interceptor.xml을 읽어 SessionInterceptor Bean을 등록합니다.
  3. 그 결과, 인터셉터가 Controller 요청 전후로 정상적으로 동작하게 됩니다.
<import resource="classpath:/config/context-interceptor.xml"/>

 

 4. 체크리스트

  • DispatcherServlet 컨텍스트에 인터셉터가 등록되어 있는지 확인
  • .java 파일과 XML 설정이 올바르게 매핑되어 있는지 확인
  • Controller 앞에서 동작해야 하는 기능은 반드시 DispatcherServlet XML에 포함

 

5. 결론

  • 인터셉터는 Service/DAO가 아니라 Controller 앞에서 동작한다.
  • Controller 앞에서 동작하는 모든 기능은 DispatcherServlet XML 안에만 등록할 수 있다.
  • .java 파일을 context-interceptor.xml에 등록했기 때문에 Spring MVC가 찾을 수 없다.
  • dispatcher-servlet.xml에 context-interceptor.xml을 import 등록함으로써 연결 시키며 SessionInterceptor를 불러 올 수 있다.