SPRING MVC DispatcherServlet
Controller 실행 과정
1. mapping된 handler 찾기
DispatcherServlet의 doService안에서 doDispatch메서드 호출.
위 그림과 같이 그 안에서 mappedHandler를 찾아옴. RequestMappingHandlerMapping으로 어노테이션 기반 MVC mapping을 찾아옴. getHandler에서는 loop 돌면서 mapping된 handler를 찾음.
2. mapping된 handler를 실행할 adapter 찾기
handler를 찾았으면 handlerAdapter도 찾아옴. 위에RequestMappingHandlerMapping을 찾은것 처럼 RequestMappingHandlerAdapter로 어댑터를 연결함.
참고로 handlerMapping은 handler를 찾는 인터페이스, handlerAdapter는 handler를 실행하는 인터페이스.
3. 찾은 adapter 실행하기
파란색 동그라미 부분에서 handler를 실행함. Handler의 Abstract class를 거쳐서 실제 구현체 메서드를 실행함 (여기서는 아까 찾은 RequestMappingHandlerAdapter가 구현체).
이 부분이 실제 RequestMappingHandlerAdapter 구현체가 실행하는 부분. 결국 Reflection을 사용해서 컨트롤러에 mapping되어 있는 메서드까지 실행. 참고로 this.invokedHandlerMethod의 파라미터 handlerMethod가 controller정보, controller의 method 정보 등등을 다 들고 있음.
4. 리턴 값 처리하기
invokedHandlerMethod를 따라가면 아까 받았던 파라미터 handlerMethod를 이용해 ServletInvocableHandlerMethod라는 클래스를 생성함. ServletInvocableHandlerMethod 클래스를 이용해 파란 동그라미와 같이 리턴 값을 처리하는 메서드를 호출함.
해당 메서드에서는 HandlerMethodReturnValueHandlerComposite라는 클래스를 이용해 return을 처리할 HandlerMethodReturnValueHandler를 찾아옴(selectHandler에서 loop돌면서 찾음).
컨트롤러에서 String, ResponseEntity, Model 등 다양한 것들을 리턴할 수 있기에, 위 메서드에서 적절한 HandlerMethodReturnValueHandler를 찾는 과정이라고 생각하면 됨.
위 과정 이 후, responseEntity면 컨버터를 사용해서 http 본문에 넣어줌