Spring DispatcherServlet

Spring 2017. 3. 21. 22:23
반응형

Spring DispatcherServlet

DispatcherServlet은 Spring MVC 프레임워크에서 Front Controller 역할을 담당한다.

MVC(Model-View-Controller) 패턴

MVC 패턴은 비즈니스 로직과 프레젠테이션 로직이 분리되어 코드의 가독성이 향상되고 유지보수가 용이하다.
MVC로 시스템을 개발하다보면 안전성, 유지보수성을 향상시키기 위해서 공통으로 수행되는 로직을 어느 한 곳에 몰아둘 필요가 생긴다. 중복 코드를 피하기 위함이다.

 

Front Controller 패턴

  • 웹 사이트의 모든 요청을 처리하는 컨트롤러(A controller that handles all requests for a Web site)
  • 인증, 보안, 국제화, 뷰 제공 등의 공통 작업을 수행


Front Controller 구조


Front Controller 구현 예제

After Spring MVC

DispatcherServlet

Spring MVC Framework의 중심이 되는 Servlet
Controller로 향하는 모든 웹 요청의 진입점
Front Controller 디자인 패턴의 표현


Request processing workflow of DispatcherServlet

Spring MVC Components

  • HandlerMapping
  • HandlerAdapter
  • HandlerExceptionResolver
  • ViewResolver
  • LocaleResolver
  • ...

HandlerMapping

  • 서버로 들어온 요청을 어느 핸들러로 전달할 지 결정하는 역할

    // MemberListController.class 
    public class MemberListController extends AbstractController {
      ...
      @Override
      public ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ...
      }
      ...
    }

    이 컨트롤러에 클라이언트 요청을 Mapping 한다면?

    • BeanNameUrlHandlerMapping
      • Bean Name + Url + HandlerMapping
        <!-- servlet-context.xml -->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
        <bean name="/member/list" class="com.blah.blah.MemberListController" />
    • SimpleUrlHandlerMapping

      • Simple Url + HandlerMapping

        <!-- servlet-context.xml -->
        <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
           <property name="mappings">
              <props>
                 <prop key="/member/list">memberListController</prop>
              </props>
           </property>
        </bean>
         
        <bean id="memberListController" class="com.blah.blah.MemberListController" />
    • RequestMappingHandlerMapping
      • @RequestMapping + HandlerMapping
        // MemberListController.class 
        @Controller
        public class MemberListController {
          ...
          @RequestMapping(value="/member/list", method = RequestMethod.GET)
          public String doMemberList() {
            ...
          }
          ...
        }

HandlerAdapter

  • DispatcherServlet과 실제 핸들러 구현체 사이를 이어주는 Object Adapter 역할. DispatcherServlet은 실제 핸들러의 인터페이스를 몰라 핸들러로 요청을 전달하려면 HandlerAdapter를 통해 전달해야 한다.

Spring MVC에서의 Handler란

  • 클라이언트의 요청을 처리(핸들링)하는 주체. 스프링에서는 Controller나 HttpRequestHandler 등을 Handler로 간주한다.

    • Controller는 웹 리퀘스트를 처리하고 뷰를 반환하는 핸들러. 도움말 링크

HandlerExceptionResolver

  • 요청 처리 과정에서 발생하는 예외를 제어하고자 할 때 사용 DefaultHandlerExceptionResolver

ViewResolver

  • 문자열 기반의 view 이름을 토대로 실제 View 구현체를 결정하는 역할
    • InternalResourceViewResolver
    • VelocityViewResolver
    • FreemarkerViewResolver

LocaleResolver / LocaleContextResolver

  • view 렌더링 시 국제화 지원을 위한 Locale과 Timezone을 결정하는 역할
    • AcceptHeaderLocaleResolver
    • CookieLocaleResolver
    • SessionLocaleResolver

MVC 어노테이션

<mvc:annotation-driven /> 또는 @EnableWebMvc

  • HandlerMapping - RequestMappingHandlerMapping
  • HandlerAdapter - RequestMappingHandlerAdapter

DispatcherServlet의 요청 처리 프로세스

DispatcherServlet Class Hierarchy

  • HttpServletBean : HttpServlet을 Spring이 관리하는 Bean으로 등록
  • FrameworkServlet : ApplicationContext 초기화, HTTP 요청을 모음.
  • DispatcherServlet : HandlerExecutionChain 실행, 뷰 렌더링, 요청 처리.

BeanFactory / ApplicationContext / WebApplicationContext

DispatcherServlet의 요청 처리

Handler Execution Chain

  • Handler Execution Chain = Controller + Interceptors

1. 요청 선처리 작업

2. HandlerExecutionChain 결정 및 실행

3. 뷰 렌더링 / 예외 처리

4. 요청 처리 종료

DispatcherServlet 팁

1. DispatcherServlet 초기화에 이용하는 Default 전략

https://github.com/spring-projects/spring-framework/blob/master/spring-webmvc/src/main/resources/org/springframework/web/servlet/DispatcherServlet.properties

2. jackson2 message converter 라이브러리를 pom.xml에 추가만 하면 따로 설정을 잡지 않아도 스프링 MVC에서 자동으로 메시지 변환에 이용.

https://github.com/spring-projects/spring-framework/blob/master/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java (#L583)

References


반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • shared트위터 공유하기
  • shared
  • 카카오스토리 공유하기