Spring MVC
💡Spring MVC란?
- Spring 공식 문서에서 Spring MVC에 대한 설명으로 ‘DispatcherServlet이 중앙에서 HTTP 요청을 처리해주는데 이는 Front Controller 패턴으로 설계되어있다’라고 설명하고 있다. 1
- Spring에서 MVC 디자인 패턴을 적용하여 HTTP 요청을 효율적으로 처리하고 있다고 이해할 수 있다.
- 반환할 데이터는 Model에 담고, Model 적용이될 View name을 DispatcherServlet에 전달하면, Viewresolver를 통해 Model의 데이터가 View에 적용되고, 완성된 페이지를 Client에 반환한다.
DispatcherServlet
💡Servlet

- Servlet은 자바를 사용하여 웹 페이지를 동적으로 생성하는 서버 측 프로그램 혹은 표준 규칙을 말한다.
- HTTP 요청을 받아서 처리하고, 그 결과(응답)를 클라이언트(브라우저)에 보내는 역할을 한다.
🔎 Servlet 동작 흐름
- 사용자가 Client(브라우저)를 통해 서버에 HTTP Request 즉, API 요청
- 요청을 받은 Servlet 컨테이너는 HttpServletRequest, HttpServletResponse 객체 생성
- 약속된 HTTP의 규격을 맞추면서, 쉽게 HTTP에 담긴 데이터를 사용하기 위한 객체
- Servlet 컨테이너(ex. Tomcat)가 HTTP를 분석해 사용해야할 데이터 정보를 HttpServletRequest 객체에 넣어줌
- 설정된 정보를 통해 어떠한 Servlet에 대한 요청인지 찾음 (web.xml에서 찾음)
- 해당 Servlet에서 service 메서드를 호출한 뒤 브라우저의 요청 Method에 따라 doGet 혹은 doPost 등의 메서드를 호출
- 호출한 메서드들의 결과를 그대로 반환하거나 동적 페이지를 생성한 뒤 HttpServletResponse 객체에 응답을 담아 Client(브라우저)에 반환
- 응답이 완료되면 생성한 HttpServletRequest, HttpServletResponse 객체 소멸
💡DispatcherServlet

- Dispatcher는 한글로 '전달하다'라는 의미가 있다. 즉, DispatcherServlet은 전달하는 서블릿이라고 이해할 수 있다.
- 모든 API 요청을 앞서 살펴본 서블릿의 동작 방식에 맞춰 코드를 구현한다면 무수히 많은 Servlet 클래스를 구현해야한다.
- 따라서 Spring은 DispatcherServlet을 사용하여 Front Controller 패턴 방식으로 API 요청을 효율적으로 처리하고 있다.
🔎 Front Controller 동작 흐름
1. Client(브라우저)에서 HTTP 요청이 들어오면 DispatcherServlet 객체가 요청을 분석
2. DispatcherServlet 객체는 분석한 데이터를 토대로 Handler mapping을 통해 Controller를 찾아 요청을 전달

➡️ Handler mapping 에는 API path 와 Controller 메서드가 매칭되어 있다.
@RestController
public class HelloController {
@GetMapping("/api/hello")
public String hello() {
return "Hello World!";
}
}
➡️ API path 즉, URL을 Controller에 작성하는 방법은 @Controller 애너테이션이 달려있는 클래스를 생성한 뒤 @GetMapping 처럼 요청한 HTTP Method 와 일치하는 애너테이션을 추가한 메서드를 구현한다.
- URL은 @GetMapping("/api/hello") 이처럼 해당 애너테이션의 속성값으로 전달해주면 된다.
- 해당 메서드명은 URL을 매핑하는데 영향을 미치지 않음으로 자유롭게 정해도 상관 없다.
- 이제는 직접 Servlet을 구현하지 않아도 DispatcherServlet에 의해 간편하게 HTTP 요청을 처리할 수 있게 되었다.
3. Controller → DispathcerServlet
- 해당 Controller는 요청에 대한 처리를 완료 후 처리에 대한 결과 즉, 데이터(Model)와 화면에 보여줄 결과(View) 정보를 전달
4. DispatcherServlet → Client
- ViewResolver 통해 View에 Model을 적용하여 View를 Client에게 응답으로 전달
Controller
Controller에 대해 이해하기 위해, Spring MVC에 Front Controller 패턴이 적용되지 않았다면 어땠을지 살펴보자.
💡Servlet Code
@WebServlet(urlPatterns = "/user/login")
public class UserLoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
// ...
}
}
@WebServlet(urlPatterns = "/user/logout")
public class UserLogoutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
// ...
}
}
@WebServlet(urlPatterns = "/user/signup")
public class UserSingUpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
// ...
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
// ...
}
}
- 이처럼 단 4개의 API를 처리하기 위해 무려 3개의 클래스를 만들어야한다.
💡Controller Code
@Controller
@RequestMapping("/user")
public class UserController {
@GetMapping("/login")
public String login() {
// ...
}
@GetMapping("/logout")
public String logout() {
// ...
}
@GetMapping("/signup")
public String signup() {
// ...
}
@PostMapping("/signup")
public String registerUser(SignupRequestDto requestDto) {
// ...
}
}
- 이렇게 Spring MVC에서 효율적인 API처리를 위해 Front Controller 패턴을 만들어냈다.
- 유사한 성격의 API를 하나의 Controller로 관리한다.
- 메서드명도 자유롭게 설정 가능하다 (단, 클래스 내의 중복메서드명 불가)
- @Controller는 해당 클래스가 Controller의 역할을 수행할 수 있도록 등록해준다.
출처
https://teamsparta.notion.site/1-9-Spring-MVC-2252dc3ef51481c7ab82c942f0767b99
챕터1-9 : Spring MVC란 무엇일까? | Notion
MVC 디자인 패턴이란?
teamsparta.notion.site
주석 출처
'심화 > Spring' 카테고리의 다른 글
| [Spring] HTTP 데이터를 객체로 처리하는 방법 (0) | 2025.09.25 |
|---|---|
| [Spring] PathVariable과 RequestParam (0) | 2025.09.24 |
| [Spring] HTTP란 무엇일까? (1) | 2025.09.22 |
| [Spring] Apache Tomacat이란 무엇일까? (0) | 2025.09.18 |
| [Spring] RESTful API란? (0) | 2025.09.17 |