기본적인 Spring 설정을 위한 web.xml은..
 <servlet>
  <servlet-name>action</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>
 
 <servlet-mapping>
  <servlet-name>action</servlet-name>
  <url-pattern>*.gs</url-pattern>
 </servlet-mapping>


요런 모양을 갖는다.. 그러면 WEB-INF 밑에
[servlet-name]-servlet.xml 파일로 부터 설정 정보를 읽어오려고 한다.

xml 파일이 없으면 당연이 톰캣 구동시 excpetion이 발생하고...
(<load-on-startup>1</load-on-startup> 이 없으면 구동시 exception은 발생하지 않는다.. 왜냐면 구동시에 servlet이 적재 되는 것이 아니고, 실제 servlet에 접근시 초기화가 진행되기 때문에...)

이 설정 파일을 서블릿별로 지정 할 수 있는데..
아래와 같이 하면 된다..

<servlet>
  <servlet-name>remoting</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
   <param-name>contextConfigLocation</param-name>
   <param-value> /WEB-INF/spring/actions/remoting*.xml </param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
 </servlet>


이렇게 하면 action이라는 Dispatcher서블릿은 톰캣 구동시
지정된 경로에서 xml 설정 파일을 읽어오게 된다.


만일 위와 같은 방법으로 web.xml에 서로 다른 DispatcherServlet을 만들어서 각각 다른 설정 xml을 갖도록 한다면 그 두 DispatcherServlet은 각각 별도의 WebApplicationContext를 생성한다. 즉.. 각각의 xml에 설정되어 있는 빈 객체는 서로 다른 xml에 설정되어 있는 빈 객체를 사용 할 수 없게 된다.
(action.xml 과 remoting.xml)

이런 경우에

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

 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value> /WEB-INF/spring/config/applicationContext*.xml
  /WEB-INF/spring/services/serviceContext*.xml
  /WEB-INF/spring/services/remoting*.xml
  </param-value>
 </context-param>


이렇게 ContextLoaderListner를 ServletListner로 등록하고 공통으로 사용 될 빈 정보를 담고 있는 설정 파일 목록을 지정하면 공통으로 사용 할 수 있다.

ContextLoaderListener와 DispatcherServlet은 각각 WebApplicationContext 객체를 생성하는데
이때 객체간의 관계를 보면

root:WebApplcationContext <- (parent) action:root:WebApplcationContext
                                        <- (parent) root:WebApplcationContext
이라고 한다.
(스프링 2.5 프로그래밍 - 최범균저, 가메출판사 참조)

Posted by 용식