본문 바로가기

Spring/Spring MVC

(SERVLET) DispatcherServlet의 내부 살펴보기

 

DispatcheServlet의 doService부터 시작

핸들러 찾기

요청을 찾아올 수 있는 핸들러를 찾아오는 부분

 

핸들러 매핑 찾기 - 기본으로 두 개의 핸들러 매핑이 제공된다.

 

 

두가지의 핸들러중 요청을 처리할 수 있는 핸들러 찾기

두 가지 핸들러 중 찾은 핸들러는 RequestMappingHandlerMapping이다.


어댑터 찾기

이제 찾은 핸들러를 실행시켜 줄 수 있는 Adapter를 찾는다.

 

Adapter는 아래와 같이 총 세 가지가 존재한다. - 실행하는 핸들러는 RequestMappingHandlerAdapter이다.

 

이제 가져온 정보를 가지고 실행하는 일만 남았다.

invoke 하는 메서드를 보면 어떤 메서드를 작동시킬지에 대한 정보들이 담겨있다. (by Reflection)

 

마지막으로 해당 메서드로 이동해서 String을 Return 한다.


정리

DispatcherServlet 초기화

  • 다음의 특별한 타입의 빈들을 찾거나, 기본 전략에 해당하는 빈들을 등록한다.

  • HandlerMapping: 핸들러를 찾아주는 인터페이스

  • HandlerAdapter: 핸들러를 실행하는 인터페이스

  • HandlerExceptionResolver

  • ViewResolver

  • ...

 

DispatcherServlet 동작 순서

  1. 요청을 분석한다. (로케일, 테마, 멀티파트 등)

  2. (핸들러 맵핑에게 위임하여) 요청을 처리할 핸들러를 찾는다. 

  3. (등록되어 있는 핸들러 어댑터 중에) 해당 핸들러를 실행할 수 있는 “핸들러 어댑터”를 찾는다.

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

  • 핸들러의 리턴 값을 보고 어떻게 처리할지 판단한다.

  • 뷰 이름에 해당하는 뷰를 찾아서 모델 데이터를 랜더링 한다.

  • @ResponseEntity가 있다면 Converter를 사용해서 응답 본문을 만들고.

  1. (부가적으로) 예외가 발생했다면, 예외 처리 핸들러에 요청 처리를 위임한다.

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

 

HandlerMapping

  • RequestMappingHandlerMapping

 

HandlerAdapter

  • RequestMappingHandlerAdapter