로마
- 먼저 HTTP 요청이 들어오게 되면 WAS(톰캣)가 해당 요청을 받아서 HttpServletRequest, HttpServletResponse 객체를 생성하고 쓰레드를 할당합니다.
- 이후 요청은 Spring Web MVC에서 설정한 Dispatcher Servlet으로 요청이 흘러가게 됩니다.
- 여기서 Dispatcher Servlet은 모든 경로의 HTTP 요청에 대해서 응답을 처리하는 Spring Web MVC의 단일 서블릿입니다.
- 서블릿이기 때문에 최초 요청 시 Dispatcher Servlet이 생성되게 된다.
- Dispatcher Servlet은 요청을 처리할 컨트롤러를 찾습니다.
HandlerMapping
에서 주어진 요청에 맞는 컨트롤러를 찾게됩니다.- getHandler 메서드를 통해 찾게 됨 ( 주로 사용하는 핸들러 매핑으로는
RequestMappingHandlerMapping
) - 실제로는
HandlerExecutionChain
을 반환하게 된다. 이는 인터셉터와 핸들러를 모아놓은 것이다.
- getHandler 메서드를 통해 찾게 됨 ( 주로 사용하는 핸들러 매핑으로는
- 매핑된 핸들러는 이후에는
HandlerAdapter
를 통해 핸들러에서 비즈니스 로직을 처리합니다.- 컨트롤러를 구현하는 방법이 다양하기 때문에 Adaptor 패턴을 활용해서 다양한 컨트롤러 구현을 받아들이도록 함.
- 인터셉터의 preHandle -> 컨트롤러의 메소드 -> 인터셉터의 posHandle 순으로 진행
- 어뎁터들의 리스트를 순회하면서 매핑된 핸들러가 어떤 어댑터를 통해 실행되어야하는지 찾는 과정이 포함됨.
- 스프링 3.2부터 DefaultAnnotationHandlerMapping 은 deprecated 되고 대신 RequestMappingHnadlerMapping을 사용함.
- 핸들러가 로직을 수행하고 반환값을 반환하게 됩니다. View 이름을 ResponseEntity를 반환할 수도 있습니다.
HandlerAdapter
에서 주어진 반환값을 처리합니다. View 이름을 반환받았으면 이를 ModelAndView에 담고, ResponseEntity를 반환받았다면 MessageConverter를 이용해 응답을 변환하여 Dispatcher Servlet에 반환합니다.- Dispatcher Servlet에서 ModelAndView를 반환받았을 경우 view 이름을 이용해서 ViewResolver를 통해 표시할 View 객체를 생성합니다.
- View에 Model을 넣어준 뒤 이를 응답하게 됩니다.
- ResponseBody가 붙었을 경우 ModelAndView를 반환하여 ViewResolver를 사용하지 않고 MessageConverter가 Adapter 내부에서 동작하게 됩니다. messageConverter에서는 주어진 객체 혹은 문자를 처리하여 응답 Body에 문자 내용을 반환합니다.
- 기본적인 문자 처리는 StringHttpMessageConverter가 제공하고 객체 처리는 Jackson 라이브러리를 사용하여 MappingJackson2HttpMessageConverter가 제공합니다.