CS

[Spring] 스프링 Web MVC의 Dispatcher Servlet

뽀글보리 2021. 11. 23. 22:17
반응형

Servlet이란?

  • 클라이언트의 요청에 대해 동적으로 작동하는 웹 컴포넌트이다
  • Java Thread를 이용하여 동작
  • Request가 Servlet Container로 전송되고 어느 서블릿에 대한 요청인지 확인
  • 해당 서블릿에서 service 메소드를 호출한 뒤에 doGet or doPost를 호출한다
  • HttpServletResponse 객체에 응답을 보낸다

Dispatcher-Servlet이란?

  • 가장 앞단에서 HTTP 프로토콜로 들어오는 모든 요청을 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러

Dispatcher-Servlet의 장점

  • 예전 DispatcherServlet이 등장하기 전에는 URL 매핑을 위해 web.xml에 모두 등록해주어야만 했다.
<web-app>

    <!-- 1. aliases 설정 -->
    <servlet>
        <servlet-name>welcome</servlet-name>
        <servlet-class>servlets.WelcomeServlet</servlet-class>
    </servlet>

    <!-- 2. 매핑 -->
    <servlet-mapping>
        <servlet-name>welcome</servlet-name>
        <url-pattern>/welcome</url-pattern>
    </servlet-mapping>

</web-app>
  • 그러나 Dispatcher Servlet이 모든 Controller의 매핑을 담당하게 되면서 일일히 등록할 필요가 없어졌다.

Dispatcher-Servlet이 하는 일

계층 구조

DispatcherServlet은 일반적으로 계층 구조를 갖는다.

보통 어플리케이션에는 단일 DispatcherServlet과 단일 WebApplicationContext를 가진다.

  • servlet context : 말 그대로 servlet에 대한 context 설정을 작성하며, 그림에도 나와있듯이 ****Controllers, HandlerMapping, ViewResolver와 같은 웹과 연관되어 있는 bean들을 정의하게 된다.
  • root context : 일반적으로 데이터 저장소(Repositories) 및 비즈니스 서비스(Services)와 같은 여러 요청에 대해서 공유해야 하는 bean들을 정의하게 된다.
  • servlet context에서 root context에 등록된 bean들에 대한 참조가 가능하지만, root context에서 servlet context에 등록된 bean들에 대한 참조는 불가능하다.

HadlerMapping

  • 요청을 handler(controller)로 매핑한다.
  • 구현체 RequestMappingHandlerMapping은 @RequestMapping 어노테이션을 지원한다.

진행 과정

  • WebApplicationContext를 컨트롤러 같은 다른 요소가 사용할 수 있도록 바인딩된다.
(request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext())
  • 요청이 멀티파트인지 검사하고 멀티파트 요청이라면 다른 요소에 의해 추가처리될 수 있도록 MultipartHttpServletRequest로 래핑된다.
  • 요청을 처리할 적절한 컨틀롤러를 찾아 적당한 HandlerAdapter를 가져와 실행한다.
  • 결과를 응답에 담어 넣는다.

WebApplicationContext에 선언된 HandlerExceptionResolver 빈은 요청이 처리되는 동안 발생한 예외를 처리하는데 사용된다.

Interception

모든 HandlrMapping의 구현체는 특정 요청에 특정 기능을 적용하기 좋은 핸들러 인터셉터를 지원한다.

HandlerInterceptor 인터페이스의 preHandle, postHandle, afterCompletion 메서드를 구현해서 구성하면 된다.

Exceptions

요청 매핑 중 예외가 발생하거나 컨트롤러부터 예외가 발생하면 DispatcherServlet은 HandlerExceptionResolver 빈에 예외 처리를 위임한다.

(체인 순서 : ExceptionHandlerExceptionResolver → ResponseStatusExceptionResolver → DefaultHandlerExceptionResolver)

@ControllerAdvice, @ExceptionHandler 어노테이션이 적용된 메소드는 ExceptionHandlerExceptionResolver에서 처리된다.

404 에러와 같은 최소한의 예외처리는 DefaultHandlerExceptionResolver 에서 처리된다.

Spring Boot 동작과정

  • Server start 단계
    • Web server init
    • Root WebApplicationContext 로딩
    • Web server start
  • Client 호출 단계
    • Client → Web server으로 request 보냄
    • 동적 Web server → Servlet container로 전달
    • Servlet container 쓰레드 생성
    • DiapatcherServlet init
    • 생성된 쓰레드에서 DispatcherServlet service() 메서드 호출
    • HandlerMapping을 통해 매핑 컨트롤러 조회
    • HandlerAdapter를 통해 매핑 컨트롤러에 request 전달
    • 개발자가 구현한 Controller → Service → Repository 동작...
반응형