개발/Spring

[Spring] DispatcherServlet 코드 분석하기

nova_dev 2021. 1. 1. 20:35
반응형

Spring 
DispatcherServlet 코드 분석하기

이번 포스팅에서는 Spring Framework의 DispatcherServlet 코드를 분석한 내용에 대해 정리해보려 합니다.

 DispatcherServlet 이란?

Spring Framework의 구조와 Dispatcher Servlet의 역할을 간단히 설명하자면 아래와 같은 순서대로 사용자의 요청을 처리합니다.

이미지 출처: https://velog.io/@lacomaco/Spring-MVC-%ED%99%9C%EC%9A%A9

1. 사용자의 Request가 들어오면 DispatcherServlet은 받아온 Request를 확인합니다.

2. DispatcherServlet은 HandlerMapping에게 보내서 해당 요청을 처리할 수 있는 Controller가 있는지 확인합니다. 

3. HandlerAdapter에서는 HandlerMapping에서 확인한 Controller를 호출하여 구현해둔 Business Logic인 Service를 타고 Repository를 통해 Database에 접근하여 값을 처리한 뒤, 다시 Controller에서 값을 반환하게 됩니다. 이때 반환하는 값은 View의 이름이 되거나, Model이 될 수 있습니다. 혹은 ModelAndView를 함께 가지고 있을 수 있습니다. 반환해준 View 이름이 어떤 것인지 확인하여 DispatcherServlet에게 알려줍니다.

4. DispatcherServlet은 받아온 View이름을 통해 ViewResolver에게 해당 View가 있는지 확인하고, 해당 뷰를 가져옵니다.

5. 이후 DispatcherServlet은 받아온 View와 Model(데이터)로 Response를 만들어서 사용자에게 돌려줍니다.

 

 DispatcherServlet의 주요 Bean 종류

  • HandlerMapping
    • 사전/사후 처리를 위해 interceptor 리스트와 함께 request를 handler에 매핑합니다.
    • 대표적인 두 가지 HandlerMapping 구현
      • RequestMappingHandlerMapping: @RequestMapping 주석이 있는 메서드를 지원하는 방식
      • SimpleUrlHandlerMapping: 핸들러에 URL path 패턴 명시적인 등록을 유지하는 방식
  • HandlerAdapter
    • DispatcherServlet이 request에 매핑된 처리기(Controller)를 호출하도록 도와줍니다.
  • HandlerExceptionResolver
    • 예외를 해결하기 위한 전략입니다. 예외를 Handler, Error Page 등에 매핑할 수 있습니다.
      • SimpleMappingExceptionResolver
        • Exception Class Name과 Error View Name을 매핑합니다.
      • DefaultHandlerExceptionResolver
        • Spring MVC로부터 발생한 Exception을 해결하고 Http Status Code에 매핑합니다.
      • ResponseStatusExceptionResolver
        • @ResponseStatus주석으로 예외를 해결하고 주석 값에 따라 Http Status Code에 매핑합니다.
      • ExceptionHandlerExceptionResolver
        • @ExceptionHandler에서 메서드를 호출하여 예외를 해결합니다.
  • ViewResolver
    • String 핸들러에서 반환된 View 이름을 실제로 Response에 렌더링할 View를 확인합니다.
  • LocaleResolver
    • Locale 국제화를 제공할 수 있도록 클라이언트가 사용하고 있는 시간대를 확인합니다.
  • ThemeResolver
    • 웹 응용 프로그램에서 사용할 수 있는 테마를 확인합니다.
  • MultipartResolver
    • Maltipart Request (이미지 등의 파일을 업로드할 경우 사용) 값을 파싱 하기 위한 추상화(Abstraction)입니다.
  • FlashMapManager
    • 리다이렉션을 통해 한 요청에서 다른 요청으로 속성을 전달하는데 사용할 수 있는 input과 output을 저장하고 검색합니다.

 DispatcherServlet 상속 관계

DispatcherServlet Diagram

Spring의 DispatcherServlet의 상속 관계는 위와 같습니다.
DispatcherServlet 클래스의 상속관계를 타고 올라가다보면 결국 HttpServlet을 상속받은 것을 볼 수 있습니다.

코드상에서 DispatcherServlet의 상속 관계를 살펴보겠습니다. DispatcherServlet은 FrameworkServlet을 상속받고

FrameworkServlet에서는 HttpServlet의 주요 메서드인 service메서드를 오버라이드 해서 processRequest메서드를 호출합니다. 

FrameworkServlet의 service 메서드

FrameworkServlet의 processRequest메서드에서는 doService라는 서비스를 호출하여 실제 service의 로직을 수행하고 있습니다.

 즉, DispatcherServlet의 doService메서드에서 HttpServlet의 service 메서드를 수행하는 것을 확인할 수 있습니다.

 

 DispatcherServlet 프로세스 코드레벨로 분석하기

Spring Application이 실행되었을 때, 사용자의 Request를 DispatcherServlet가 어떤 프로세스로 처리하는지 알아보기 위해 주요 메서드인 doService에 break point를 걸어 디버그 모드로 실행했습니다. 아래 프로세스를 실제로 DispatcherServlet 코드에서 어떻게 수행하는지를 알아보려 합니다. 

AOP, Filter, Interceptor

1. 사용자의 request가 들어올 경우, DispatcherServlet의 doService() 메서드가 호출됩니다. (spring에서 서비스 로직을 타기 전에 dofilter와 preHandler 로직도 수행하지만, 우선 DispatcherServlet의 주요한 비즈니스 로직만을 디버그로 걸어두었습니다.

2. doService()에서는 DispatcherServlet과 관련된 특성만을 표시하고, 실제 request에 대한 처리doDispatch() 메서드에게 위임하여 값을 처리하고 있습니다.

3. doDispatch()에서는 실제로 모든 요청을 각각 알맞은 Handler에게 전달하는 역할을 합니다. 

4.doDispatch() 안의 getHandler()에서 어떤 Controller로 요청할지 찾고, Interceptor는 어떤 것이 있는지 확인합니다.

5. 그럼 어떤 Controller와 Interceptor를 처리해야 하는지 Handler를 통해 알아내어 HandlerAdaptor를 통해 현재 request에 대한 처리를 결정하게 됩니다.

6. 실제 핸들러에 대한 처리를 하기 전에 preHandler을 처리하고(Interceptor로 등록되어 있는 행동들) 실제 비즈니스 로직은 아래 코드에서 한 뒤에 결과 ModelAndView를 받아옵니다.

mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

7. 핸들러에 대한 처리 이후 applyPostHandler에서 실제 값을 처리한 뒤에 해야 하는 행동들을 적용합니다.

8. 여기까지 DispatcherServlet에서 전부 처리하여 넘기면, 이후 필터에 대한 처리를 한 뒤 결과 값을 리턴하게 됩니다.

 

마무리

DispatcherServlet의 코드를 살펴보며, 실제로 사용자의 request가 요청되면 어떤 식으로 동작하는지를 알아보았습니다. SpringFramework의 어찌 보면 가장 중요하다고 생각되는 DispatcherServlet을 파보니 나름 재밌군요. 다음에도 SpringFramework의 다른 주요 클래스들을 파보도록 하겠습니다.

 

 

관련글

 
 

 

 

반응형