<aside> 📖

학습 목표

1. Spring MVC 요청 처리 흐름의 전반적인 개요

Spring MVC에서는 클라이언트의 요청이 들어오면 이를 처리하고 응답으로 반환하기까지 여러 구성 요소들이 유기적으로 작동합니다. 이 흐름은 Front Controller Pattern을 기반으로 설계되어 있으며, 모든 요청은 DispatcherServlet을 중심으로 전달되고 조율됩니다.

[그림 3-3] Spring MVC의 동작 방식 및 구성요소

[그림 3-3] Spring MVC의 동작 방식 및 구성요소


2. 실제 요청 처리 흐름 살펴보기

  1. 먼저 클라이언트가 요청을 전송하면 DispatcherServlet이라는 클래스에 요청이 전달됩니다.

  2. DispatcherServlet클라이언트의 요청을 처리할 Controller에 대한 검색을 HandlerMapping 인터페이스에게 요청합니다.

  3. HandlerMapping클라이언트 요청과 매핑되는 핸들러 객체를 다시 DispatcherServlet에게 리턴해줍니다.

    핸들러 객체는 해당 핸들러의 Handler 메서드 정보를 포함하고 있습니다. Handler 메서드는 Controller 클래스 안에 구현된 요청 처리 메서드를 의미합니다.

  4. 요청을 처리할 Controller 클래스를 찾았으니 이제는 실제로 클라이언트 요청을 처리할 Handler 메서드를 찾아서 호출해야 합니다. DispatcherServlet은 Handler 메서드를 직접 호출하지 않고, HandlerAdpater에게 Handler 메서드 호출을 위임합니다.

  5. HandlerAdapter는 DispatcherServlet으로부터 전달받은 Controller 정보를 기반으로 해당 Controller의 Handler 메서드를 호출합니다.

    이제 전체 처리 흐름의 반환점을 돌았습니다. 이제부터는 반대로 되돌아갑니다.

  6. Controller의 Handler 메서드는 비즈니스 로직 처리 후 리턴 받은 Model 데이터를 HandlerAdapter에게 전달합니다.

  7. HandlerAdapter는 전달받은 Model 데이터와 View 정보를 다시 DispatcherServlet에게 전달합니다.

  8. DispatcherServlet은 전달받은 View 정보를 다시 ViewResolver에게 전달해서 View 검색을 요청합니다.

  9. ViewResolver는 View 정보에 해당하는 View를 찾아서 View를 다시 리턴해줍니다.

  10. DispatcherServlet은 ViewResolver로부터 전달받은 View 객체를 통해 Model 데이터를 넘겨주면서 클라이언트에게 전달할 응답 데이터 생성을 요청합니다.

  11. View는 응답 데이터를 생성해서 다시 DispatcherServlet에게 전달합니다.

  12. DispatcherServletView로부터 전달받은 응답 데이터를 최종적으로 클라이언트에게 전달합니다.

<aside> 💡

DispatcherServlet의 역할

Spring MVC의 요청 처리 흐름을 가만히 살펴보면 DispatcherServlet이 굉장히 많은 일을 하는 것처럼 보입니다.

클라이언트로부터 요청을 전달받으면 HandlerMapping, HandlerAdapter, ViewResolver, View 등 대부분의 Spring MVC 구성 요소들과 상호 작용을 하고 있는 것을 볼 수 있습니다.

그런데 DispatcherServlet이 굉장히 바빠 보이지만 실제로 요청에 대한 처리는 다른 구성 요소들에게 위임(Delegate)하고 있습니다.

마치 “HandlerMapping(핸들러매핑)아 Handler Controller 좀 찾아줄래? → ViewResolver(뷰리졸버)야 View 좀 찾아줄래? → View야 Model 데이터를 합쳐서 콘텐츠 좀 만들어 줄래?”라고 하는 것과 같습니다.

이처럼 DispatcherServlet이 애플리케이션의 가장 앞단에 배치되어 다른 구성요소들과 상호작용하면서 클라이언트의 요청을 처리하는 패턴을 Front Controller Pattern이라고 합니다.

</aside>