5.1 ~ 5.3 Spring MVC 모델의 이해
1. 클라이언트-서버 구조와 HTTP 통신 복습
웹은 크게 두 역할로 나뉩니다.
- 클라이언트 (Browser/App): 요청을 보내는 쪽 (예: 크롬에서 URL 입력 또는 API 버튼 클릭)
- 서버 (Spring Boot App): 요청을 받아 처리하고 응답을 돌려주는 쪽
이 둘이 소통하는 규약이 HTTP(HyperText Transfer Protocol) 입니다.
클라이언트 서버(Spring Boot)
[브라우저] ---HTTP 요청(Request)---> [컨트롤러]
<--HTTP 응답(Response)--- [처리 결과 반환]
HTTP 요청/응답의 구조
| 구성 요소 | 설명 | 예시 |
|---|---|---|
| URL | 어디로 요청하는가 | GET /api/users/1 |
| Method | 어떤 작업을 하는가 | GET, POST, PUT, DELETE |
| Header | 요청의 메타 정보 | Content-Type: application/json |
| Body | 전송하는 데이터 (POST 등) | {"name": "홍길동"} |
| Status Code | 응답 결과 코드 | 200 OK, 404 Not Found |
2. MVC 아키텍처 패턴
MVC (Model-View-Controller) 는 애플리케이션의 역할을 3가지로 분리하는 설계 패턴입니다.
요청 → [Controller] → [Service/Model] → [View or JSON 응답]
| 레이어 | 역할 | 실제 코드 |
|---|---|---|
| Model | 데이터와 비즈니스 로직 | UserService, UserRepository, User Entity |
| View | 사용자에게 보여지는 UI | REST API → ** JSON 응답**(또는 Thymeleaf HTML) |
| Controller | 요청을 받아 Model을 호출하고 View를 결정 | @RestController 클래스 |
MVC를 분리하면 무엇이 좋은가?
- 역할 명확화: 각 레이어가 자신의 책임에만 집중합니다.
- 유지보수 용이: DB 로직을 바꿔도 Controller를 건드릴 필요가 없습니다.
- 테스트 용이: 각 레이어를 독립적으로 단위 테스트할 수 있습니다.
3. DispatcherServlet과 요청의 전체 라이프사이클
스프링 MVC의 진짜 핵심은 DispatcherServlet 이라는 단 하나의 '전방 컨트롤러(Front Controller)'입니다. 모든 HTTP 요청은 반드시 이곳을 먼저 통과합니다.
요청 처리 전체 흐름
[HTTP 요청]
↓
[DispatcherServlet] (스프링이 관리하는 중앙 허브)
↓
[HandlerMapping] (URL에 맞는 Controller 메서드 탐색)
↓
[Controller 메서드 실행] (@GetMapping, @PostMapping 등)
↓
[Service → Repository → DB] (비즈니스 로직 및 데이터 처리)
↓
[결과 반환] (REST API → JSON으로 직렬화 / MVC → ViewResolver)
↓
[HTTP 응답]
DispatcherServlet의 역할 분담
| 협력 객체 | 역할 |
|---|---|
| HandlerMapping | 어느 Controller가 어느 URL을 처리할지 결정 |
| HandlerAdapter | Controller를 실제로 실행시키는 어댑터 |
| ViewResolver | 반환된 뷰 이름을 실제 파일(HTML 등)로 변환 |
| MessageConverter | 자바 객체를 JSON으로 변환 (Jackson 사용) |
REST API 개발 시의 단순화:
@RestController를 사용하면 ViewResolver를 거치지 않고, ** MessageConverter(Jackson)**가 직접 자바 객체를 JSON으로 변환하여 HTTP 응답 Body에 담아 돌려줍니다. 이 흐름을 이해하면 스프링 부트 개발의 전체 그림이 보입니다.
핵심 정리
- 모든 HTTP 요청은 DispatcherServlet 이 먼저 받습니다.
- Controller 는 요청의 관문 역할만 하며, 비즈니스 로직은 Service 에 위임합니다.
- Service 는 비즈니스 규칙을 처리하고, 데이터가 필요하면 Repository 를 통해 DB에 접근합니다.
- REST API는 최종적으로 JSON 형태로 응답을 반환합니다.
이 계층 구조(Controller - Service - Repository)가 스프링 부트 실무 개발의 뼈대입니다.