티스토리 뷰

DispatcherServlet 란?

Spring MVC 패턴에서 기본적으로 사용하는 Servlet으로, 클라이언트의 요청이 있을 시 가장 앞단에서 요청을 가로채어(Front Controller) 요청에 매핑되는 Controller에 작업을 전달하고 비지니스 로직 처리 후 해당 결과 View를 클라이언트에 전달하는 역할


DispatcherServlet 흐름도

DispatcherServlet  흐름도 

이미지 출처 : https://mangkyu.tistory.com/18

 

이미지에 잘 설명이 되어있어 스크립팅 하였다.

  1. 클라이언트의 요청을 DistpatcjerServler에 전달

  2. 요청한 url에 맞는 controller 검색하여 HandlerMapping에 전달

  3. HandlerMapping에서 해당 controller에 처리 요청

  4. controller에서 처리 결과를 HandlerAdapter에서 ModelAndView 객체로 변환하여 DispatcherServlet에 전달

  5. DispatcherServlet에서 전달받은 ModelAndView 객체를 이용하여 매핑되는 View를 검색

  6. viewResolver에서 처리 결과를 view에 전달

  7. 처리결과가 포함된 view를 DispatcherServlet에 전달

  8. DispatcherServlet에서 최종 응답 결과를 클라이언트에게 출력

 

 


아래에 첨부한 설정 관련 이미지는 이클립스에서 spring mvc 프로젝트를 생성하였을 때 기본적으로 구성된 형식이다.

 

web.xml 구성

web.xml

 

web.xml 에서 servlet 관련 설정 부분을 상세하게 확인해보면

servlet 태그 안에  설정과

해당 servlet을 사용하고자 mapping 한 부분인 servlet-mapping 태그를 보겠다.

 

먼저, servlet 태그는 사용하고자 하는 servlet을 선언하는 영역으로 

org.springframework.web.servlet.DispatcherServlet을 servlet-class로 할당하며

초기 파라미터로 contextConfigLocation에 값에 /WEB-INF/spring/appServlet/servlet-context.xml을 할당한다.

 

처음에 소개했던 DispatcherServlet 흐름도 관련 이미지의 클라이언트의 요청이 DispatcherServlet으로 할당되는 이유와 관련된 설정이 servlet-mapping 태그이다.

url-pattern이 "/"로 설정되어 있기 때문에 모든 요청은 우리가 설정해 놓은 appServlet으로 전달이 된다.


servlet-contex.xml 구성

servlet-context.xml

해당 xml에서 설정한 값들은 contextConfigLocation 파라미터에 부여되고 DispatcherServlet에서 사용된다.

  • annotation-driven 태그 : @Controller에서 @RequestMapping을 사용하기 위해 선언된 태그이다.
  • resources 태그 : mapping에 부여된 url로 요청이 들어올 경우 DispatcherVerlet에서 처리하지 않고 web resource 영역에서 해당 정적 파일을 찾아가겠다는 mapping 설정 부분
  • ViewResolver bean : 다양한 ViewResolver가 존재하지만 기본 설정에서 사용되는 InternalResourceViewResolver은 @Controller에 요청을 받고 비지니스 로직 처리 후 반환 값을 기준으로 자원 경로의 패턴을 설정한다.              prefix에 자원의 경로를 설정하고 suffix에 확장자를 설정한 것이다.
    • 반환 값이 home 인경우 /WEB-INF/views/home.jsp 가 view로 반환된다.
  • context:component-scan : @Controller, @Repository, @Service, @Component 등의 어노테이션 사용된 클래스 스캔 후 빈으로 등록하는 설정

 

DistpatcherServlet 초기화 

DistpatcherServlet은 한 번도 실행되지 않은 경우 Servlet 생명주기에 의하여 인스턴스 생성 및 초기화를 수행한다.

 

  • javax.servlet.GenericServlet

    • Servlet 생명주기에 의하여 init() 호출

  • javax.servlet.http.HttpServlet extends GenericServlet

  • org.springframework.web.servlet.HttpServletBean extends HttpServlet     

    • override 된 init()에서 initServletBean() 메소드 호출

  • org.springframework.web.servlet.FrameworkServlet extends HttpServletBean

    • override 된 initServletBean()에서 initWebApplicationContext() 메소드 호출

    • initWebApplicationContext()에서 onRefresh() 호출

  • org.springframework.web.servlet.DispatcherServlet extends FrameworkServlet

    • override 된 onRefresh()에서 initStrategies() 호출

    • initStrategies()에서 아래 9개 초기화 메소드 호출

주요 초기화 메소드 설명

  • initHandlerMappings : request 된 url과 매칭 하는 Controller를 검색

  • initHandlerAdapters : HandlerMapping에서 찾은 Controller에서 실행한 결과를 ModelAndView 객체로 변환하여 DispatcherServlet에 전달

  • initHandlerExceptionResolvers : HandlerMapping 및 Controller 작업 수행 중 예외가 발생한 경우를 담당하는 인터페이스

  • initViewResolvers : HandlerAdapter에서 전달된 ModelAndView 객체를 매핑되는 view에 전달

 

DistpatcherServlet 호출

DistpatcherServlet이 초기화된 후 호출할 때는

Servlet 생명주기에 의하여 아래와 같이 service를 호출 과정이 수행된다.

 

  • javax.servlet.GenericServlet

    • Servlet 생명주기에 의하여 service() 호출

  • javax.servlet.http.HttpServlet extends GenericServlet

    • override 된 service() 내에서 overload한  service()에 doGet(), doPost() 등 호출

  • org.springframework.web.servlet.HttpServletBean extends  HttpServlet

  • org.springframework.web.servlet.FrameworkServlet extends HttpServletBean

    • override 된 doGet(), doPost() 등 메소드 내에서 processRequest(request, response); 호출

    • processRequest()에서 doService() 호출

  • org.springframework.web.servlet.DispatcherServlet extends FrameworkServlet

    • override된 doService() 내에서 doDispatch() 호출 

    • doDispatch()에서 HandlerMapping,  HandlerAdapter, HandlerExceptionResolver, ViewResolver, renderring 작업으로 최종 결과를 클라이언트에게 전달.

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함