본문 바로가기

Programming/Spring

Spring MVC 와 DispatcherServlet

Spring MVC 는 다른 MVC 프레임워크와 동일하게 앞단에 프론트 컨트롤러(DispatcherServler)를 두고있다.

DispatcherServlet - web.xml 에 정의한 서블릿
                                MVC아키텍처로 구성된 프레젠테이션 계층을 만들 수 있도록 설계되어 있다.

[ Spring MVC의 흐름 ]

 

1) DispatcherServlet의 HTTP 요청 접수

자바 서버의 서블릿 컨테이너는 HTTP 프로토콜을 통해 들어오는 요청이 스프링의 DIspatcherServlet에 할당된 것이라면 HTTP 요청 정보를 DIspatcherServlet에 전달.

web.xml에는 DIspatcherServlet이 전달받을 URL의 패턴이 정의되어 있다.

DIspatcherServlet는 공통적으로 진행해야 하는 파라미터조작, 한글 디코딩 같은 전처리 작업이 등록되어 있다면 이를 먼저 수행한다.

web.xml의 설정 (서블릿을 하나 등록하고 해당 서블릿에 매핑을 시켜주는것이 전부이다.)

<web-app>
<servlet>
<servlet-name>example</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>example</servlet-name>
<url-pattern>*.form</url-pattern>
</servlet-mapping>
</web-app>

 

2) DIspatcherServlet에서 컨트롤러로 HTTP 요청 위임

DIspatcherServlet는 URL이나 파라미터 정보, HTTP 명령등을 참고하여 해당 컨트롤러에 작업을 위임.

DIspatcherServlet는 핸들러 매핑전략을 이용하여 컨트롤러를 선정

핸들러 - 컨트롤러를 웹의 요청을 다루는(handle) 오브젝트.

핸들러 매핑전략 - 사용자 요청을 기준으로 어떤 핸들러에게 작업을 위임할 지 결정해주는 것

어댑터 - DIspatcherServlet은 컨트롤러가 어떤 메소드를 가졌고 어떤 인터페이스를 구현하였는지 알지 못한다.
        그래서 사용 어댑터는 자신이 담당하는 컨트롤러에 맞는 호출방법을 이용하여 컨트롤러에 작업 요청을 보내고 결과를 
        돌려받아 DIspatcherServlet에게 다시 돌려주는 기능을 한다.

 

3) 컨트롤러의 모델 생성과 정보 등록

MVC패턴의 장점은 정보를 담고 있는 모델과 정보를 어떻게 뿌려줄지를 알고 있는 뷰가 분리된다는 점이다.

컨트롤러의 역활 : 사용자의 요청을 해석
                        실제 비지니스 로직을 수행하도록 서비스 계층 오브젝트에게 작업을 위임
                        모델(맵에 담긴 정보 - 이름과 그에 대응되는 값의 쌍으로 정보를 만드는 것) 생성
                        뷰 선택

컨트롤러는 모델과 뷰 두 가지 정보는 반드시 DispatcherServlet에 전달해야 한다.

 

4) 컨트롤러의 결과 리턴 : 모델 , 뷰

컨트롤러에게서 뷰의 논리적인 이름을 리턴받아, (DispatcherServlet가) 뷰 리졸버를 이용하여 뷰 오브젝트를 생성.

JSP파일로 만들어진 뷰 템플릿과 JstlView클래스로 만들어진 뷰 오브젝트가 결합하여 HTML을 생성한다.

ModelAndView 오브젝트 - DispatcherServlet이 최종적으로 컨트롤러로부터 돌려받는 오브젝트 
                                        (모델, 뷰 두가지 정보를 담고 있다.)

 

5) DispatcherServlet의 뷰 호출6) 모델 참조

DispatcherServlet은 컨트롤러로부터 받은 모델을 뷰오브젝트에 전달 및 클라이언트에게 돌려줄 최종 결과물을 생성 요청

동적으로 생성되는 부분은 모델을 내용을 참고를 내용을 채운다.

ex) 컨트롤러가 모델에 name이라는 이름으로 'Spring'을 담았다면 아래와 같이 처리된다.

<div> 이름 : ${name} <div> -> <div> 이름 : Spring </div>

HttpsServletResponse오브젝트 - 뷰 작업을 통한 최종 결과물을 담는 오브젝트.

 

7) HTTP응답 돌려주기

DispatcherServlet은 등록된 후처리기가 있는지 확인하고 있으면 후속작업을 진행한 후 뷰가 만들어준 HttpServletResponse에 담긴 최종 결과를 서블릿 컨테이너에게 돌려준다.

서블릿 컨테이너는 HttpServletResponse에 담긴 정보를 HTTP응답으로 만들어 사용자게에 전달해주고 작업을 종료한다.

 

 

[ 다양한 DispatcherServlet의 DI 가능 전략 ]

HandlerMapping

URL과 요청 정보를 기준으로 어떤 핸들러 오브젝트, 즉 컨트롤러를 사용할 것인지 결정하는 로직 담당

DispatcherServlet은 하나의 이상의 핸들러 매핑을 가질 수 있다.

Default - BeanNameUrlHandlerMapping, DefaultAnnotationHandlerMapping

 

HandlerAdapter

핸들러 매핑으로 선택한 컨트롤러/핸들러를 DispatcherServlet이 호출할 때 사용하는 어뎁터

 

HandlerExceptionResolver

예외가 발생하였을 경우 처리하는 로직을 담당

예외가 발생하였을 때 예외의 종류에 따라 DispatcherServlet을 통해 처리되는 작업의 경우, DispatcherServlet에 등록된 HandlerExceptionResolver 중에서 발생한 예외에 적합한 것을 찾아 예외처리를 위임한다.

 

ViewResolver

컨트롤러가 리턴한 뷰이름을 참고하여 적절한 뷰 오브젝트를 찾아주는 로직을 가진 전략 오브젝트

ViewResolving(뷰 리졸빙)http://isstory83.tistory.com/117 


LocaleResolver

지역(Locale)정보를 결정해주는 전략

디폴트인 AcceptHandlerLocaleResolver는 HTTP 헤더 정보를 이용하여 지역정보를 설정한다.

 

원본 : 토비의 스프링3

'Programming > Spring' 카테고리의 다른 글

Spring - POJO  (2) 2012.05.14
Spring - Bean 초기화 및 생명주기  (0) 2012.05.11
Spring - Bean Scope  (0) 2012.05.10
Spring - IoC & DI  (0) 2012.05.09
Spring - AOP 개념 정리  (6) 2012.05.08