
1. Spring MVC 패턴이란?
Spring MVC는 웹 애플리케이션에서 클라이언트의 요청을 처리하는 모듈이다. Spring MVC는 서블릿(Servlet) API를 기반으로 하여 요청을 처리하는데, 이 구조를 통해 웹 애플리케이션을 모듈화하고 유지보수를 용이하게 만들어준다.

우선 Spring MVC 에 들어가기 앞어 기본적인 MVC패턴에 대해 알아보자. 이 MVC패턴에서 발전한 것이 Spring MVC 이다. MVC 패턴은 크게 3가지 주요 부분으로 나누어져 있다.
🍩 MVC 패턴을 사용하는 이유?
사용자가 보는 페이지, 데이터 처리, 그리고 이 둘을 중간에서 제어하는 컨트롤러로 각 컴포넌트가 서로 분리되어 시스템 결합도를 낮출 수 있다. 또한, 유지보수가 쉬우며, 중복코드를 제거할 수 있고, 애플리케이션의 확장성 및 유연성이 증가한다.
2. MVC패턴의 구조
🔍 Model (모델)
▶ 데이터나 비즈니스 로직을 처리하는 부분
▶ 예를 들어, 데이터베이스에서 정보를 가져오거나 처리하는 역할
🔍 View (뷰)
▶ 사용자에게 보여지는 화면을 담당하는 부분
▶ HTML, JSP, Thymeleaf 등으로 웹 페이지를 만들어 사용자에게 보여준다.
🔍 Controller (컨트롤러)
▶ 사용자의 요청을 받고, 이를 처리한 후 Model과 View를 연결해주는 역할
▶ 사용자가 어떤 동작을 하면, 그에 맞는 데이터를 처리하고 그 결과를 View에 전달해서 사용자에게 보여주는 방식으로 동작한다.
⭐ Spring MVC 흐름
사용자가 웹 페이지에서 요청을 보냄 → Controller가 이 요청을 받아서 필요한 Model을 호출 → Model은 데이터를 처리하고, 결과를 Controller에 전달 → Controller는 그 결과를 View에 전달해 사용자에게 보여줌

Controller는 클라이언트의 요청을 받아 비즈니스 로직을 처리하고, 처리된 데이터를 Model에 담아 View에 전달하는 중간 다리 역할을 한다. 이 과정에서 Model은 데이터와 상태를 관리하고, View는 사용자에게 그 데이터를 시각적으로 표시한다.
2-1. Model (모델)
🔥 Model은 웹 애플리케이션에서 데이터와 비즈니스 로직을 처리하는 핵심 부분으로Controller에서 처리한 결과를 담아 View에 전달한다.
1) 데이터객체
데이터베이스에서 가져온 엔티티(Entity)나 DTO(Data Transfer Object) 같은 구조체가 Model에서 다뤄진다. 이런 데이터 객체들은 컨트롤러에서 처리된 후, View에 전달되어 사용자가 볼 수 있는 형태로 변환된다.
public class User {
private String name;
private String email;
// Getters and Setters
}
2) data (database)
모델은 클라이언트에 노출되지 않는다. 연산처리 및 DB가 주 된 목적, 컨트롤러에서 요청이 오면 해당 연산처리 후 정보를 return
2-2. View (뷰)
View는 Model에서 전달된 데이터를 화면에 표시하고, 사용자와의 상호작용을 처리하는 역할을 한다. (UI / UX) 👨💻 주로 HTML, JSP, Thymeleaf 같은 템플릿을 사용하여 화면을 구성한다.
1) 데이터 표시
Model에서 전달받은 데이터를 화면에 표시한다. 예를 들어, 사용자 이름, 제품 목록, 주문 정보 등을 HTML 테이블이나 폼으로 나타낸다.
<h1>Welcome, ${user.name}</h1>
<p>Email: ${user.email}</p>
2) 사용자 인터페이스(UI)
웹 페이지에서 버튼, 링크, 입력 폼 등 사용자가 데이터를 입력하거나 요청을 보낼 수 있는 요소들이 포함된다.
3) 피드백
View는 사용자가 어떤 작업을 했을 때 시스템에서 발생한 결과를 보여주는 피드백을 제공한다. 예를 들어, 성공 메시지나 오류 메시지 등을 화면에 표시하여 사용자가 시스템의 상태를 알 수 있도록 한다.
2-3. Controller (컨트롤러)
Controller는 클라이언트 측의 요청을 직접적으로 전달받는 엔드포인트(Endpoint)로써 Model과 View의 중간에서 상호작용을 해주는 역할을 한다.
클라이언트 측의 요청을 전달받아 비즈니스 로직을 거친 후, Model 데이터가 만들어지면, 이 Model 데이터를 View로 전달한다.
1) 클라이언트 요청 처리 (Request Handling)
Controller는 클라이언트로부터 오는 HTTP 요청을 **엔드포인트(Endpoint)에서 받아 처리한다. 예를 들어, 사용자가 특정 URL을 통해 웹 페이지를 요청하면, 해당 요청을 처리할 컨트롤러 메서드가 호출된다.
@GetMapping("/user/{id}")
public String getUser(@PathVariable("id") int userId, Model model) {
// 요청 처리 로직
}
2) Model 생성 & 페이지 이동
Controller는 비즈니스 로직을 통해 처리된 데이터를 Model에 담는다. 이렇게 하면 Model에 담긴 데이터가 최종적으로 View에서 사용된다. 또한 다른 페이지로 이동하고 렌더링하는 과정이 Controller에서 처리된다.
한마디로 model과 view를 연결하는 것이 controller이다. application logic을 신경쓰지 않고, view는 랜더링에 대한 책임을 갖고, model은 data처리에만 책임을 갖도록 중개인 역할을 한다.
model을 생성하고, view에게 model을 전달하고 , view의 액션을 처리한다.
🔥 여기서 잠깐 🔥
필자가 글을 작성하던 중 호기심이 생겨 해당 부분 짚고 넘어가기 위해 정리 ▼
🚀 View Resolver (뷰 리졸버)
다른 페이지로 이동하고 렌더링하는 과정은 Controller에서 처리되는 것으로 알고 있다. 그러나 이 과정에서 모델(Model)과과 뷰(View)가 어떻게 상호작용하는지에 따라 궁금해졌고, MVC 패턴 포스팅 자료조사를 하던 중 '뷰 리졸버(View Resolver)' 라는 생소한 개념을 마주치게 되어 페이지 이동과 렌더링이 어떻게 이루어지는지 여기에 간단히 정리해 본다.
그리고 나서 이후 포스팅을 이어가도록 하겠다.

💡 뷰 리졸버(View Resolver)
뷰 리졸버는 Controller가 반환한 뷰 이름을 실제 화면 파일로 변환해주는 역할을 한다.
Controller에서 return "viewName"처럼 뷰 이름을 반환하면, 뷰 리졸버가 그 이름을 바탕으로 실제 뷰 파일을 찾아 렌더링한다. 예를 들어, viewName을 반환하면 뷰 리졸버가 이를 viewName.jsp, viewName.html 같은 실제 파일로 바꿔서 사용자에게 응답을 보낸다.
Spring에서는 `InternalResourceViewResolver`를 사용해서 JSP 파일을 처리한다.
이 View Resolver는 뷰 이름을 .jsp 확장자를 가진 파일로 바꿔서 렌더링 해 준다.
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
이 경우, return "home"이라고 반환하면 WEB-INF/views/home.jsp 파일을 찾아 렌더링함.
1. 페이지 이동 (리다이렉션 또는 포워딩)
👩🏻🚀 Controller에서 다른 페이지로 이동하는 방법에는 두 가지가 있다.
1.1. 포워딩 (Forwarding)
포워딩은 현재 요청을 다른 뷰로 전달하는 방식
Controller에서 뷰 이름을 반환하면, View Resolver가 해당 뷰를 찾아 렌더링한다.
@GetMapping("/showProfile")
public String showProfile(Model model) {
model.addAttribute("user", userService.getUserDetails());
return "profile"; // profile.jsp나 profile.html로 포워딩
}
이 경우, return "profile"이 반환되면, View Resolver가 profile.jsp나 profile.html 파일을 렌더링하여 페이지를 보여주는 원리이다.
1.2. 리다이렉션 (Redirection)
리다이렉션은 현재 요청이 끝난 후, 새로운 URL로 다시 요청을 보내는 방식이다. 페이지 이동 후 URL이 바뀐다.
@PostMapping("/submitForm")
public String submitForm(@ModelAttribute Form form) {
formService.saveForm(form);
return "redirect:/formSuccess"; // formSuccess로 리다이렉션
}
위 코드에서 redirect:/formSuccess는 새로운 URL로 리다이렉션되며, 이때 Controller가 해당 URL을 처리하는 메서드를 실행해서 새로운 페이지를 렌더링한다.
⭐페이지 이동 (리다이렉션 또는 포워딩)은 Controller에서 처리한다.
⭐렌더링은 View에서 처리되며, Controller는 렌더링할 뷰를 선택하고 데이터를 전달한다.
⭐ Controller는 데이터를 Model에 담는다. 이 때 View Resolver가 그 데이터를 View로 전달하여 화면을 렌더링한다.
3. Spring MVC 패턴 구조

- 1클라이언트가 서버에 요청을 하면, Front Controller인 DispatcherServlet 클래스가 요청을 받는다.
- DispatcherServlet은 프로젝트 파일 내의 servlet-context.xml 파일의 @Controller 인자를 통해 등록한 요청 위임 컨트롤러를 찾아 매핑(mapping)된 컨트롤러가 존재하면 @RequestMapping을 통해 요청을 처리할 메서드로 이동한다.
- 컨트롤러는 해당 요청을 처리한 Service(서비스)를 받아 비즈니스 로직을 서비스에게 위임한다.
- Service는 요청에 필요한 작업을 수행하고, 요청에 대해 DB에 접근해야 한다면 DAO에 요청하여 처리를 위임한다.
- DAO는 DB 정보를 DTO를 통해 받아 서비스에게 전달한다.
- 서비스는 전달받은 데이터를 컨트롤러에게 전달한다.
- 컨트롤러는 Model(모델) 객체에게 요청에 맞는 View 정보를 담아 DispatcherServlet에게 전송한다.
- DispatcherServlet은 ViewResolver에게 전달받은 View 정보를 전달한다.
- ViewResolver는 응답할 View에 대한 JSP를 찾아 DispatcherServlet에게 전달한다.
- DispatcherServlet은 응답할 뷰의 Render를 지시하고 뷰는 로직을 처리한다.
- DispatcherServlet은 클라이언트에게 Rending된 뷰를 응답하며 요청을 마친다.
👩🏻🚀 DispatcherServlet
DispatcherServlet은 Spring MVC에서 Front Controller 역할을 하며, 클라이언트의 요청을 중앙에서 처리하는 컴포넌트이다. 모든 HTTP 요청은 먼저 DispatcherServlet에 전달되어, 적절한 Controller로 요청을 위임한 후, 그 결과를 View에 전달한다. DispatcherServlet은 HttpServlet을 상속받아 사용하고, 서블릿으로 동작한다.
DispatcherServlet → FrameworkServlet → HttpServletBean → HttpServlet
DispacherServlet을 사용하면 서블릿으로 등록하면서 모든 경로에 (urlPatterns=”/”)에 대해 매핑한다.
💡 DispatcherServlet을 Front Controller로 설정하는 방법 3가지
- web.xml: web.xml에서 DispatcherServlet을 설정하고, URL 매핑
- Java Configuration: WebApplicationInitializer를 구현하여 Java 코드로 설정
- Spring Boot: Spring Boot에서는 자동으로 DispatcherServlet이 설정됨.
👩🏻🚀 HandlerMapping
HandlerMapping 은 클라이언트의 요청 URL 을 어떤 컨트롤러가 처리할지 결정하는 기능을 한다.
👩🏻🚀 Controller
DispatcherServlet은 클라이언트의 HTTP 요청을 Controller로 전달하고, Controller는 요청을 처리한 후 결과를 Model에 저장하는 방식으로 반환한다. 반환된 결과(Model)는 HandlerAdapter에 의해 ModelAndView 객체로 변환된다. 이 객체에는 View Name과 함께, 응답에 포함될 데이터가 포함되어 있어 최종적으로 View에 전달된다.
👩🏻🚀 ModelAndView
Controller에 의해 반환된 Model과 View가 Wrapping된 객체이다.
👩🏻🚀 ViewResolver
ModelAndView 를 전달받은 DispatcherServlet 은 실제 클라이언트에게 보여질 View 를 렌더링하기 위해 어떤 View 객체를 사용할지 결정해야 한다. 이 때 호출하는 것이 ViewResolver 이다.
👩🏻🚀 View
ViewResolver 에 의해 View 객체가 결정되고 해당 객체를 통해 View 를 렌더링한다.
4. Spring MVC 의 발전 배경
MVC 1 패턴 → MCV 2 패턴 → Spring MVC
4-1. MVC 1 패턴

MVC 1 패턴은 초기 웹 애플리케이션에서 사용되었던 방식으로, 브라우저(사용자)로부터 요청이 들어오면 DB로부터 필요한 데이터를 받은 Model 객체(Java Bean)를 JSP 페이지(View)에 담아 응답으로 보내는 패턴이다. Model과 View가 결합되어 있어, JSP나 Servlet이 Model과 View 역할을 동시에 처리했습니다. 이로 인해 비즈니스 로직과 화면 표시 코드가 혼합되어 코드의 재사용성과 유지보수가 어려웠다.
👉🏻 이러한 점을 보완하여 Controller 역할을 하는 Servlet이 추가된 MVC2 패턴이 등장하게 되었다.
4-2. MVC 2 패턴

MVC 2 패턴에서는 요청을 하나의 컨트롤러(Servlet)가 먼저 받는다. 서블릿은 요청에 대한 비즈니스 로직을 처리한 후, 이를 JSP 파일에 반영하는 역할을 수행하기 위해 고안되었다. MVC 2에서는 Model과 View를 분리해서 Controller가 요청을 처리하고, Model과 View 사이를 연결하도록 한다. 이 방식은 코드 분리와 유지보수성을 개선하였고, 현재 대부분의 웹 애플리케이션에서 사용되고 있다.
4-3. Sprign MVC

Spring MVC는 MVC 2 패턴을 발전시킨 웹 모듈로, 스프링 프레임워크에서 사용된다. 이 구조에서는 프론트 컨트롤러(DispatcherServlet)가 모든 요청을 처음으로 받는다. 이후, 프론트 컨트롤러는 요청을 적절한 개별 컨트롤러(핸들러)로 넘긴다.
이 개별 컨트롤러는 DI(의존성 주입)를 통해 생성된 Bean을 사용해 비즈니스 로직을 처리하고, 처리 결과는 Model에 담겨 다시 프론트 컨트롤러로 전달된다. 프론트 컨트롤러는 이 Model을 적절한 View 템플릿에 전달하여, 최종적으로 사용자에게 보여줄 화면을 생성하고 응답한다.
결과적으로, Spring MVC는 클린한 구조로 요청을 처리하며, 각 역할을 명확히 분리하여 유지보수와 확장성이 용이하다!
참고 자료
1. 포스팅 작성에 도움을 주신 감사한 블로그 (꾸벅)
[Spring] Spring MVC Framework: MVC 패턴의 구조, 동작 과정
Spring MVC Framework는 웹 개발에서 널리 사용되는 아키텍처 중 하나로, MVC(Model-View-Controller) 패턴을 기반으로 한다. 💡MVC 패턴의 구조 Model 정의: 애플리케이션의 데이터를 책임지며, 비즈니스 로직
isaac-christian.tistory.com
Spring MVC 기본 동작 흐름
Spring MVC는 MVC Model2의 발전된 형태로 구성되어 있다. 구성요소 이름 설명 DispatcherServlet 클라이언트의 요청을 받아 컨트롤러에게 전달, 컨트롤러가 리턴한 결과값을 View에 전달하여 알맞은 응답을
codingnotes.tistory.com
스프링 MVC - 구조 이해
목차
catsbi.oopy.io
[Spring] Spring MVC란 무엇인가? - 스프링 MVC 구조 이해
하나의 서블릿 혹은 JSP 만으로 비즈니스 로직과 뷰 렌더링까지 모두 처리한다면, 너무 많은 역할을 하게 되어 유지보수가 어렵다.JSP 같은 뷰 템플릿은 화면을 렌더링 하는데 최적화 되어 있기
velog.io
FrontController 추가하는 법 ▼
[14일차] Spring MVC의 클라이언트 요청 처리 과정
스프링 MVC의 주요 구성 요소 DispatcherServlet : 클라이언트의 요청을 전달 받는다. 컨트롤러에게 클라이언트의 요청을 전달하고, 컨트롤러가 리턴한 결과 값을 View에 전달하여 알맞은 응답을 생성
snoopy81.tistory.com
'Java' 카테고리의 다른 글
[Java] 자바 Runtime addShutdownHook() 에 대해 알아보자 (16) | 2025.02.04 |
---|---|
[Java] 자바 배열 정렬 할 때 오버플로우 방지하는 법 (11) | 2025.02.01 |
[JSP & Servlet] URL 매핑 (9) | 2025.01.28 |
[Java] 쿼리스트링 으로 값 넘겨서 화면에 출력하기 (15) | 2025.01.26 |
[JSP & Servlet] 쿠키(Cookie)와 Session(세션), 쿼리스트링(QueryString) 에 대해 알아보자 (14) | 2025.01.26 |

1. Spring MVC 패턴이란?
Spring MVC는 웹 애플리케이션에서 클라이언트의 요청을 처리하는 모듈이다. Spring MVC는 서블릿(Servlet) API를 기반으로 하여 요청을 처리하는데, 이 구조를 통해 웹 애플리케이션을 모듈화하고 유지보수를 용이하게 만들어준다.

우선 Spring MVC 에 들어가기 앞어 기본적인 MVC패턴에 대해 알아보자. 이 MVC패턴에서 발전한 것이 Spring MVC 이다. MVC 패턴은 크게 3가지 주요 부분으로 나누어져 있다.
🍩 MVC 패턴을 사용하는 이유?
사용자가 보는 페이지, 데이터 처리, 그리고 이 둘을 중간에서 제어하는 컨트롤러로 각 컴포넌트가 서로 분리되어 시스템 결합도를 낮출 수 있다. 또한, 유지보수가 쉬우며, 중복코드를 제거할 수 있고, 애플리케이션의 확장성 및 유연성이 증가한다.
2. MVC패턴의 구조
🔍 Model (모델)
▶ 데이터나 비즈니스 로직을 처리하는 부분
▶ 예를 들어, 데이터베이스에서 정보를 가져오거나 처리하는 역할
🔍 View (뷰)
▶ 사용자에게 보여지는 화면을 담당하는 부분
▶ HTML, JSP, Thymeleaf 등으로 웹 페이지를 만들어 사용자에게 보여준다.
🔍 Controller (컨트롤러)
▶ 사용자의 요청을 받고, 이를 처리한 후 Model과 View를 연결해주는 역할
▶ 사용자가 어떤 동작을 하면, 그에 맞는 데이터를 처리하고 그 결과를 View에 전달해서 사용자에게 보여주는 방식으로 동작한다.
⭐ Spring MVC 흐름
사용자가 웹 페이지에서 요청을 보냄 → Controller가 이 요청을 받아서 필요한 Model을 호출 → Model은 데이터를 처리하고, 결과를 Controller에 전달 → Controller는 그 결과를 View에 전달해 사용자에게 보여줌

Controller는 클라이언트의 요청을 받아 비즈니스 로직을 처리하고, 처리된 데이터를 Model에 담아 View에 전달하는 중간 다리 역할을 한다. 이 과정에서 Model은 데이터와 상태를 관리하고, View는 사용자에게 그 데이터를 시각적으로 표시한다.
2-1. Model (모델)
🔥 Model은 웹 애플리케이션에서 데이터와 비즈니스 로직을 처리하는 핵심 부분으로Controller에서 처리한 결과를 담아 View에 전달한다.
1) 데이터객체
데이터베이스에서 가져온 엔티티(Entity)나 DTO(Data Transfer Object) 같은 구조체가 Model에서 다뤄진다. 이런 데이터 객체들은 컨트롤러에서 처리된 후, View에 전달되어 사용자가 볼 수 있는 형태로 변환된다.
public class User { private String name; private String email; // Getters and Setters }
2) data (database)
모델은 클라이언트에 노출되지 않는다. 연산처리 및 DB가 주 된 목적, 컨트롤러에서 요청이 오면 해당 연산처리 후 정보를 return
2-2. View (뷰)
View는 Model에서 전달된 데이터를 화면에 표시하고, 사용자와의 상호작용을 처리하는 역할을 한다. (UI / UX) 👨💻 주로 HTML, JSP, Thymeleaf 같은 템플릿을 사용하여 화면을 구성한다.
1) 데이터 표시
Model에서 전달받은 데이터를 화면에 표시한다. 예를 들어, 사용자 이름, 제품 목록, 주문 정보 등을 HTML 테이블이나 폼으로 나타낸다.
<h1>Welcome, ${user.name}</h1> <p>Email: ${user.email}</p>
2) 사용자 인터페이스(UI)
웹 페이지에서 버튼, 링크, 입력 폼 등 사용자가 데이터를 입력하거나 요청을 보낼 수 있는 요소들이 포함된다.
3) 피드백
View는 사용자가 어떤 작업을 했을 때 시스템에서 발생한 결과를 보여주는 피드백을 제공한다. 예를 들어, 성공 메시지나 오류 메시지 등을 화면에 표시하여 사용자가 시스템의 상태를 알 수 있도록 한다.
2-3. Controller (컨트롤러)
Controller는 클라이언트 측의 요청을 직접적으로 전달받는 엔드포인트(Endpoint)로써 Model과 View의 중간에서 상호작용을 해주는 역할을 한다.
클라이언트 측의 요청을 전달받아 비즈니스 로직을 거친 후, Model 데이터가 만들어지면, 이 Model 데이터를 View로 전달한다.
1) 클라이언트 요청 처리 (Request Handling)
Controller는 클라이언트로부터 오는 HTTP 요청을 **엔드포인트(Endpoint)에서 받아 처리한다. 예를 들어, 사용자가 특정 URL을 통해 웹 페이지를 요청하면, 해당 요청을 처리할 컨트롤러 메서드가 호출된다.
@GetMapping("/user/{id}") public String getUser(@PathVariable("id") int userId, Model model) { // 요청 처리 로직 }
2) Model 생성 & 페이지 이동
Controller는 비즈니스 로직을 통해 처리된 데이터를 Model에 담는다. 이렇게 하면 Model에 담긴 데이터가 최종적으로 View에서 사용된다. 또한 다른 페이지로 이동하고 렌더링하는 과정이 Controller에서 처리된다.
한마디로 model과 view를 연결하는 것이 controller이다. application logic을 신경쓰지 않고, view는 랜더링에 대한 책임을 갖고, model은 data처리에만 책임을 갖도록 중개인 역할을 한다.
model을 생성하고, view에게 model을 전달하고 , view의 액션을 처리한다.
🔥 여기서 잠깐 🔥
필자가 글을 작성하던 중 호기심이 생겨 해당 부분 짚고 넘어가기 위해 정리 ▼
🚀 View Resolver (뷰 리졸버)
다른 페이지로 이동하고 렌더링하는 과정은 Controller에서 처리되는 것으로 알고 있다. 그러나 이 과정에서 모델(Model)과과 뷰(View)가 어떻게 상호작용하는지에 따라 궁금해졌고, MVC 패턴 포스팅 자료조사를 하던 중 '뷰 리졸버(View Resolver)' 라는 생소한 개념을 마주치게 되어 페이지 이동과 렌더링이 어떻게 이루어지는지 여기에 간단히 정리해 본다.
그리고 나서 이후 포스팅을 이어가도록 하겠다.

💡 뷰 리졸버(View Resolver)
뷰 리졸버는 Controller가 반환한 뷰 이름을 실제 화면 파일로 변환해주는 역할을 한다.
Controller에서 return "viewName"처럼 뷰 이름을 반환하면, 뷰 리졸버가 그 이름을 바탕으로 실제 뷰 파일을 찾아 렌더링한다. 예를 들어, viewName을 반환하면 뷰 리졸버가 이를 viewName.jsp, viewName.html 같은 실제 파일로 바꿔서 사용자에게 응답을 보낸다.
Spring에서는 InternalResourceViewResolver
를 사용해서 JSP 파일을 처리한다.
이 View Resolver는 뷰 이름을 .jsp 확장자를 가진 파일로 바꿔서 렌더링 해 준다.
@Bean public InternalResourceViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); return resolver; }
이 경우, return "home"이라고 반환하면 WEB-INF/views/home.jsp 파일을 찾아 렌더링함.
1. 페이지 이동 (리다이렉션 또는 포워딩)
👩🏻🚀 Controller에서 다른 페이지로 이동하는 방법에는 두 가지가 있다.
1.1. 포워딩 (Forwarding)
포워딩은 현재 요청을 다른 뷰로 전달하는 방식
Controller에서 뷰 이름을 반환하면, View Resolver가 해당 뷰를 찾아 렌더링한다.
@GetMapping("/showProfile") public String showProfile(Model model) { model.addAttribute("user", userService.getUserDetails()); return "profile"; // profile.jsp나 profile.html로 포워딩 }
이 경우, return "profile"이 반환되면, View Resolver가 profile.jsp나 profile.html 파일을 렌더링하여 페이지를 보여주는 원리이다.
1.2. 리다이렉션 (Redirection)
리다이렉션은 현재 요청이 끝난 후, 새로운 URL로 다시 요청을 보내는 방식이다. 페이지 이동 후 URL이 바뀐다.
@PostMapping("/submitForm") public String submitForm(@ModelAttribute Form form) { formService.saveForm(form); return "redirect:/formSuccess"; // formSuccess로 리다이렉션 }
위 코드에서 redirect:/formSuccess는 새로운 URL로 리다이렉션되며, 이때 Controller가 해당 URL을 처리하는 메서드를 실행해서 새로운 페이지를 렌더링한다.
⭐페이지 이동 (리다이렉션 또는 포워딩)은 Controller에서 처리한다.
⭐렌더링은 View에서 처리되며, Controller는 렌더링할 뷰를 선택하고 데이터를 전달한다.
⭐ Controller는 데이터를 Model에 담는다. 이 때 View Resolver가 그 데이터를 View로 전달하여 화면을 렌더링한다.
3. Spring MVC 패턴 구조

- 1클라이언트가 서버에 요청을 하면, Front Controller인 DispatcherServlet 클래스가 요청을 받는다.
- DispatcherServlet은 프로젝트 파일 내의 servlet-context.xml 파일의 @Controller 인자를 통해 등록한 요청 위임 컨트롤러를 찾아 매핑(mapping)된 컨트롤러가 존재하면 @RequestMapping을 통해 요청을 처리할 메서드로 이동한다.
- 컨트롤러는 해당 요청을 처리한 Service(서비스)를 받아 비즈니스 로직을 서비스에게 위임한다.
- Service는 요청에 필요한 작업을 수행하고, 요청에 대해 DB에 접근해야 한다면 DAO에 요청하여 처리를 위임한다.
- DAO는 DB 정보를 DTO를 통해 받아 서비스에게 전달한다.
- 서비스는 전달받은 데이터를 컨트롤러에게 전달한다.
- 컨트롤러는 Model(모델) 객체에게 요청에 맞는 View 정보를 담아 DispatcherServlet에게 전송한다.
- DispatcherServlet은 ViewResolver에게 전달받은 View 정보를 전달한다.
- ViewResolver는 응답할 View에 대한 JSP를 찾아 DispatcherServlet에게 전달한다.
- DispatcherServlet은 응답할 뷰의 Render를 지시하고 뷰는 로직을 처리한다.
- DispatcherServlet은 클라이언트에게 Rending된 뷰를 응답하며 요청을 마친다.
👩🏻🚀 DispatcherServlet
DispatcherServlet은 Spring MVC에서 Front Controller 역할을 하며, 클라이언트의 요청을 중앙에서 처리하는 컴포넌트이다. 모든 HTTP 요청은 먼저 DispatcherServlet에 전달되어, 적절한 Controller로 요청을 위임한 후, 그 결과를 View에 전달한다. DispatcherServlet은 HttpServlet을 상속받아 사용하고, 서블릿으로 동작한다.
DispatcherServlet → FrameworkServlet → HttpServletBean → HttpServlet
DispacherServlet을 사용하면 서블릿으로 등록하면서 모든 경로에 (urlPatterns=”/”)에 대해 매핑한다.
💡 DispatcherServlet을 Front Controller로 설정하는 방법 3가지
- web.xml: web.xml에서 DispatcherServlet을 설정하고, URL 매핑
- Java Configuration: WebApplicationInitializer를 구현하여 Java 코드로 설정
- Spring Boot: Spring Boot에서는 자동으로 DispatcherServlet이 설정됨.
👩🏻🚀 HandlerMapping
HandlerMapping 은 클라이언트의 요청 URL 을 어떤 컨트롤러가 처리할지 결정하는 기능을 한다.
👩🏻🚀 Controller
DispatcherServlet은 클라이언트의 HTTP 요청을 Controller로 전달하고, Controller는 요청을 처리한 후 결과를 Model에 저장하는 방식으로 반환한다. 반환된 결과(Model)는 HandlerAdapter에 의해 ModelAndView 객체로 변환된다. 이 객체에는 View Name과 함께, 응답에 포함될 데이터가 포함되어 있어 최종적으로 View에 전달된다.
👩🏻🚀 ModelAndView
Controller에 의해 반환된 Model과 View가 Wrapping된 객체이다.
👩🏻🚀 ViewResolver
ModelAndView 를 전달받은 DispatcherServlet 은 실제 클라이언트에게 보여질 View 를 렌더링하기 위해 어떤 View 객체를 사용할지 결정해야 한다. 이 때 호출하는 것이 ViewResolver 이다.
👩🏻🚀 View
ViewResolver 에 의해 View 객체가 결정되고 해당 객체를 통해 View 를 렌더링한다.
4. Spring MVC 의 발전 배경
MVC 1 패턴 → MCV 2 패턴 → Spring MVC
4-1. MVC 1 패턴

MVC 1 패턴은 초기 웹 애플리케이션에서 사용되었던 방식으로, 브라우저(사용자)로부터 요청이 들어오면 DB로부터 필요한 데이터를 받은 Model 객체(Java Bean)를 JSP 페이지(View)에 담아 응답으로 보내는 패턴이다. Model과 View가 결합되어 있어, JSP나 Servlet이 Model과 View 역할을 동시에 처리했습니다. 이로 인해 비즈니스 로직과 화면 표시 코드가 혼합되어 코드의 재사용성과 유지보수가 어려웠다.
👉🏻 이러한 점을 보완하여 Controller 역할을 하는 Servlet이 추가된 MVC2 패턴이 등장하게 되었다.
4-2. MVC 2 패턴

MVC 2 패턴에서는 요청을 하나의 컨트롤러(Servlet)가 먼저 받는다. 서블릿은 요청에 대한 비즈니스 로직을 처리한 후, 이를 JSP 파일에 반영하는 역할을 수행하기 위해 고안되었다. MVC 2에서는 Model과 View를 분리해서 Controller가 요청을 처리하고, Model과 View 사이를 연결하도록 한다. 이 방식은 코드 분리와 유지보수성을 개선하였고, 현재 대부분의 웹 애플리케이션에서 사용되고 있다.
4-3. Sprign MVC

Spring MVC는 MVC 2 패턴을 발전시킨 웹 모듈로, 스프링 프레임워크에서 사용된다. 이 구조에서는 프론트 컨트롤러(DispatcherServlet)가 모든 요청을 처음으로 받는다. 이후, 프론트 컨트롤러는 요청을 적절한 개별 컨트롤러(핸들러)로 넘긴다.
이 개별 컨트롤러는 DI(의존성 주입)를 통해 생성된 Bean을 사용해 비즈니스 로직을 처리하고, 처리 결과는 Model에 담겨 다시 프론트 컨트롤러로 전달된다. 프론트 컨트롤러는 이 Model을 적절한 View 템플릿에 전달하여, 최종적으로 사용자에게 보여줄 화면을 생성하고 응답한다.
결과적으로, Spring MVC는 클린한 구조로 요청을 처리하며, 각 역할을 명확히 분리하여 유지보수와 확장성이 용이하다!
참고 자료
1. 포스팅 작성에 도움을 주신 감사한 블로그 (꾸벅)
[Spring] Spring MVC Framework: MVC 패턴의 구조, 동작 과정
Spring MVC Framework는 웹 개발에서 널리 사용되는 아키텍처 중 하나로, MVC(Model-View-Controller) 패턴을 기반으로 한다. 💡MVC 패턴의 구조 Model 정의: 애플리케이션의 데이터를 책임지며, 비즈니스 로직
isaac-christian.tistory.com
Spring MVC 기본 동작 흐름
Spring MVC는 MVC Model2의 발전된 형태로 구성되어 있다. 구성요소 이름 설명 DispatcherServlet 클라이언트의 요청을 받아 컨트롤러에게 전달, 컨트롤러가 리턴한 결과값을 View에 전달하여 알맞은 응답을
codingnotes.tistory.com
스프링 MVC - 구조 이해
목차
catsbi.oopy.io
[Spring] Spring MVC란 무엇인가? - 스프링 MVC 구조 이해
하나의 서블릿 혹은 JSP 만으로 비즈니스 로직과 뷰 렌더링까지 모두 처리한다면, 너무 많은 역할을 하게 되어 유지보수가 어렵다.JSP 같은 뷰 템플릿은 화면을 렌더링 하는데 최적화 되어 있기
velog.io
FrontController 추가하는 법 ▼
[14일차] Spring MVC의 클라이언트 요청 처리 과정
스프링 MVC의 주요 구성 요소 DispatcherServlet : 클라이언트의 요청을 전달 받는다. 컨트롤러에게 클라이언트의 요청을 전달하고, 컨트롤러가 리턴한 결과 값을 View에 전달하여 알맞은 응답을 생성
snoopy81.tistory.com
'Java' 카테고리의 다른 글
[Java] 자바 Runtime addShutdownHook() 에 대해 알아보자 (16) | 2025.02.04 |
---|---|
[Java] 자바 배열 정렬 할 때 오버플로우 방지하는 법 (11) | 2025.02.01 |
[JSP & Servlet] URL 매핑 (9) | 2025.01.28 |
[Java] 쿼리스트링 으로 값 넘겨서 화면에 출력하기 (15) | 2025.01.26 |
[JSP & Servlet] 쿠키(Cookie)와 Session(세션), 쿼리스트링(QueryString) 에 대해 알아보자 (14) | 2025.01.26 |