1. ContextLoaderListener란?


아래와 같은 2개의 dispatcherServlet을 생성했다고 가정해보겠습니다.

<!-- 첫 번째 dispatcherServlet -->
<servlet>
    <servlet-name>A-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-config/a-dispatcher-servlet.xml</param-value>
        </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<!-- 두 번째 dispatcherServlet -->
<servlet>
    <servlet-name>B-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-config/b-dispatcher-servlet.xml</param-value>
        </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

각각의 dispatcherServlet은 각각의 Context를 가집니다. 위처럼 2개를 만들었다면 각각의 dispatcherServlet들이 가지는 2개의 독립적인 Context가 만들어지게 됩니다.

 

A-dispatcher(이하 A)는 a-dispatcher-servlet.xml 파일을 가지고 자신의 Context를 만들 것이고,

B-dispatcher(이하 B)는 b-dispatcher-servlet.xml 파일을 가지고 자신의 Context를 만들 것입니다.

[그림 1] 하나의 애플리케이션이 가지는 두 개의 Context

그런데 만약 A와 B 둘 모두에게 필요한 bean이 있어야한다면 어떻게 해야할까요? (공통적으로 사용될 bean)

이때, 전역변수처럼 전역 Context를 만들어서 그 안에 bean을 생성하면 어디서든 접근이 가능해집니다.

이 때, ContextLoaderListener을 사용해 전역 Context를 생성해줄 수 있습니다.

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

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

위처럼 contextConfigLocation 파라미터를 정의하지 않으면 디폴트로 /WEB-INF/applicationContext.xml을 설정파일로 사용합니다. 이 때, 각 Context간의 관계는 부모-자식 관계가 됩니다.

[그림 2] 컨텍스트간의 관계