1. MVC 패턴이란?
MVC(Model-View-Controller)는 소프트웨어 디자인 패턴 중 하나로, 애플리케이션의 역할을 세 가지로 나누어 관리한다.
- Model (데이터): 애플리케이션의 정보와 데이터를 처리한다. (Entity, DTO)
- View (화면): 사용자에게 보여지는 UI를 담당한다. (HTML, React, Mobile App)
- Controller (제어): 사용자의 요청을 받아 모델과 뷰 사이를 연결한다. (@Controller, @RestController)
2. 시대에 따른 MVC의 변화: HTML vs JSON
과거에는 서버가 화면까지 다 만들었지만, 지금은 데이터만 보내주는 방식이 주류다.
① 전통적인 방식 (SSR: Server Side Rendering)
서버에서 직접 HTML을 그려서 브라우저에 던져주는 방식이다.
- 응답: 완성된 HTML 파일
- 특징: 페이지를 이동할 때마다 화면이 깜빡이며 새로고침된다.
- 도구: JSP, Thymeleaf, Mustache
② 현대적인 API 방식 (CSR: Client Side Rendering)
서버는 JSON 데이터만 보내고, 화면은 프론트엔드(React, Vue)가 전담한다.
- 응답: JSON 데이터 ({"id": 1, "title": "공부하기"})
- 특징: 필요한 데이터만 주고받으므로 빠르고 효율적이다. 웹뿐만 아니라 모바일 앱과도 같은 API를 공유할 수 있다.

※ Todo 프로젝트(이전 포스팅) MVC 적용 상태
Model (데이터):
├─ Todo.java (Entity)
├─ TodoCreateRequest.java (DTO)
└─ TodoResponse.java (DTO)
View (화면):
└─ React (별도 프로젝트)
Controller (요청 처리):
└─ TodoController.java
3. 백엔드 내부의 흐름: Layered Architecture
MVC가 웹 애플리케이션의 전체적인 구조라면, Layered Architecture는 백엔드 서버 내부의 세분화된 역할 분담이다.
| 계층 (Layer) | 역할 | 관련 파일 |
| Presentation | 클라이언트의 요청을 받고 응답을 반환한다 | TodoController |
| Business | 핵심 비즈니스 로직과 도메인 규칙을 처리한다 | TodoService |
| Persistence | 데이터베이스 접근 및 CRUD를 수행한다 | TodoRepository |
| Data | 실제 데이터 구조 및 전송 객체를 정의한다 | Todo, TodoResponse |

꿀팁: MVC의 Controller는 Presentation 계층에 해당하고, Model은 비즈니스/데이터 계층 전체에 걸쳐 존재한다고 이해하면 쉽다.
4. Spring MVC의 핵심: DispatcherServlet
스프링 부트 내부에서 요청이 어떻게 처리되는지 그 과정을 이해하는 것이 중요하다.
- DispatcherServlet: 모든 요청을 가장 먼저 받아 적절한 곳으로 배달해주는 '중앙 우체국' 역할을 한다.
- HandlerMapping: "이 URL은 어떤 컨트롤러가 처리해야 하지?"를 찾아준다.
- Controller: 실제 로직을 수행한다. (Service 호출 등)
- HttpMessageConverter: @RestController를 사용하면 객체를 JSON으로 자동 변환해준다.
5. Checkpoint
Spring MVC
- 스프링에서 제공하는 웹 MVC 프레임워크
- @Controller, @RestController 등이 Spring MVC의 일부
Spring Boot MVC
- Spring MVC를 Spring Boot에서 사용하는 것
- 자동 설정이 추가되어 더 쉬움
MVC 패턴
- 디자인 패턴 (Model-View-Controller)
- 프레임워크와 무관한 개념
| 구분 | MVC 패턴 | Spring MVC |
| 정체 | 소프트웨어 디자인 이론이자 아키텍처 패턴 | 스프링 프레임워크 내부에 포함된 실제 웹 MVC 모듈 |
| 역할 | Model, View, Controller로 역할을 분리하자는 설계 규칙 | MVC 규칙을 쉽게 구현할 수 있도록 지원하는 기능 집합 |
| 목적 | 코드 구조와 책임 분리를 명확히 정의 | MVC 패턴을 실무에서 바로 적용할 수 있게 함 |
| 비유 | 레시피에 해당 (어떻게 요리할 것인가) | 밀키트에 해당 (레시피대로 재료가 준비된 세트) |
→ 스프링에서 MVC 패턴을 적용하려고 Spring MVC를 쓰는 것
Q. @Controller와 @RestController의 차이는?
- @Controller: 주로 View(HTML)를 반환할 때 사용한다.
- @RestController: JSON/XML 같은 데이터를 반환할 때 사용한다. (@Controller + @ResponseBody의 결합형)
Q. 왜 Entity를 직접 반환하지 않고 DTO를 사용하나?
- 보안: Entity의 모든 필드(비밀번호 등)가 노출되는 것을 방지한다.
- 독립성: DB 구조가 바뀌어도 API 스펙(응답 값)이 변하지 않도록 완충지대 역할을 한다.
- 순환 참조 방지: JPA 사용 시 양방향 연관관계에서 발생하는 무한 루프 문제를 막아준다.
'Spring > 기타' 카테고리의 다른 글
| [Spring Boot] 프로젝트 구조 이해: Todo API로 배우는 5단계 아키텍처 (1) | 2026.01.22 |
|---|---|
| [Spring Boot] 웹 서비스 전체 실행 흐름 분석 (React, FastAPI, MySQL 연동 아키텍처) (0) | 2026.01.20 |

