ApplicationContext를 써야하는 이유

개요

필자는 스프링을 사용할 때, 웹에 관련된 설정들은 DispatcherServlet에 넣고, 순수 자바 설정들은 ApplicationContext에 넣으라고 배웠다. 그러나 모든 설정을 DispatcherServlet안에 넣어도 잘 작동하는데, 왜 굳이 ApplicationContext를 써야 할까?

예제

스프링 시큐리티 작동 방식을 예로 들어보자. 스프링 시큐리티는 필터를 이용해서 사용자의 인증과 권한 여부를 체크한다. 만약 ApplicationContext를 사용하지 않는다면, 스프링 시큐리티의 설정 파일들을 DispatcherServlet에 정의해야한다. 그렇다면 문제는 무엇일까?

이것은 톰캣 같은 WAS(Web Application Server)가 생성하는 컴포넌트 순서가 중요하다. web.xml에 등록된 컴포넌트가 생성되는 순서는 Listener - Filter - Servlet 순서이다. 심지어 서블릿은 load-on-startup 같은 설정을 해주지 않으면 호출되기 전까지 생성되지도 않는다. 근데 스프링 시큐리티에서 사용할 설정을 서블릿인 DispatcherServlet 안에 넣을 경우, WAS에서 필터를 생성할 때는 아직 DispatcherServlet이 생성되지 않았으므로 시큐리티에 관련된 필터를 생성할 수 없다.

그래서 필터를 생성하기 전에 스프링 관련 설정을 적용하려면 listener에 등록해야 한다.

그렇다면 스프링에서 제공하는 CharacterEncodingFilter는 어떨까? 인코딩 필터는 스프링에서 제공하긴 하지만 encoding 변수만 설정해주면 되기 때문에 web.xml 안에서 설정이 가능하다. 그래서 스프링과는 별도로 작동할 수 있었다.

결론

ApplicationContext를 안썼을 때 문제점이 더 많을 수도 있다. 필자는 이것을 쓰는 것이 싫은 것이 아니다. 과연 어떤 경우에 ApplicationContext가 꼭 필요한가 궁금했었는데, 스프링에서 설정을 기반으로 필터를 등록해야 한다면, ApplicationContext를 Listener로 올리는 것은 선택이 아닌 필수이다.