본문 바로가기

ADD

[Spring]DispatcherServlet 설정 및 ApplicationContext의 관계

2.1 단계1, DispatcherServlet 설정 및 스프링 컨텍스트 설정

DispatcherServlet은 크라이언트의 요청을 전달받는 서블릿으로서, 컨트롤러나 뷰와 같은 스프링 MVC의 구성 요소를 이용하여 클라이언트에게 서비스를 제공학 된다. DispatcherServlet의 설정은 /WEB-INF/web.xml 파일에 추가하며, 다음과 같이 서블릿과 서블릿 매핑 정보를 추가하면 된다.

 

 <?xml version="1.0" encoding="utf-8"?>

<web-app...>

      <servlet>

             <servlet-name>dispatcher</servlet-name>

              <servlet-class>

                      org.springframework.web.servlet.DispatcherServlet

               </servlet-class>

       </servlet>

       <servlet-mapping>

                <servlet-name>dispatche</servlet-name>

                 <url-pattern>*.htm</url-pattern>

        </servlet-mapping>

</web-app>

위 설정은 *.htm 으로 들어오는 클라이언트의 요청을 DispatcherServlet이 처리 하도록 설정하였다.

DispatcherServlet은 기본적으로  WEB-INF/ 디렉터리에 위치한  [서블릿이름]-servlet.xml 파일 로부터 스프링 설정 정보를 읽어온다.

이파일에서는 HandlerMapping, Controller, ViewResolver,View등의 빈을 설정하게 된다.

 

스프링MVC는 1개 이상의 DispatcherServlet을 설정할 수 있으며, 각 DispatcherServlet이 공유할 수 있는 빈을 설정할 수도 있다.

한 개 이상의 설정 파일을 사용해야 하는 경우가 있다. 또는 기본 설정 파일 이름이 아닌 다른 이름의 설정 파일을 사용 하고 싶은 경우도 있을 것이다.이렇게 기본 설정 파일이 아닌 파일들로부터 설정 정보를 읽어오기 위해서는 다음과같이 DispatcherServlet을 설정할 때 contextConfigLocation초기화 파라미터에 설정 파일 목록을 지정하면 된다.

  <servlet>

             <servlet-name>dispatcher</servlet-name>

              <servlet-class>

                      org.springframework.web.servlet.DispatcherServlet

              </servlet-class>

              <init-param>

              <param-name>contextConfigLocation</param-name>

              <param-value>

                   /WEB-INF/main.xml

                   /WEB-INF/bbs.xml

              </param-value> 

   </servlet>

초기화 파라미터는 설정 파일 목록을 값으로 갖는데 이때 각 설정 파일은 콤마(","), 공백 문자,(" "), 탭(\t), 줄 바꿈(\n), 세미콜론(";") 을 이용하여 구분한다. 각 설정 파일의 경로는 웹 어플리케이션 루트 디렉터리를 기준으로 한다.

 

3.2웹 어플리케이션을 위한 ApplicationContext 설정

DispatcherServlet 는 그자체가 서블릿이게 때문에 1개 이상의 DispatcherServlet을 설정하는것이 가능하다

 <servlet>

             <servlet-name>front</servlet-name>

              <servlet-class>

                      org.springframework.web.servlet.DispatcherServlet

              </servlet-class>

              <init-param>

              <param-name>contextConfigLocation</param-name>

              <param-value>

                   /WEB-INF/front.xml

              </param-value> 

</servlet>

 

<servlet>

             <servlet-name>rest</servlet-name>

              <servlet-class>

                      org.springframework.web.servlet.DispatcherServlet

              </servlet-class>

              <init-param>

              <param-name>contextConfigLocation</param-name>

              <param-value>

                   /WEB-INF/rest.xml

              </param-value> 

   </servlet>

 

위화같이 웹 페이지를 위한 DispatcherServlet과 REST기반의 웹 서비스 연동을 위한 DispatcherServlet을 설정 했다고 치자

이 경우 두 DispatcherServlet은 각각 별도의 WebApplicationContext를 생성하게 된다. 예를들어 위 코드는 "rest"DispatcherServlet는 rest.xml 설정파일을 "front" DispatcherServlet는 front.xml  설정 파일을 사용하도록 설정하고 있는데, 이때, front.xml에서는 rest.xml에 설정된 빈 객체를 사용할 수 없게 된다.

일반적인 웹 어플리케이션에서 컨트롤러는 비즈니스 로직을 구현한 서비스 레이어를 이용하여 클라이언트의 요청을 처리하는 것이 일반적이다. 또한, 서비스 레이어는 영속성 레이어를 사용해서 데이터 접근을 처리하곤 한다. 따라서 front관련 컨트롤러와 rest 관련 컨트롤러는 동일한 서비스 레이어에 대한 의존 관계를 가질 것이다. 서로 다른 DispatcherServlet이 공통 빈을 필요로 하는 경우, ContextLoaderListener를 사용하여 공통으로 사용될 빈을 설정할 수 있게 된다.다음과 같이 ContextLoaderListener를 ServletListener로 등록하고 contextConfigLocation 컨텍스트 파라미터를 이용하여 공통으로 사용될 빈 정보를 담고 있는 설정 파일 목록을 지정하면 된다.

<context-param>

              <param-name>contextConfigLocation</param-name>

              <param-value>/WEB-INF/service.xml, /WEB-INF/persistence.xml</param-value> 

 </context-param>

 

<listener>

     <listener-class>

              org.springframework.web.context.ContextLoaderListener

     </listener-class>

</listener>

 

<servlet>

             <servlet-name>front</servlet-name>

              <servlet-class>

                      org.springframework.web.servlet.DispatcherServlet

              </servlet-class>

</servlet>

 

<servlet>

             <servlet-name>rest</servlet-name>

              <servlet-class>

                      org.springframework.web.servlet.DispatcherServlet

              </servlet-class>

</servlet>

실제로 ContextLoaderListener와 DispatcherServlet은 각각 WebApplicationContext 객체를 생성하는데,  ContextLoaderListener가 생성하는 WebApplicationContext 루트 컨텍스트가 되며, DispatcherServlet이 생성하는 WebApplicationContext  루트 컨텍스트를 부모로 사용하는 자식 컨텍스트가 된다.이때 자식은 root가 제공하는 빈을 사용할 수 있기 때문에 각가의 DispatcherServlet이 공통으로 피요로 하는 빈을 ContextLoaderListener를 이용하여 설정하는 것이다. 

 

ContextLoaderListener는 contextConfigLocation 컨텍스트 파라미터를 명시하지 않으면 /WEB-INF/applicationContext.xml을 설정 파일로 사용한다. 또한,클래스 패스에 위치한 파일로부터 설정 정보를 읽어 오고 싶다면 다음과 같이 "classpath:"접두어를 사용하여 설정 파일을 명시하면 된다.

 

<context-param>

              <param-name>contextConfigLocation</param-name>

              <param-value>

                         classpath:kame/spring/config/service.xml

                         classpath:kame/spring/config/persistence.xml 

                         /WEB-INF/config/message_conf.xml

              </param-value> 

 </context-param>

 

<listener>

     <listener-class>

              org.springframework.web.context.ContextLoaderListener

     </listener-class>

</listener>

 

 

출처 - 웹 개발자를 위한 스프링 2.5 프로그래밍  (최범균 지음)


'ADD' 카테고리의 다른 글

[Spring]Ant 경로 패턴  (0) 2018.08.30
[Spring]요청과 컨트롤러 매핑(HandlerMapping)  (0) 2018.08.30
[Spring]MVC 처리흐름  (0) 2018.08.30
[Spring]DI - 컬렉션 타입 Prop Set  (0) 2018.08.30
[Spring]DI - 컬렉션 타입 Map  (0) 2018.08.30