Back-End/JavaSpring

Spring MVC 패턴은 무엇이고 왜 사용하지?

stars_one 2025. 2. 24. 23:31

1. MVC란 무엇이고 왜 사용할까

개발을 하면서 MVC 패턴에 대한 이야기는 자주 들어왔지만,

막상 말로 설명하려고 하니, 어려운 거 같다.

 

 

그래 그럼 알아보도록 하자

 

 

사실, 우리는 MVC 패턴을 자주 보고 있고 친숙할 것이다.

더보기

웹 개발자로써, 여러분이 이 패턴을 이전에 의식적으로 사용한 적이 없더라도 아마 상당히 친숙할 것입니다. 여러분의 데이터 모델은 아마 어떤 종류의 데이터베이스에 포함되어 있었을 것입니다(MySQL 과 같은 전통적인 서버 사이드 데이터베이스, 또는 IndexedDB 같은 클라이언트 사이드 솔루션). 여러분의 앱의 제어 코드는 아마 HTML/JavaScript 로 작성되었을 것이고, 사용자 인터페이스는 HTML/CSS 등 여러분이 선호하는 것들로 작성되었을 것입니다. 이는 MVC 와 아주 유사하게 들리지만, MVC 는 이러한 컴포넌트들이 더 엄격한 패턴을 따르도록 합니다.

 

웹의 초창기에, MVC 구조는 클라이언트가 폼이나 링크를 통해 업데이트를 요청하거나 업데이트된 뷰를 받아 다시 브라우저에 표시하기 위해 대부분 서버 사이드에서 구현되었습니다. 반면, 요즘에는, 클라이언트 사이드 데이터 저장소의 출현과 필요에 따라 페이지의 일부만 업데이트를 허용하는 XMLHttpRequest를 포함해 더 많은 로직이 클라이언트 사이드에 추가되었습니다.

(출처 : MDN, MVC 패턴)

MVC 패턴 - MDN

 

MVC란, Model-View-Controller의 약자로, 소프트웨어 디자인 패턴 중 하나이다.

 

우리는, Model, View, Controller로 구분하여 역할을 분리하는데 각각의 역할을 간단히 정리하자면,

 

1) Model

데이터와 비지니스 로직을 담당

db와 연동하여 데이터를 저장하고 불러오는 작업을 수행

 

2) View

사용자 인터페이스를 담당

사용자가 보는 화면을 디자인하고 구현

 

3) Controller

Model, View 사이의 상호작용을 조정하고 제어

사용자의 입력을 받아 Model에 전달하고, Model의 결과를 바탕으로 View를 업데이트한다.

 

흠.. 그럼 왜 사용할까?

 

개인적인 생각으로는,

아무래도 MVC 패턴은 소프트웨어 구성을 3가지로 나누어서 개발을 진행하니,

각각의 로직을 따로 처리하여 관리할 수 있어서 코드 재사용성도 높고 유지보수도 편하다

그리고 패턴을 정해놓고 개발을 하다보니, 정해진 규칙없이 개발을 하는 것보다는

개발자들간의 협업 효율성도 증가할 것이다

 

 


 

2. Spring MVC란?

그렇다면 spring MVC란 무엇일까?

아래는 공식문서에 대한 설명을 가져왔다.

더보기

Spring Web MVC는 Servlet API를 기반으로 구축된 독창적인 웹 프레임워크로, 처음부터 Spring Framework에 포함되어 왔으며, 정식 명칭인 "Spring Web MVC"는 소스 모듈(spring-webmvc)의 이름에서 따왔으나, "Spring MVC"로 더 일반적으로 알려져 있습니다.

Spring MVC는 중앙에 있는 DispatcherServlet이 요청을 처리하기 위한 공유 알고리즘을 제공하는 Front Controller 패턴을 중심으로 설계되어 있으며 이 모델은 유연하고 다양한 워크 플로우를 지원합니다.

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

요약하자면,

‘DispatcherServlet이 중앙에서 HTTP 요청을 처리해주는데, 이는 Front Controller 패턴으로 설계되어있다’

라고 설명하고 있는데

 

결론적으로, 'Spring에서 MVC 디자인 패턴을 적용하여 HTTP 요청을 효율적으로 처리하고 있다' 

라고 생각하면 된다.

 

 

 

위에서 우리는 낯선 단어를 보았는데,

그건 아마도 'DispatcherServlet'과 'Front Controller' 겠지?

 

이 개념은 중요한 것들이니깐 알고 들어가자!

 

 


 

3. DispatcherServlet

뭔가 의도치 않게 빌드업을 하는거 같아서 좀 그렇지만,

DispatcherServlet을 알기 전에, Servlet에 대해서 먼저 알아보자

 

'Servlet은 자바를 사용해서 웹 페이지를 동적으로 생성하는 서버 측 프로그램 혹은 그 사양을 말한다.'

 

사용자가 HTTP API 요청을 보냈을 때, 서버의 서블릿은 아래와 같이 동작한다.

Servlet의 동작과정

 

Servlet 동작과정

더보기

1. 사용자가 Client을 통해서 서버로 HTTP 요청을 보낸다 (API 요청)

2. 요청을 받은 Servlet 컨테이너는 HttpServletRequest, HttpServletResponse 객체를 생성한다.
(* 약속된 HTTP의 규격을 맞춤과 동시에 HTTP에 담긴데이터를 쉽게 사용하기 위한 객체이다)

3. 설정된 정보를 통해 어떤 Servlet에 대한 요청인지 확인한다.

4. 해당 Servlet에서 service() 메서드를 호출하고 브라우저의 요청 Method(방식)에 따라서

doGet 혹은 doPost 메서드를 호출한다.

5. 호출한 메서드들의 결과를 그대로 반환하거나 동적페이지를 생성한 뒤,

HttpServletResponse 객체에 응답을 담아서 Client에게 반환한다.

6. 응답이 완료되면 생성한 HttpServletRequest, HttpServletResponse 객체를 소멸한다.

 

하지만 이거 보다 효율적으로 api요청을 처리해주는 DispatchServlet이라는 것이 존재한다


 

4. Front Controller

모든 API 요청을 Servlet의 동작 방식에 맞춰서 코드를 구현한다면,

우리는 ㅈㄴ 많은 Servlet 클래스를 구현해야 한다.

그럼 안되겟지?

 

그래서 갓프링은 DispatchServlet을 사용하여 Front Controller 패턴 방식으로 API 요청을 효율적으로 처리해주고 있다.

 

Front Controller 동작방식

 

Front Controller 패턴 동작 방식

더보기

1. Client에서 http 요청이 들어오면 DispatcherServlet 객체가 요청을 분석한다.

2. DispatcherServlet 객체는 분석한 요청을 바탕으로 Handler mapping을 통해서 Controller를 찾아 요청을 전달해준다.

[예시]
GET /api/hello → HelloController 의 hello() 함수
GET /user/login → UserController 의 login() 함수
GET /user/signup → UserController 의 signup() 함수
POST /user/signup → UserController 의 registerUser() 함수

 

Handler mapping에는 API path와 Controller 메서드가 매칭되어 있다.

@RestController
public class HelloController {
    @GetMapping("/api/hello")
    public String hello() {
        return "Hello World!";
    }
}

 

직접 Servlet을 구현하지 않아도 DispatcherServlet에 의해 간편하게 HTTP 요청을 처리할 수 있게 되었습니다.

 

3. 해당 Controller는 요청에 대한 처리를 완료하고, 처리한 데이터(Model)와 View 정보를 전달한다

(Controller -> DispatcherServlet)

 

4. ViewResolver를 통해서 View에 Model(데이터)를 적용해서 View를 Client에게 응답으로 전달해준다.

(DispatcherServlet -> Client)

 

 

 

 

728x90