스프링에서는 모든 서블릿에서 사용될 공유자원을 DI개념으로 사용하기 위해
일반적으로 ContextLoader를 구현한 위 두개의 클래스를 제공한다.
이는 일반적으로 web.xml에 ContextLoaderListener 또는 ContextLoaderServlet 중 하나를
선택적으로 정의해서 사용한다.


목적과 기능은 동일하나 Servlet 2.2 나 2.3 에서는 ContextLoderServlet을,

Servlet 2.4 이상부터는 ContextLoaderListener를 사용하는 것이 권장된다.

백워드 호환을 위해 ContextLoaderServlet를 사용하는게 좋다고 하지만
상황에 따라 명시적으로 선택해서 사용하는 것이 좋을 듯 하다.

WAS에서 지원하는 Servlet버전을 확인하여 그에 맞게 사용하도록 하자.

참고로 Tomcat5.5에서 제공하는 Servlet버전은 2.4 이므로

ContextLoaderListener를 사용하면 되겠다.


각각 선언방법은 아래와 같다.

ContextLoaderListener

 <listener>
  <listener-class>
   org.springframework.web.context.ContextLoaderListener
  </listener-class>
 </listener>


ContextLoderServlet

 <servlet>
  <servlet-name>ContextLoaderServlet</servlet-name>
  <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>


주의할 점은 ContextLoaderServlet를 선언하여 사용할 경우에는
반드시 <load-on-startup>을 기타 명시적인 서블릿보다 적게 지정하여
제일먼저 로드되도록 해야 한다. ContextLoaderListener는 listener로 지정되기 때문에

굳이 지정하지 않아도 서버가 구동될때 제일먼저 로드된다.


ContextLoader에서 사용될 자원의 경우 일반적인 Servlet과 마찬가지로
web.xml에서 param 지정을 통해 명시할 수 있다.
일반적인 param이 아닌 Context param으로 아래와 같이 명시한다.


<context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>


위에서 <param-value>/WEB-INF/applicationContext.xml</param-value> 절은

생략할수도 있는데 이럴 경우 /WEB-INF/applicationContext.xml파일을

기본 설정파일로 사용하게 된다.

<param-value>을 지정할 경우 xml파일의 경로는 물론이고, 파일명도 원하는대로

선언할 수 있다. 프로젝트 성격에 따라 경로는 달라질 수도 있고, 추후 유지보수를 위해서도

위와 같이 명시적으로 선언하는 것을 추천한다.


이렇게 구현된 ContextLoader는 기타 DispatcherServlet의 부모 역할을 하게 되며
ContextLoader의 모든 자원은 DispatcherServlet에서 활용이 가능하게 된다.
단, ContextLoader에서 자식인 DispatcherServlet의 자원을 이용하는 것은 불가능하다.

Servlet에서의 initParam 자원 취득방식은 다음과 같다.
기본적으로 해당 DispatcherServlet에서 자원을 검색하게 되고
없다면 부모인 ContextLoader에서 자원을 검색하게 된다.
만약 ContextLoader에도 해당 자원이 없다면 Exception을 발생시키게 된다.

Posted by mypiece
,