Spring DispatcherServlet

Spring Web MVC

백기선님의 강의인 Spring Web MVC 강의를 듣고 공부한 내용을 정리한 글

DispatcherServlet

DispatcherServlet은 내부적으로 어떻게 동작할까?

DispatcherServlet 클래스의 doService 메소드의 내부를 살펴보자.

doService의 메소드에서는 doDispatch를 호출하는데

여기서부터가 핵심이다.

doDispatch의 메소드에서는 getHandler를 통해 해당 요청을 처리할 수 있는 핸들러를 찾는 메소드이다.

DispatcherServlet에서는 기본적으로 2개의 핸들러를 제공한다.

하나는 BeanNameUrlHandlerMapping이고 나머지 하나는 RequestMappingHandlerMapping이다.

@Controller, @RequestMapping, @GetMapping, @PostMapping같은 애노테이션이 붙은 핸들러를 찾아주는 인터페이스가 RequestMappingHandlerMapping이다.

이렇게 핸들러를 찾은 뒤 핸들러를 실행할 수 있는 어댑터인 HandlerAdapter를 찾는다.

역시나 찾기 위해 getHandlerAdapter 메소드를 호출한다.

HandlerAdapter에는 총 3가지 핸들러가 존재한다.

HttpRequestHandlerAdapter, SimpleControllerHandlerAdapter, RequestMappingHandlerAdapter이다.

HandlerAdapter의 역할은 찾아온 핸들러를 실행하는 인터페이스이다.

그리고 만약 해당 요청이 GET이라면 캐싱 기능을 제공해주게 된다.

그 후 invokeHandlerMethod에서 해당 핸들러 메소드를 실행시킨다.

이 때 Java Reflection을 사용해 해당 요청을 처리할 수 있는 핸들러 (아마도 @GetMapping,@PostMapping,@RequestMapping이 붙은 메소드)를 실행하게 된다.

그 후 ReturnValueHandler는 Response,Entity,View 등을 어떻게 리턴해줄 것인지에 대한 처리해줄 수 있는 15가지 ReturnValueHandler 중 하나를 찾는다.

ReturnValueHandlerConverter를 사용해서 Return 값을 Http 본문에 넣어주는 처리를 하게 된다.

View가 있는 경우

반환되는 String 값이 어떠한 View Template(JSP,HTML)이라면 ModelAndView 값이 존재하게 되고, ModelAndView에 모델 값을 바인딩해서 View에 렌더링하는 것이 가능하다는 의미이다.

DispatcherServlet의 동작 순서

그래서 지금까지 알아본 DispatcherServlet의 동작 순서를 살펴보자.

  1. 요청을 분석한다 (Locale, Theme, Multipart, etc..)

  2. 해당 요청을 처리할 핸들러를 찾는다.

  3. 해당 핸들러를 실행할 수 있는 “핸들러 어댑터”를 찾는다.

  4. 찾아낸 핸들러 어댑터를 사용해 핸들러의 응답을 처리한다.

    • 핸들러의 리턴 값을 보고 어떻게 처리할지 판단한다.
      • 뷰 이름에 해당하는 뷰를 찾아서 모델 데이터를 렌더링한다.
      • @ResponseEntity가 있다면 Converter를 사용해서 응답 본문을 만든다.
  5. 예외가 발생했다면, 예외처리 핸들러에게 요청 처리를 위임한다.

  6. 최종적으로 응답을 보낸다.

디스패처의 내부에서 일어나는 또 다른 일

그러면 디스패처 서블릿은 핸들러 매핑, 핸들러 어댑터, 뷰리졸버 같은 친구들을 어디서 가져오는 걸까?

디스패처 서블릿 내부를 보면 initStrategies라는 메소드가 존재한다.

이 메소드 내부에는 핸들러 매핑, 핸들러 어댑터, 뷰리졸버 등이 초기화 되고 있는데, 우리는 여기서 initViewResolver를 살펴보도록 하자.

다 동작하는 방식은 비슷하다.

initViewResolverViewResolver 타입의 빈들을 다 찾아와서 ViewResolver 목록에 넣어둔다.

만약 없다면? 기본 전략을 가져와서 셋팅한다.

Reference

인프런 백기선님의 스프링 Web MVC



© 2022. by minkuk

Powered by minkuk