BoostCourse

Spring MVC 구성요소

Sh4869 2020. 3. 12. 05:08

학습 목표

  1. DispatcherServlet이 어떤 순서로 동작하는지 이해한다.
  2. DispatcherServlet에서 사용되는 컴포넌트(객체)들이 어떤 것들이 있는지 안다.

핵심 개념

  • DispatcherServlet
  • HandlerMapping
  • HandlerAdapter
  • ViewResolver

이번 포스팅에서는 Spring MVC에서 가장 핵심적인 역할을 수행하는 DispatcherServlet이 어떤 순서로 동작하는지 살펴보며 이를 통해 Spring MVC에서 사용되는 컴포넌트들을 알아보겠다.

Spring MVC 기본 동작 흐름

Spring MVC의 기본 동작 흐름은 다음과 같다. Database를 제외한 파란색 부분들은 Spring MVC가 제공해주는 부분이며, 보라색으로 표시된 부분은 개발자가 개발하는 부분이다. 마지막으로 녹색 View딴은 Spring에서 일부 제공해주며 사용자도 개발을 해야 하는 영역이다.

DispatcherServlet

저번 포스팅에서 다뤘던 Front-Controller를 담당하는 Servlet이다. 클라이언트의 모든 요청을 받은 후 이를 처리할 핸들러에게 작업을 넘기고 핸들러가 처리한 결과를 받아 사용자에게 응답 결과를 보여주는 역할을 한다. 일반적으로 1개를 사용하며 쉽게 말하면 회사의 대표번호와 비슷하다고 볼 수 있다. 회사는 고객의 요청을 받은 뒤 실제 업무는 각각의 담당 부서에서 처리하고 결과를 고객에게 전달하는 방식으로 동작하게 된다. DispatcherServlet은 여러 컴포넌트를 이용해 그와 비슷한 방식으로 작업을 처리하게 된다.

 

위 그림은 DispatcherServlet 내부 동작흐름을 나타낸다. 한 단계씩 들어가서 살펴보도록 하겠다.

요청 선처리 작업

Location에 따라 한국어, 영으 등의 지역화를 지원하는 Locale결정과 리다이렉트로 값을 전달할 떄 사용하는 FlashMap등이 존재한다.

 

org.springframework.web.servlet.LocaleResolver

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

org.springframework.web.servlet.FlashMapManager

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

org.springframework.web.context.request.RequestContextHolder

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

org.springframework.web.multipart.MultipartResolver

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

요청 전달

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에 의해 호출이 일어난다.

요청 처리

org.springframework.web.servlet.ModelAndView

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

org.springframework.web.servlet.RequestToViewNameTranslator

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

예외 처리

org.springframework.web.servlet.handlerexceptionresolver

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

뷰 렌더링

org.springframework.web.servlet.ViewResolver

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

요청 처리 종료

이번 포스팅의 내용은 Spring 내부에서 작업들이 진행되는 흐름과 관련된 컴포넌트들에 대한 내용이다. 본 내용을 모른다고 스프링을 쓰는데 큰 지장이 있는것은 아니지만, 실습을 진행하며 익숙해진 상태에서 위 내용을 숙지한다면 조금 더 깊게 스프링을 이해하고 사용할 수 있을 것이다.