본문 바로가기
스프링

[Spring] Spring MVC의 동작방식을 전체적인 관점으로 이해해보면?

by itstime0809 2023. 8. 22.
728x90

Spring MVC Flow

 앞선 포스팅에서는 MVC가 무엇인지 각각이 어떤 역할을 하는지를 살펴보았고 조금 더 멀리서 바라봤을 때 MVC가 어떻게 동작되는지 전체적인 흐름을 정리해 볼 필요가 있을 것 같아서 작성해보려고 한다. (간단한 흐름에 대해서 정리하게 됩니다.)

 

 Spring MVC는 Model View Controller 크게 이 세가지를 기준으로 바라보게 되는데 이는 Spring이 MVC 방식으로 동작하기 때문이다. 우선 몇 가지 가정을 하고 시작을 해보면 '클라이언트 요청을 받았다는 것' 그리고 '클라이언트 요청을 처리하는 과정인 상태'를 정의하고 시작을 해보려고 한다. 클라이언트에게 요청을 받았다는 것은 어떠한 클라이언트의 요구사항이 될 수 있다. 웹 브라우저든지 혹은 앱이라든지 앞서 서버로부터 요청을 하여 원하는 결괏값을 기대하고 있는 상황이다. 그러면 이제 Spring에서는 이러한 요청을 어떻게 처리할 수 있을까? 기본적으로 DispatcherServlet이 클라이언트의 요청사항을 전부 받게 되는데 DispatcherServlet은 Front Controller라고 불리어지며 이는 스프링 프레임워크에서 Front Controller 중심으로 디자인 되어졌기 때문이다.

 

 

"Spring MVC, as many other web frameworks, is designed around the front controller pattern where a central Servlet, the DispatcherServlet"

https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-servlet.html

 

DispatcherServlet :: Spring Framework

Spring MVC, as many other web frameworks, is designed around the front controller pattern where a central Servlet, the DispatcherServlet, provides a shared algorithm for request processing, while actual work is performed by configurable delegate components

docs.spring.io

 

 DispatcherServlet의 역할은 가장 단순하게 요청에 대한 처리작업을 관리하는 역할을 하게 된다. 따라서 가장 처음 요청을 받게 되게 되고 그러한 요청을 처리, 감독 하기 위해 HandlerMapping에게 요청에 대한 정보를 보내게 된다.  객체 중심으로 생각해 본다면 어쩌면 당연한 흐름이라고 생각이 든다. DispatcherServlet이 담당하는 부분의 한계는 명확해야 한다고 생각하고 각각의 객체가 처리해 줄 책임은 각자가 소유한 것으로 이루어져야 하기 때문이다. 따라서 DispatcherServlet은 우리가 앞서 Controller가 '비즈니스 로직을 처리하기 위해' Service로 '처리'에 대한 책임을 전가했듯이 마찬가지로 서브렛도 HandlerMapping에게 해당 요청에 대한 처리를 검사해 달라고 요청을 하는 흐름으로 생각할 수 있을 것 같다. 이후 HandlerMapping 같은 경우 적절한 요청에 대한 처리를 찾기 위해 handler를 탐색하게 되고, 그 과정 속에서 적절한 HandlerExecutionChain을 생성한다. 그리고 적절한 핸들러를 찾게 되었을때 해당 핸들러를 실행하게 되는데 HandlerAdapter에 의해서 실행된다. 그리고 나서 해당 컨트롤러를 찾게 되었을 때 요청에 대한 처리를 세부적으로 또 진행하게 되는 것이다.

 

 

"When a request comes in, the DispatcherServlet will hand it over to the handler mapping to let it inspect the request and come up with an appropriate HandlerExecutionChain. Then the DispatcherServlet will execute the handler and interceptors in the chain (if any)."

https://docs.spring.io/spring-framework/docs/3.0.0.M3/reference/html/ch16s04.html

 

 

 Controller에 의한 처리들이 끝까지 진행이 되고나면 Controller는 ModelAndView객체로 Dispatcher에게 다시 반환하게 된다. 이때 전달되는 내용들은 당연히 처리 과정을 담고 있는 데이터와 함께 객체 형태로 반환되게 되며 반환한 결과를 ViewResolver를 통해 적절한 데이터에 대한 View를 찾게 된다. 그러고 나서 DispatcherServlet은 이러한 전반적인 프로세스 끝에 클라이언트에게 다시 한번 해당 처리에 대한 결과를 반환하게 되는 것이다. 결국 앞서 기술했던 Spring framework는 front controller중심으로 디자인되어 사용되는 것이 눈에 띄게 보인다는 것을 알고 있었고 전반적인 요청 그리고 결과에 대한 반환까지도 처리하고 있는 중요한 역할을 하고 있다고 볼 수 있다.