HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러라고 정의할 수 있다.
-
서블릿 요청/응답을 HTTP 서블릿 요청/응답으로 변환
-
HTTP Method에 따른 처리 작업 진행
-
요청에 대한 공통 처리 작업 진행
-
컨트롤러로 요청을 위임
-
요청에 매핑되는 HandlerExecutionChain 조회
-
요청을 처리할 HandlerAdapter 조회
-
HandlerAdapter를 통해 컨트롤러 메소드 호출(Handler ExecutionChain 처리)
-
HTTP 요청은 등록된 필터들을 거쳐 디스패처 서블릿이 처리하게 되는데, 가장 먼저 요청을 받는 부분은 부모 클래스인 HttpServlet에 구현된 service 메소드이다.
service에서는 먼저 Servlet 관련 Request/Response 객체를 Http 관련 Request/Response로 캐스팅해준다.
그리고 나서 HttpServletRequest 객체를 파라미터로 갖는 service 메소드를 호출한다.
요청 메소드에 따라 필요한 처리와 doX 메소드를 호출해준다. 그러면 doX 메소드를 오버라이딩하고 있는 자식 클래스인 FrameworkServlet로 다시 요청이 이어지게 된다.
각각의 doX 메소드에서는 Http Method에 맞는 작업을 한 후, 공통적으로 processRequest를 거치게 된다.
processRequest에서는 request에 대한 공통 작업을 한 후, doService를 호출한다.
자식 클래스인 DispatcherServlet의 doService 코드는 위와 같다. doDispatch를 통해 HTTP 요청을 컨트롤러로 위임해준다.
getHandler에서는 HandlerMapping 목록을 순회하여 HandlerExecutionChain을 찾는다.
탐색을 통해 찾아진 HandlerMethod는 최종적으로 HandlerExecutionChain으로 반환된다.
디스패처 서블릿은 HandlerExecutionChain을 직접 실행하지 않고, HandlerAdapter라는 어댑터 인터페이스를 통해 실행한다. 컨트롤러의 구현 방식에 상관없이 요청을 위임하도록 어댑터 패턴을 사용했다. doDispatch에서는 getHandlerAdapter를 통해 handlerAdapter를 조회한다.
HandlerAdapter를 통해 HandlerExecutionChain을 처리하는데, 내부적으로 인터셉터를 가지고 있어 공통적인 전/후처리 과정이 처리된다.
적합한 HandlerAdapter가 HandlerExecutionChain을 모두 찾았으면 HandlerAdapter가 요청을 처리한다.
요청의 종류에 따라 HandlerAdapter 구현체가 달라지고 그에 따른 전/후처리가 달라진다.
RequestMappingHandlerAdapter의 handleInternal은 실제로 요청을 위임하는 invokeHandlerMethod를 호출한다.
InvokeHandlerMethod에서는 컨트롤러의 파라미터를 처리하는 ArgumentResolver와 반환값을 처리하는 ReturnValueHandler의 공통적인 전/후처리가 진행된다. 세팅이 끝나면 ServletInvocableHandlerMethod의 invokeAndHandle로 이어진다.
invokAndHandle에서는 바로 부모 클래스인 InvocablehandlerMethod의 invokeForRequest로 이어진다.
invokeForRequest에서는 메소드 호출을 위해 필요한 인자값을 처리한다. 그리고 doInvoke에서 만들어진 인자값을 통해 컨트롤러의 메소드를 호출한다.
doInvoke에서는 먼저 요청을 처리할 컨트롤러의 메소드 객체를 꺼내온다. 그리고 Method 객체의 invoke를 통해서 실제 컨트롤러로 위임을 해준다.
컨트롤러에서 성공적으로 작업을 처리한 후에 ResponseEntity를 반환했다면 invokeAndHandle의 returnValue로 해당 객체가 온다.
이후, returnValueHandler를 통해 후처리를 한다. 응답에 따라 다양한 형태로 처리하기 위해 리스트로 갖고 있다.
ResponseEntity 객체를 반환한 경우에는 HandlerMethodeReturnValueHandler 구현체 중에서 HttpEntityMethodProcessor가 사용된다. 내부에서는 Response를 set 해주고, 응답 가능한 MediaType인지 검사한 후에 적절한 MessageConverter를 선택해 응답을 처리하고 결과를 반환한다.