SpringMVC Request Life Cycle에 대해 - PART 1

NO Image

들어가며

SpringMVC에서 Request가 들어오면 어떠한 과정을 거치는지 정리하기 위해 작성합니다.

No Image

DispatcherServlet 구조

Servlet#service

  • WAS(Tomcat)은 Servlet의 service를 실행하게 됩니다.

GenericServlet#service

No Image

  • Servlet Interface를 가진 Abstract Class
  • 실제 구현체인 HttpServlet을 봐야 이해가 가능합니다.

HttpServlet#service

  • HTTP Method에 맞는 do{HttpMethod} 함수를 호출하게 됩니다.

HttpServlet은 abstract Method가 없는데 왜 Abstract Class일까?

  • HttpServlet class 자체를 생성하지 못하기 위해서 Abstract Class로 정의해 놓은거 같습니다.
  • 왜 생성하지 못하게 막아놨을까?
    • API/Interface는 정의되어있지만, 기능적으로는 완벽하지 않기에 Abstract Class로 정의되었다.라고 찾아 볼 수 있습니다.

Default HttpServlet#doGet은 어떻게 동작할까?

  • Error Message만 반환하는 것을 볼 수 있습니다.

FrameworkServlet#service

  • HttpMethod가 Patch와 null인 경우 FrameworkServlet#processRequest
  • 그 외에는 super.service 즉 HttpServlet#service를 호출합니다.

HttpMethod GET으로 호출하면 어떻게 진행될까?

  • HttpServlet#service에서 HttpServlet#doGet을 거쳐
  • @Override된 FrameworkServlet#doGet을 최종적으로 호출하게 됩니다.

테스트 케이스 : NesoyServlet#doGet이 호출이 될까?

Test 결과값

FrameworkServlet#doGet

  • FrameworkServlet#processRequest로 전달하는 것을 확인할 수 있습니다.

FrameworkServlet#processRequest

  • final로 선언되어 있어 변경이 불가능합니다.
  • Javadoc에 doService는 Template Method라는 정보가 있습니다.

processRequest에서 무슨일을 진행할까?

1. 초기화 & Context 저장

  • Locale
    • 이전 LocalContext 정보를 저장합니다.
    • 현재 HTTP request의 Locale 정보를 얻습니다.
  • RequestAttributes
    • 이전 RequestAttributes 정보를 저장합니다.
    • HttpServletRequest, HttpServletResponse, HttpSession을 담고 있는 ServletRequestAttributes 클래스를 생성합니다.
  • LocaleContextHolder, RequestContextHandler에 저장
    • LocaleContextHolder에는 LocalContext를 저장합니다.
    • RequestContextHandler에는 RequestAttributes를 저장합니다.

2. FrameworkServlet#doService

  • 실제 구현은 DispatcherServlet#doService를 봐야합니다.

3. Context 복구 & 후처리

  • 이전에 저장해놨던 Context로 다시 돌려놓습니다.
  • log 결과값을 로깅합니다.
  • RequestHandleEvent를 진행합니다.

Reference

0%