Language & Framework/Spring Boot

[Spring Boot] Spring의 전체 흐름 알아보기 - 01. MVC 패턴과 Spring MVC 구조

코딩 기록하는 애기 개발자 2026. 4. 12. 18:09

목차

     

    Spring Boot로 웹 개발을 해보면, Controller를 만들고, API를 구현하는 과정은 생각보다 빠르게 익힐 수 있다.

     

    하지만, 이면에서 요청이 어떤 흐름을 거쳐처리되는지, DispatcherServlet이 어떤 역할을 하는지 는 정확히 이해하지 못한 채 사용하는 경우가 많다. (특히, 나 ...... )

     

    그래서 휴학도 했다 ! , Spring 워크북도 하고 있다 ! 이 참에 이 과정에 대해서 깊게 정리해보려고 한다.

     

    그 과정에서 가장 먼저 짚고 넘어가야 할 개념이 바로 MVC 패턴이다.

    MVC는 단순히 Spring MVC에서만 사용하는 개념이 아니라, Spring을 처음 공부할 때 반드시 이해하고 넘어가야 하는 핵심 개념이다.

     

    이번 글에서는 Spring MVC의 흐름을 이해하기 위한 첫 단계로, MVC 패턴의 개념과 역할에 대해 먼저 알아보자.

     


    MVC (Model-View-Controller) 란 ?

    MVC 패턴은 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴이다.

    사용자의 인터페이스(UI)와 비즈니스 로직(도메인)을 분리하여 유지보수를 독립적으로 수행할 수 있게 하는 디자인 패턴이다.

    디자인 패턴이란,
    유지보수와 로직을 분리하고 코드를 재사용하는 등 개발에 있어 좀 더 쉽고 편리하게 사용할 수 있게 만든 특정한 방법들

    쉽게 말해, 한 파일에 모든 로직이 들어있는 코드를 부분 별로 나누는 패턴이다.

     

     

    MVC 구조

    MVC는 3가지 구성요소로 나눈다. 각각의 구성요소들 사이에는 다음과 같은 관계가 있다

    • `Controller` : Model과 View사이의 매개체로, View를 생성 및 관리하고, 사용자의 입력을 받아 Model의 상태를 직접 변경하기도 한다.
    • `Model` : 도메인과 비즈니스 로직을 추상화하여 나타낸 객체로, 필요한 데이터들을 관리한다.
    • `View` : 사용자에게 보여지는 것으로, 사용자의 인터페이스(UI)를 구현한다.

    해당 구조를 가진 시스템은 다음과 같은 과정으로 동작한다.

    1. 사용자는 View를 통해 Model의 데이터를 확인한다.
    2. 사용자는 Controller를 이용해 Model을 가공 및 변경한다.
    3. Model은 Controller에게서 받은 입력에 따라 값이나 상태를 변경한다.
    4. Model의 변경이 View에게 전달되어, View에서 보여지는 값이 업데이트된다.
    5. 사용자는 변경된 데이터를 View를 통해 확인한다.

    지금까지는 MVC 패턴이 무엇인지에 대해 간단하게 알아보았다.

    그렇다면, 이 MVC 패턴은 실제 Spring 에서는 어떻게 적용되고 있는지 살펴보도록 하자. (이게 진짜 주 목적이다 !!!)

     

    Spring 은 MVC 패턴을 기반으로 웹 요청을 처리할 수 있도록 Spring MVC 라는 구조를 제공하고 있다.

    그러면 Spring MVC의 동작 과정을 중심으로 하나씩 정리해보자.

     

     


    Spring MVC 란 ?

    Spring Framework에서 웹 애플리케이션을 위해 제공되는 Servlet API를 기반으로 구축된 최초의 웹 프레임워크이다.

     

    Spring MVC는 클라이언트의 요청을 편리하게 처리해주는 Servlet 기반 프레임워크라고 생각하면 된다.

     

    클라이언트의 요청을 처리하는 방식에 따라 View 방식과 REST 방식으로 나눌 수 있는데,
    이 2가지 동작 방식을 살펴보며 좀 더 구체적으로 알아보도록 하자.

     

    View 동작 방식

    View 방식은 서버가 비즈니스 로직을 처리한 후, 화면(View)까지 생성하여 클라이언트에게 반환하는 방식이다.

    즉, 클라이언트는 완성된 HTML을 전달받아 그대로 화면에 렌더링하게 된다.

    이때, 작동 방식은 아래와 같다.

    출처 : 나 !!!! >.<

    1. Client가 특정 URL을 통해 HTTP Request가 들어오면, 이 요청은 DispatcherServlet으로 전달된다.
      이때, DispatcherServlet은 모든 요청을 가장 먼저 받는 Front Controller 이다.
    2. DispatcherServlet은 요청을 처리할 수 있는 적합한 Controller를 찾기 위해 HandlerMapping에게 요청을 보낸다.
    3. DispatcherServelt은 Handler를 실행할 수 있는 HandlerAdapter를 조회한 후, 이를 실행한다.
    4. HandlerAdapter는 Handler, 즉 Controller를 실행한다.
    5. Controller는 비즈니스 로직을 수행한다.
    6. 비즈니스 로직을 수행한 후, 처리 결과를 반환한다.
      이때 처리 결과로 Model 데이터와 View 이름 등의 정보가 생성된다.
    7. Handler는 처리 결과를 HandlerAdapter로 전달한다.
    8. HandlerAdapter는 Handler가 반환한 결과를 ModelAndView 형태로 변환해 반환한다.
      ModelAndView : Model과 View 정보를 함께 담는 객체
    9. DispatcherServlet은 전달받은 View 정보를 다시 ViewResolver에게 전달해서 View 조회를 요청한다.
    10. ViewResolver는 해당 View를 찾아 DispatcherServlet에 다시 반환한다.
    11. DispatcherServlet은 View 객체에 통해 Model 데이터를 전달하여 응답 생성을 요청한다.
    12. View는 응답 데이터를 생성하여 DispatcherServlet에게 전달한다.
    13. DispatcherServlet은 최종적으로 View로부터 전달받은 응답을 클라이언트에게 반환한다.

     

    REST 방식

    앞서 살펴본 View 방식과 달리, REST 방식은 서버가 화면을 생성하지 않고 데이터만 반환하는 방식이다.

    즉, 클라이언트가 요청을 보내면 서버는 비즈니스 로직을 수행한 후,
    View가 아닌 데이터 자체를 응답으로 전달하며, 클라이언트가 이를 기반으로 화면을 구성하게 된다.

     

    위 흐름에서 Controller까지의 요청 처리 과정(7번까지의 과정)은 View 방식과 동일하며, 이후 응답을 처리하는 방식에서 차이가 발생한다.

    출처 : 나 !!!! >.<

    1. Client가 특정 URL을 통해 HTTP Request가 들어오면, 이 요청은 DispatcherServlet으로 전달된다.
      이때, DispatcherServlet은 모든 요청을 가장 먼저 받는 Front Controller 이다.
    2. DispatcherServlet은 요청을 처리할 수 있는 적합한 Controller를 찾기 위해 HandlerMapping에게 요청을 보낸다.
    3. DispatcherServelt은 Handler를 실행할 수 있는 HandlerAdapter를 조회한 후, 이를 실행한다.
    4. HandlerAdapter는 Handler, 즉 Controller를 실행한다.
    5. Controller는 비즈니스 로직을 수행한다.
    6. 비즈니스 로직을 수행한 후, 처리 결과를 반환한다.
      이때 처리 결과는 View 이름이 아닌 객체 형태의 데이터이다. 
    7. Handler는 처리 결과를 HandlerAdapter로 전달한다.
    8. HandlerAdapter는 Handler가 반환한 객체를 HTTP 응답으로 변환하여 반환한다.
      이 과정에서 MessageConverter가 객체를 JSON 형태로 변환한다.
    9. JSON 형태로 변환된 데이터는 DispatcherServlet으로 전달된다.
    10. DispatcherServlet은 변환된 데이터를 그대로 클라이언트에게 응답으로 반환한다. 

     


     

    지금까지 Spring MVC의 요청 처리 흐름을 중심으로 전체적인 구조를 살펴보았다.

     

    하지만 실제 요청은 DispatcherServlet에 도달하기 전과 이후에도

    다양한 계층에서 추가적인 처리가 이루어지고 있다.

     

    특히 Filter, Interceptor, AOP는 각각 다른 위치에서 동작하며

    요청과 응답 과정에 중요한 역할을 담당한다.

     

    다음 글에서는 이 세 가지 개념이 어떤 차이를 가지는지,

    그리고 실제로 어떤 상황에서 사용되는지에 대해 정리해보려고 한다.