// web.xml 파일
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/context-*.xml</param-value> // Root Context 위치 명시 부분
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/context-servlet.xml</param-value> // Servlet Context 위치
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Root WebApplicationContext는 이름 그대로 최상단에 위치한 Context이다.
WebApplicationContext 서블릿에서만 이용되는 Context이다.
ApplicationContext는 Spring에서 만든 인터페이스로 애플리케이션에 대한 context를 가지고 있다.
WebApplicationContext란 Spring의 ApplicationContext를 확장한 인터페이스로 웹 애플리케이션에서 필요한 몇 가지 기능을 추가한 인터페이스다. 예를 들면 WebApplicationContext의 구현체는 getServletContext라는 메소드를 통해 ServletContext를 얻을 수 있다.
ServletContext는 Servlet API에서 제공하는 context로 모든 servlet이 공유하는 context이다. Spring Web MVC에서는 servletContext가 WebApplicationContext를 가지고 있다. 아래의 그림과 같이 Servlet Context가 WebApplication을 감싸고 있다.
아래에서 Root Application Context와 Servlet Application Context 1~3 모두 WebApplicationContext이다.
WebApplicationContext는 ServletContext와 이 context와 관련있는 Servlet에 접근 할 수 있다.
WebApplicationContext context = new WebApplicationContext();
context.getServletContext();
또한 WebApplicationContext는 ServletContext에 묶여있기 때문에 RequestContextUtils의 정적 메소드를 통해 WebApplicationContext에 접근할 수 있다.
RequestContextUtils.findWebApplicationContext();
즉, WebApplicationContext와 ServletContext는 서로에게 접근 할 수 있다.
Context는 계층구조(부모 자식 관계, 상속 관계)를 가질 수 있다. 다시 말해 하나의 root WebApplicationContext 밑에 여러 개의 child WebApplicationContext를 갖는 것도 가능하다.
공통되는 자원은 root WebApplicationContext에 두고, DispatcherServlet 또는 Servlet 마다 자신만의 child WebApplicationContext를 갖도록 만든다. root WebApplicationContext은 대개 data repository나 비즈니스 서비스와 같이 다른 Servlet 객체에서도 필요한 infrastructure 빈들을 가지고 있고, child WebApplicationContext는 자신의 Servlet에서만 사용할 빈들을 가지고 있다. 물론 root WebApplicationContext의 빈들은 필요한 경우 자식 WebApplicationContext에서 ovverride하여 사용할 수 있다.