길민호(ethan.mino)
코딩수첩
길민호(ethan.mino)
전체 방문자
오늘
어제
  • 분류 전체보기 (215)
    • Computer Science (0)
    • Web (6)
      • CSS (0)
      • HTML (0)
    • Node.js (0)
    • Javascript (2)
    • Java (46)
      • Spring (27)
      • Jsp (0)
    • C\C++ (2)
    • Programming (0)
    • AI (0)
    • Database (7)
    • Git (5)
    • Algorithm (119)
      • Stack (0)
      • Queue (0)
      • Linked List (0)
      • Sort (0)
      • Simulation (27)
      • Recursion (0)
      • Backtracking (4)
      • Two Pointer (3)
      • Dynamic Programming (19)
      • Greedy (10)
      • Graph (3)
      • Dijkstra (1)
      • BFS\DFS (8)
      • Floyd (1)
      • MST (4)
      • Tree (4)
      • Binary Search (8)
      • Binary Search Tree (4)
    • IntelliJ (4)
    • Vscode (0)
    • Operating System (0)
    • 후기 (3)
    • 성장일지 (13)
    • 스터디 (7)
    • 설치 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ㅡ

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
길민호(ethan.mino)

코딩수첩

DispatcherServlet
Java/Spring

DispatcherServlet

2020. 6. 28. 23:48

Spring MVC를 이해하는 것은 Dispatcher Servlet이 어떻게 동작하는지를 이해하는 것이다.

Dispatcher Servlet이 요청을 받아서 결과를 출력하기까지 여러가지 Component들을 사용한다.

  • Handler Mapping
  • Handler Adapter
  • MultipartResolver
  • LocaleResolver
  • ThemeResolver
  • HandlerExceptionResolver
  • RequestToViewNameTranslator
  • ViewResolver
  • FlashMapManager

DispatcherServlet

  • 프론트 컨트롤러(Front Controller)
  • 클라이언트의 모든 요청을 받을 후 이를 처리할 핸들러에게 넘기고 핸들러가 처리한 결과를 받아 사용자에게 응답 결과를 보여준다.
  • DispatcherServlet은 여러 컴포넌트를 이용해 작업을 처리한다.
  • 이론적으로는 한개 이상 사용될 수 있지만, 보통은 한개만 선언해서 사용한다.

DispatcherServlet의 내부 동작 흐름

1. 요청이 들어오면 요청에 대한 선처리 작업을 수행한다.

DispatcherServlet의 내부 동작 흐름 상세-요청 선처리 작업

  • Spring MVC는 지역화를 지원하는데, 브라우저가 보내는 헤더 정보를 통해 locale을 결정할 수 있다.
  • FlashMap은 리다이렉트로 값을 전달할 때 사용된다. 

선처리 작업시 사용된 Component

org.springframework.web.servlet.LocaleResolver

  • 지역 정보를 결정해주는 전략 오브젝트이다.
  • 디폴트인 AcceptHeaderLocalResolver는 HTTP 헤더의 정보를 보고 지역정보를 설정해준다.

org.springframework.web.context.request.RequestContextHolder

  • 일반 빈에서 HttpServletRequest, HttpServletResponse, HttpSession 등을 사용할 수 있도록 한다.
  • 해당 객체를 일반 빈에서 사용하게 되면, Web에 종속적이 될 수 있다.

org.springframework.web.servlet.FlashMapManager

  • FlashMap객체를 조회(retrieve) & 저장을 위한 인터페이스
  • RedirectAttributes의 addFlashAttribute메소드를 이용해서 저장한다.
  • 리다이렉트 후 조회를 하면 바로 정보는 삭제된다.

org.springframework.web.multipart.MultipartResolver

  • 멀티파트 파일 업로드를 처리하는 전략

 

DispatcherServlet의 내부 동작 흐름 상세-요청 전달

 

요청 전달시 사용된 컴포넌트

org.springframework.web.servlet.HandlerMapping

  • HandlerMapping구현체는 어떤 핸들러가 요청을 처리할지에 대한 정보를 알고 있다.
  • 디폴트로 설정되는 있는 핸들러매핑은 BeanNameHandlerMapping과 DefaultAnnotationHandlerMapping 2가지가 설정되어 있다.

org.springframework.web.servlet.HandlerExecutionChain

  • HandlerExecutionChain구현체는 실제로 호출된 핸들러에 대한 참조를 가지고 있다.
  • 즉, 무엇이 실행되어야 될지 알고 있는 객체라고 말할 수 있으며, 핸들러 실행전과 실행후에 수행될 HandlerInterceptor도 참조하고 있다.

org.springframework.web.servlet.HandlerAdapter

  • 실제 핸들러를 실행하는 역할을 담당한다.
  • 핸들러 어댑터는 선택된 핸들러를 실행하는 방법과 응답을 ModelAndView로 변화하는 방법에 대해 알고 있다.
  • 디폴트로 설정되어 있는 핸들러어댑터는 HttpRequestHandlerAdapter, SimpleControllerHandlerAdapter, AnnotationMethodHanlderAdapter 3가지이다.
  • @RequestMapping과 @Controller 어노테이션을 통해 정의되는 컨트롤러의 경우 DefaultAnnotationHandlerMapping에 의해 핸들러가 결정되고, 그에 대응되는 AnnotationMethodHandlerAdapter에 의해 호출이 일어난다.

 

DispatcherServlet 내부 동작흐름 상세 - 요청 처리

요청 처리시 사용된 컴포넌트

org.springframework.web.servlet.ModelAndView

  • ModelAndView는 Controller의 처리 결과를 보여줄 view와 view에서 사용할 값을 전달하는 클래스이다.

org.springframework.web.servlet.RequestToViewNameTranslator

  • 컨트롤러에서 뷰 이름이나 뷰 오브젝트를 제공해주지 않았을 경우 URL과 같은 요청정보를 참고해서 자동으로 뷰 이름을 생성해주는 전략 오브젝트이다. 디폴트는 DefaultRequestToViewNameTranslator이다.

 

DispatcherServlet 내부 동작흐름 상세 - 예외처리

예외 처리시 사용된 컴포넌트

org.springframework.web.servlet.handlerexceptionresolver

  • 기본적으로 DispatcherServlet이 DefaultHandlerExceptionResolver를 등록한다.
  • HandlerExceptionResolver는 예외가 던져졌을 때 어떤 핸들러를 실행할 것인지에 대한 정보를 제공한다.

 

DispatcherServlet 내부 동작흐름 상세 - 뷰 렌더링 과정

 

뷰 렌더링 과정시 사용된 컴포넌트

org.springframework.web.servlet.ViewResolver

  • 컨트롤러가 리턴한 뷰 이름을 참고해서 적절한 뷰 오브젝트를 찾아주는 로직을 가진 전략 오프젝트이다.
  • 뷰의 종류에 따라 적절한 뷰 리졸버를 추가로 설정해줄 수 있다.

 

DispatcherServlet 내부 동작흐름 상세 - 요청 처리 종료

참조 URL

  • https://www.edwith.org/boostcourse-web/lecture/16763/
  • Overview of Spring MVC Architecture terasolunaorg.github.io/guideline/1.0.1.RELEASE/en/Overview/SpringMVCOverview.html
  • Modules docs.spring.io/spring/docs/3.0.0.M4/reference/html/ch01s02.html
  • Spring MVC - DispatcherServlet 동작 원리 jess-m.tistory.com/15
  • Spring DispatcherServlet의 기본 7가지 DI 전략 kimddochi.tistory.com/86
  • Spring MVC - Full java based config samerabdelkafi.wordpress.com/2014/08/03/spring-mvc-full-java-based-config/
  • web.xml vs initializer with Spring www.baeldung.com/spring-xml-vs-java-config
  • Spring - Mixing XML and JavaConfig www.mkyong.com/spring/spring-mixing-xml-and-javaconfig/
  • arey/spring-javaconfig-sample github.com/arey/spring-javaconfig-sample/blob/master/src/main/webapp/WEB-INF/web.xml
  • WebMvcConfigurationSupport docs.spring.io/spring/docs/3.0.6.RELEASE_to_3.1.0.BUILD-SNAPSHOT/3.1.0.BUILD-SNAPSHOT/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.html
  • Spring mvc (2) 그리고 Spring boot wonwoo.ml/index.php/post/1590
  • Migrate Spring MVC servlet.xml to java Config www.luckyryan.com/2013/02/07/migrate-spring-mvc-servlet-xml-to-java-config/
  • Spring RequestMapping www.baeldung.com/spring-requestmapping

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

Spring MVC가 지원하는 메서드 Annotation  (0) 2020.06.29
Spring MVC가 지원하는 Controller 인수 타입  (0) 2020.06.29
Spring MVC 기본 동작 흐름  (0) 2020.06.28
Spring 싱글톤(Singleton) Scope  (0) 2020.06.28
DB에 Insert 할 때, SimpleJdbcInsert을 사용하는 이유는?  (0) 2020.06.28
    'Java/Spring' 카테고리의 다른 글
    • Spring MVC가 지원하는 메서드 Annotation
    • Spring MVC가 지원하는 Controller 인수 타입
    • Spring MVC 기본 동작 흐름
    • Spring 싱글톤(Singleton) Scope
    길민호(ethan.mino)
    길민호(ethan.mino)
    💻 호기심 많은 서버 개발자 길민호입니다.

    티스토리툴바