오랜만에 스프링 프레임워크와 관련된 글을 적는 듯하다. 시간이 지나면서 관심사가 바뀌고 고민 분야가 바뀌다보니 그런 경향이 있는 듯하다. 지금 진행하고 있는 프로젝트에서 공통 모듈을 개발하고 기반을 잡는 일은 내가 아닌 다른 친구가 진행하고 있어서(워낙 잘해주고 있어서 내가 관심을 가지지 않아도 된다.) 나는 다른 쪽 이슈들을 해결하는데 시간을 투자하고 있다. 그러다 지난 주에 각 URL별로 interceptor를 적용할 필요가 있어서 해결책을 찾다보니 다음과 같이 쉽게 해결하는 것이 가능하다는 것을 알았다. 이미 많은 개발자들이 알고 있을텐데 나는 이제서야 알았다. 그래도 아직까지 모르는 개발자가 많다는 생각에 공유하고자 글을 쓴다. 생각보다 이와 관련한 문서가 많지 않았다.
Spring MVC에서 각 URL별로 interceptor를 설정하는 작업은 Spring 2.5에서 Mapping 작업이 Annotation 기반으로 변경되면서 다소 불편하다보니 interceptor를 자주 사용하지 않게 되었다. interceptor를 사용할 필요가 있음에도 불구하고 설정이 불편해서 그냥 Controller 소스에 중복 코드를 만드는 경우도 있었다. 이에 대한 불편함이 계속 제기되자 Annotation 기반으로 interceptor 설정을 하면 좋겠다는 요구사항도 계속해서 발생했다.
Spring MVC 2.5에서 기본적으로 이 기능을 제공하지 않았던 관계로 Spring 기능을 확장해 각 URL별로 interceptor 매핑이 가능하도록 지원하는 라이브러리를 활용해 해결했다. 이 라이브러리는
Spring Framework Annotation-based Controller Interceptor Configuration 문서에서 찾아볼 수 있다. Spring MVC 3.0에서는 이 기능이 기본적으로 포함되었는데 그 동안 interceptor를 설정할 필요가 없다보니 모르고 있었다.
Spring MVC 3.0에서 각 URL별 interceptor 설정은 다음과 같이 mvc namespace를 활용해 해결할 수 있다.
<mvc:annotation-driven />
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/characters/*/url1" />
<mvc:mapping path="/characters/*/url2" />
<bean class="interceptor.CharacterInterceptor" />
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/wikis/*" />
<bean class="interceptor.WikiInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
위와 같이 각 URL별로 적용할 interceptor를 설정하면 끝이다. 생각보다 쉬운 설정이기 때문에 Spring MVC에서 각 Controller에서 공통으로 적용할 필요가 있는 기능이 있다면 interceptor를 활용해 쉽게 해결할 수 있을 것으로 생각한다.