WebAplicationContext

배세훈·2021년 8월 16일
0

Spring

목록 보기
11/38
  1. Web.xml의 Root WebApplicationContext 와 WebApplicationContext
// 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>

스프링 어플리케이션에 application context는 2개가 들어간다.

  • ContextLoaderListener에 의해 만들어지는 Root WebApplicationContext
  • DispatcherServlet에 의해 만들어지는 WebApplicationContext
  1. Root WebApplicationContext는 이름 그대로 최상단에 위치한 Context이다.

    • 서비스 계층이나 DAO를 포함한 웹 환경에 독립적인 빈들을 담아둔다.
    • 서로 다른 서블릿컨텍스트에서 공유해야 하는 빈들을 등록해놓고 사용할 수 있다.
    • Servlet context에 등록된 빈들을 이용 불가능하고 servlet context와 공통된 빈이 있다면 servlet context 빈이 우선된다.
    • WebApplication 전체에 사용가능한 DB연결, 로깅 기능들이 이용된다.
  2. WebApplicationContext 서블릿에서만 이용되는 Context이다.

    • DispatcherServlet이 직접 사용하는 컨트롤러를 포함한 웹 관련 빈을 등록하는데 사용한다.
    • DispatcherServlet은 독자적인 WebApplicationContext를 가지고 있고, 모두 동일한 Root WebApplicationContext를 공유한다.

WebApplicationContext vs ApplicaionContext vs ServletContext

  1. ApplicationContext는 Spring에서 만든 인터페이스로 애플리케이션에 대한 context를 가지고 있다.

  2. WebApplicationContext란 Spring의 ApplicationContext를 확장한 인터페이스로 웹 애플리케이션에서 필요한 몇 가지 기능을 추가한 인터페이스다. 예를 들면 WebApplicationContext의 구현체는 getServletContext라는 메소드를 통해 ServletContext를 얻을 수 있다.

  3. 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 Hierarchy(계층)

  • Context는 계층구조(부모 자식 관계, 상속 관계)를 가질 수 있다. 다시 말해 하나의 root WebApplicationContext 밑에 여러 개의 child WebApplicationContext를 갖는 것도 가능하다.

  • 공통되는 자원은 root WebApplicationContext에 두고, DispatcherServlet 또는 Servlet 마다 자신만의 child WebApplicationContext를 갖도록 만든다. root WebApplicationContext은 대개 data repository나 비즈니스 서비스와 같이 다른 Servlet 객체에서도 필요한 infrastructure 빈들을 가지고 있고, child WebApplicationContext는 자신의 Servlet에서만 사용할 빈들을 가지고 있다. 물론 root WebApplicationContext의 빈들은 필요한 경우 자식 WebApplicationContext에서 ovverride하여 사용할 수 있다.

profile
성장형 인간

0개의 댓글