Search

Spring Web MVC 동작 구조

태그
Spring
작성 상태
작성 완료
작성일
2022/11/08
참고 링크
참고 링크 2
Spring Boot 를 이용해 웹 프로젝트를 여럿 해본 이 시점에서, 서버가 실행되었을때, 어떤 객체들이 생성되어 관리되는지 알아보고, 사용자의 요청이 들어왔을 때 어떤 순서로 Bean 들이 동작하는지 알아보았다. 실제 진행한 프로젝트를 실행시키며, Debug 로그를 분석하며 알아보았다.
검색말고 직접 알아보려고 한 삽질

검색을 통해 알게된 사실

HandlerAdapterController 의 메서드를 실행하려면, Http Request로부터 적절한 객체를 생성해 메서드의 인자로 넘겨야 한다. 이걸 하는 ArgumentResolver가 있고, 반대로 Controller 의 응답을 Http Response 에 집어넣어야 하고 이걸 하는 ReturnValueHandler 가 있다. 이들은 내부적으로 MessageConverter 을 사용한다.

결론

서버로 요청이 오면, Servlet 필터를 거쳐 Dispatcher Servlet 에 요청이 도달한다. 여기서 HandlerMapping 을 통해 어떤 핸들러, 인터셉터 들이 이 요청을 처리하는지 목록을 가져오고, 가져온 인터셉터 목록에서 인터셉터의 preHandle() 메서드 들을 실행한 후 Hadler 어댑터 목록에서 이 요청을 처리하는 핸들러를 실행시킬 수 있는 핸들러 어뎁터를 찾는다.
찾은 핸들러 어뎁터가 핸들러의 메서드를 실행하려면 메서드의 인자를 생성해야 하는데, Argument Resolver 가 이 역할을 담당한다. 컨트롤러의 응답을 http body에 넣거나, View 를 반환해야 하는데 이를 ReturnValue Handler 가 처리한다. 이들 내부적으로 HttpMessage Converter 가 사용된다.