2013년 7월 23일 화요일

[ORACLE,JAVA개발자실무전문교육,오엔제이프로그래밍실무교육센터, Spring Framework 3.2강좌]ContextLoaderListener, DispatcherServlet이란

ContextLoaderListener, DispatcherServlet이란 
web.xml파일에보면 ContextLoaderListener와 DispatcherServlet이 보이는데 이들의 개념에 대해서 명확히 알 필요가 있다. 

우선 각각 WebApplicationContext의 인스턴스를 생성하는데 ContextLoaderListener가 생성한 컨텍스트가 ROOT Context가되고 DispatcherServlet이 생성한 인스턴스는 ROOT Context를 부모로 하는 자식 컨택스트가 된다.

Spring의 DispatcherServlet은 자체가 서블릿이므로 1개 이상의 DispatcherServlet이 설정되어 기동되는 것이 가능하다. 예를 들어 큰 시스템에 인사관리, 영업관리가 있는데 각각 별도의 디스패 처서블릿으로 설정하고 다른 설정 파일을 정의할 수 있다. 다음과 같은 모양이 된다.

 
<!—인사관리 -->
<servlet>
             <servlet-name>insaServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
             <init-param>
                           <param-name>contextConfigLocation</param-name>
                           <param-value>/WEB-INF/insa-context.xml</param-value>
             </init-param>
             <load-on-startup>1</load-on-startup>
</servlet>
                          
<servlet-mapping>
             <servlet-name> insaServlet </servlet-name>
             <url-pattern>/insa</url-pattern>
</servlet-mapping>
<!—영업관리 -->
<servlet>
             <servlet-name>saleServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
             <init-param>
                           <param-name>contextConfigLocation</param-name>
                           <param-value>/WEB-INF/sale-context.xml</param-value>
             </init-param>
             <load-on-startup>1</load-on-startup>
</servlet>
                          
<servlet-mapping>
             <servlet-name> saleServlet </servlet-name>
             <url-pattern>/sale</url-pattern>
</servlet-mapping>
/insa 요청이 오면 insaServlet으로 정의된 DispatcherServlet이 요청을 처리하며 설정파일로는 insa-context.xml 을 사용한다고 설정하는 것이다. 영업쪽도 마찬가지.
이 경우 인사쪽과 영업쪽은 서로 다른 Context에서 독립적으로 운영되므로 서로 공통 자바빈 같은 것을 공유할 수가 없게 되므로 추후 문제가 될 수 있다. 만약 두 컨트롤러가 공통 자바빈 등을 사용한다면다음과 같이 ContextLoaderListener를 이용하여 정의할 수 있다.
또한 ContextLoaderListener는 contextConfigLocation을 명시하지 않으면 /WEB-INF/applicationContext.xml 파일을 설정파일로 사용한다,
<listener>
             <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
             <param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/ insa-context.xml
               /WEB-INF/ sale-context.xml
</param-value>
</context-param>
<!—인사관리 -->
<servlet>
             <servlet-name>insaServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
                          
<servlet-mapping>
             <servlet-name> insaServlet </servlet-name>
             <url-pattern>/insa</url-pattern>
</servlet-mapping>
<!—영업관리 -->
<servlet>
             <servlet-name>saleServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
             </servlet>
                          
<servlet-mapping>
             <servlet-name> saleServlet </servlet-name>
             <url-pattern>/sale</url-pattern>
</servlet-mapping>
또한 DispatcherServlet은 Front Controller로서 서블릿 컨테이너에서 HTTP 프로토콜을 통해 들어오는 모든 요청을 프리젠테이션 계층의 제일 앞에 둬서 처리할 수 있는 컨트롤러이다.  DispatcherServlet은 서블릿 컨테이너가 생성하고 관리하는 오브젝트로서 스프링이 관여하는 오브젝트가 아니므로 직접 DI를 해줄 방법이 없고 대신 web.xml에서 설정한 웹어플리케이션컨텍스를 참고하여 필요한 전략을 DI하여 사용할 수 있다.
다음은 Spring MVC의 기본 처리 순서이니 기억하자.


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷  실무전문 강의)




1. 사용자의 요청을 DispatcherServlet(Front Controller)이 받음
2. DispatcherServlet URL이나 parameter정보 등을 참고하여 Handler Mapping에게 어떤 컨트롤러에게 작업을 위임할지 알아본다.  하나의 요청을 특정한 Controller와 연결하고자 할 때 DispatcherServlet은 이를 핸들러 매핑 빈에 의뢰 한다.
3. DispatcherServlet 컨트롤러를 부를 때 이 모든 웹 요청 정보가 담긴 HttpServletRequest 타입의 오브젝트를 컨트롤러에게 넘어가는 핸들러 어댑터에 담아서 컨트롤러의 메소드에 전달한다.
4. 컨트롤러가 작업을 하고 최종적으로 DispatcherServlet에게 돌려줄 정보는 모델과 뷰이다.
5. 컨트롤러가 직접 뷰 오브젝트를 리턴할 수도 있지만, 보통은 뷰의 논리적인 이름을 리턴 뷰 리졸버가 이를 이용해 뷰 오브젝트를 생성해준다.
6. 뷰 리졸버를 통해 받은 뷰에게 모델을 전달해주고 클라이언트에게 돌려줄 최종 결과물을 생성해달라고 요청한다.
7. 뷰를 통해 전달받은 최종 결과물은 응답(HttpServletResponse) 오브젝트에 담아 넘긴다.

댓글 없음:

댓글 쓰기