Spring MVC 패턴이란?
Spring Framework에서 제공하는 MVC 패턴은 웹 어플리케이션 개발 시 비즈니스 로직, UI, 사용자 입력 처리를 명확히 분리하여 유지보수성과 확장성을 높이기 위한 아키텍처 패턴이다.
MVC란 Model-View-Controller의 약자로, 각 레이어가 다음과 같은 역할을 한다.
1. Model (모델)
•
비즈니스 로직과 데이터를 담당한다.
•
데이터베이스와의 통신이나, 핵심 도메인 로직이 여기에 위치한다.
•
Spring에서는 Service Layer + Repository Layer가 이 영역에 해당할 수 있다.
•
User, Order 엔티티 클래스, UserRepository, UserService 등이 모델이다.
2. View (뷰)
•
사용자에게 보여지는 UI 영역이다.
•
모델 데이터를 기반으로 화면을 렌더링한다.
•
Spring MVC에서는 보통 JSP, Thymeleaf, Mustache 등을 사용하여 View를 구현한다.
•
최근에는 React나 Vue와 같은 프론트엔드 라이브러리, 프레임워크와 연동해 JSON 응답으로 API View를 제공하기도 한다.
3. Controller (컨트롤러)
•
사용자의 요청을 처리하고, 적절한 모델 데이터를 조회한 뒤 뷰에 전달하는 역할을 한다.
•
사용자의 입력을 받아 검증하고, 서비스 레이어를 호출하여 결과를 반환한다.
•
Spring에서는 @Controller 나 @RestController 로 구현한다.
•
로그인 요청 처리, 게시글 작성 처리 등을 담당하는 클래스.
Spring MVC의 동작 흐름
1.
사용자 요청:
a.
브라우저에서 URL을 호출하면, 요청이 Spring의 DispatcherServlet에 도달한다.
2.
Handler Mapping:
a.
DispatcherServlet은 URL과 매핑되는 Controller를 찾는다.
3.
Controller 호출:
a.
해당 Controller 메서드가 실행되어 비즈니스 로직을 수행하고 모델 데이터를 반환한다.
4.
View Resolver:
a.
View가 렌더링되어 최종 HTML을 사용자에게 응답한다. (또는 JSON 응답일 경우 데이터 반환)
요청 → DispatcherServlet → Controller → Service → Repository → DB
↓
Model 데이터
↓
View Resolver → View 렌더링 → 응답
Java
복사
DispatcherServlet의 역할
DispatcherServlet은 Spring MVC에서 Front Controller 역할을 한다.
즉, 모든 HTTP 요청을 중앙에서 받아 적절한 Controller로 분배하는 역할을 한다.
•
브라우저 요청 → DispatcherServlet이 가장 먼저 받음.
•
내부적으로 HandlerMapping을 통해 어떤 Controller가 처리할지 결정.
•
Controller에서 반환한 결과를 ViewResolver를 통해 View로 변환하거나, 바로 응답.
“모든 요청의 관문” 역할이며, 요청을 받고, 로직 처리 후 응답까지 전체 흐름을 제어한다.
DispatcherServlet = Spring MVC의 중심 컨트롤 타워
ViewResolver란
ViewResolver는 Controller에서 반환한 논리적 View 이름을 실제 View 파일로 변환하는 역할을 한다.
예를 들어:
return "userList";
Java
복사
라고 Controller가 반환하면,
ViewResolver가 이를 → /WEB-INF/views/userList.jsp로 변환해 렌더링한다.
동작 예시
•
논리적 이름: “userList”
•
ViewResolver 매핑: /WEB-INF/views/ + userList + .jsp
•
최종 경로: /WEB-INF/views/userList.jsp
@Controller vs @RestController 차이점
어노테이션 | 반환 형태 | 사용 목적 |
@Controller | View (HTML, JSP 등) | 웹 페이지 렌더링용 |
@RestController | JSON / XML | REST API용 (데이터 응답) |
1. @Controller
•
ViewResolver를 거쳐 HTML 뷰를 반환.
•
보통 Thymeleaf, JSP와 함께 사용.
@Controller
public class UserController {
@GetMapping("/users")
public String getUsers() {
return "userList"; // View 이름 반환
}
}
Java
복사
2. @RestController
•
@Controller + @ResponseBody 조합.
•
데이터를 직접 반환 (JSON/XML) 하며 View를 거치지 않음.
@RestController
public class UserApiController {
@GetMapping("/api/users")
public List<User> getUsers() {
return userService.findAll(); // JSON으로 반환
}
}
Java
복사
@Controller → View 반환용,
@RestController → 데이터(API) 반환용
MVC 패턴을 사용하면 어떤 점이 좋은가?
MVC (Model-View-Controller) 패턴의 가장 큰 장점은 바로 관심사의 분리(Separation of Concerns, SoC) 이다.
얻는 효과:
•
유지보수 용이: View, 비즈니스 로직, 데이터 처리가 분리되어 수정이 쉬움.
•
테스트 용이: Controller와 Service를 독립적으로 단위 테스트 가능.
•
확장성 높음: View를 React나 모바일 앱용 API로 손쉽게 교체 가능.
•
협업에 유리: 프론트엔드(뷰)와 백엔드(모델, 컨트롤러)를 다른 팀이 동시에 작업 가능.
"MVC 패턴은 관심사를 분리해 유지보수, 테스트, 확장성을 높여준다. 특히, View와 비즈니스 로직을 독립적으로 개발하고 변경할 수 있는 구조를 제공한다."