위 그림은 스프링의 mvc 동작과정이 모두 들어가 있는 그림입니다.
위 그림을 기반으로 설명을 드리겠습니다.
dispatcher servlet 은 front controller 라고 불린다. front controller 는 스프링 mvc 의 핵심 기능이고, 모든 요청은 Front Controller 를 통해서 들어온다.
요청이 들어오면 서버에서는 servlet container 에 해당하는 url 을 사용하는 컨트롤러가 있는 검색하게 된다.
만약 있다면 dispatcher servlet 에서 요청에 맞는 handler 타입을 검색하게 된다.
보통은 @RequestMapping 이기 때문에 handler mapping 구간에서 RequestMappingHandlerMapping 을 가져오게 된다.
dispatcher servlet 은 가져온 핸들러를 가지고 어떤 어댑터를 사용해야 하는지 어댑터 목록에서 찾아와 가져온다.
어댑터 개념은 미국과 한국의 110v 와 220v 차이를 생각하면 된다.
@RequestMapping 이였다면 RequestMappingHandlerAdapter 를 가지고 오게 된다.
위 코드로 핸들러(어댑터)를 실행하게 된다.
찾은 어댑터를 실행시키면 핸들러 어댑터는 url 에 맞는 컨트롤러를 찾는다.
찾은 컨트롤러에 필요한 파라미터를 Argument Resolver 를 통해 가져온다.
자주 사용하는 @RequestMapping 과 HttpEntity 를 사용했을 경우 HTTP Message Converter 를 사용하여 가져오는데 타입(String, Object, ect..)과 미디어 타입(contents-type)을 가지고 판별한 다음 반환한다.
우리가 컨트롤러에서 작성한 코드들이 실행되고 나서 return 했을 때 ReturnValueHandler 가 반환 타입에 따라서 다르게 동작한다.
자주 사용하는 @ResponseBody 와 HTTPEntity를 사용했을 경우 Http Message Converter 를 사용한다.
어댑터를 사용하는 가장 큰 이유가 여기서 나온다. 인터페이스로 만들어진 어댑터는 컨트롤러에서 모두 다르게 응답하였다 하더라도 어댑터에서는 같은 리턴값을 반환한다. 예로 들어 ModelAndView 가 있다.
ModelAndView 가 반환이 되었다고 한다면 View Resolver 에서 thymeleaf 같은 템플릿 엔진으로 model 에 데이터를 담아 넘겨주게 된다.
만약 @ResponseBody
를 사용하면 바로 dispatcher servlet에서 응답하게 된다.
참고) modelAndView