📝 상황
실무 개발 중에 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. 해결 방법
- dispatcher-servlet.xml에 context-interceptor.xml을 import 합니다.
- DispatcherServlet이 context-interceptor.xml을 읽어 SessionInterceptor Bean을 등록합니다.
- 그 결과, 인터셉터가 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를 불러 올 수 있다.
'개발' 카테고리의 다른 글
| [Spring Boot] Eclipse Run Configurations의 Profile이란? (0) | 2025.10.19 |
|---|---|
| [Spring] Spring vs Spring Boot (0) | 2025.08.24 |
| [Spring MVC] @RequestParam vs @RequestMapping (1) | 2025.08.16 |
| [Spring/Web] 400 에러, GET vs POST (0) | 2025.08.12 |
| [Maven] Maven, clean install, clean package 이란 (0) | 2025.08.05 |