Client로부터 요청이 들어오면 Front Controller인 Dispatcher Sevlet이 요청을 받는다.
Dispatcher Sevlet은 받은 요청을 처리할 수 있는 Handler객체를 가져온다.
핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회한다.
1번 과정 전 / 후 가
Filter의 동작 시점이다.
SpringBoot를 사용하면 0순위로 @RequestMapping 애노테이션 기반 Handler를 찾아 반환한다.
URI에 입력된 Endpoint와
@RequestMapping 애노테이션에 설정된 Endpoint를 비교하여
요청을 담당하는 Handler를 조회하는 것이다.
0순위가 실패하면 1순위로는 요청한 URI와 일치하는 스프링 빈 이름의 Handler를 찾아 반환한다.
핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다.
SpringBoot를 사용하면 0순위로 @RequestMapping 애노테이션 기반 Handler의 Adapter를 찾아 반환한다.
HttpRequestHandler를 implements하여 구현한 Handler를 처리하는 일을 수행하며 1순위로 동작한다.
Controller를 implements하여 구현한 Handler를 처리하는 일을 수행하며 2순위로 동작한다.
핸들러 어댑터를 실행한다.
핸들러 어댑터가 실제 핸들러를 실행한다.
4번 과정 전/후 가
Intercepter의 동작 시점이다.
HandlerAdapter는 Handler가 반환하는 정보를 ModelAndView 객체로 변환해서 반환한다.
5번 과정에서 얻은 ModelAndView 객체를 통해 view의 이름을 뷰 리졸버에 전달한다.
JSP의 경우
InternalResourceViewResolver가 자동 등록되고, 사용된다.
뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 view 객체를 반환한다.
View Resolver를 통해 얻은 view 객체에 5번 과정에서 얻은 ModelAndView의 Model을 파라미터로 넘겨주고 render() 메서드를 실행하여 페이지 렌더링을 수행한다.
최종적으로 렌더링된 페이지를 Client에게 response한다.
Spring은 이미 대부분의
Handler Mapping과Handler Adpater를 구현해 두었기 때문에 직접 구현할 일은 거의 없다.