Spring MVC는 Spring 프레임워크에서 제공하는 웹(Web) 애플리케이션 개발 모듈입니다. 이름에서 알 수 있듯이, 웹 개발의 표준적인 디자인 패턴인 MVC(Model-View-Controller) 패턴을 기반으로 설계되었습니다.
핵심 목표: 비즈니스 로직(Model), 화면(View), 그리고 요청 처리(Controller)의 역할을 명확하게 분리(Separation of Concerns)하여, 애플리케이션의 유연성과 확장성을 높이는 것입니다.
DispatcherServletSpring MVC의 모든 요청은 DispatcherServlet이라는 단 하나의 서블릿을 통해 처리됩니다. DispatcherServlet은 클라이언트의 모든 요청을 가장 먼저 받는 중앙 관제탑(Front Controller) 역할을 합니다.
DispatcherServlet의 역할:
HandlerMapping에게 위임합니다.HandlerAdapter에게 위임합니다.ViewResolver에게 전달하여 실제 뷰 객체를 찾습니다.| 컴포넌트 | 역할 | 설명 |
|---|---|---|
DispatcherServlet | Front Controller | 모든 HTTP 요청을 가장 먼저 받아 처리의 전 과정을 조율하는 중앙 제어 장치 |
HandlerMapping | 핸들러(컨트롤러) 탐색 | 요청 URL에 매핑되는 컨트롤러(메서드)를 찾아 DispatcherServlet에 반환 |
HandlerAdapter | 핸들러 실행 | HandlerMapping이 찾은 컨트롤러를 실제로 실행하고, 그 결과를 ModelAndView 객체로 변환하여 반환 |
Controller | 요청 처리 및 비즈니스 로직 호출 | 실제 요청을 처리하고, 서비스 계층을 호출하여 비즈니스 로직을 수행한 뒤, 결과 데이터(Model)와 뷰 이름(View Name)을 반환 |
Model | 데이터 저장소 | 컨트롤러가 처리한 결과 데이터(비즈니스 로직의 결과)를 담는 객체. View에 전달됨 |
ViewResolver | 뷰 탐색 | 컨트롤러가 반환한 논리적인 뷰 이름(e.g., "home")을 실제 물리적인 뷰 파일(e.g., /WEB-INF/views/home.jsp)로 변환 |
View | 응답 렌더링 | Model의 데이터를 사용하여 최종 응답 화면(HTML, JSON 등)을 생성하고 클라이언트에게 전송 |
DispatcherServlet이 요청을 받습니다.DispatcherServlet은 HandlerMapping에게 요청 URL을 처리할 컨트롤러를 찾아달라고 요청합니다.DispatcherServlet은 찾아낸 컨트롤러를 실행할 수 있는 HandlerAdapter를 찾습니다.HandlerAdapter는 해당 컨트롤러의 메서드를 실행합니다.Model 객체에 담습니다.Model과 함께 뷰의 논리적 이름(String)을 DispatcherServlet에 반환합니다. (내부적으로 ModelAndView 객체로 처리됨)DispatcherServlet은 ViewResolver에게 뷰 이름을 전달하여 실제 View 객체를 찾습니다.DispatcherServlet은 찾은 View 객체에 Model 데이터를 전달하여 화면을 렌더링하도록 요청합니다.View는 Model 데이터를 바탕으로 최종 응답(HTML 등)을 생성하여 클라이언트에게 반환합니다.| 어노테이션 | 설명 |
|---|---|
@Controller | 해당 클래스가 Spring MVC의 컨트롤러임을 나타냅니다. |
@RestController | @Controller와 @ResponseBody를 합친 것으로, 주로 REST API에서 JSON/XML 형태의 데이터를 반환할 때 사용합니다. |
@RequestMapping | 특정 URL 경로와 컨트롤러의 메서드를 매핑합니다. (@GetMapping, @PostMapping 등으로 축약 가능) |
@RequestParam | HTTP 요청 파라미터(e.g., ?name=John)를 메서드의 매개변수에 바인딩합니다. |
@ModelAttribute | 요청 파라미터를 객체(DTO)에 바인딩하거나, Model에 속성을 추가할 때 사용합니다. |
@RequestBody | HTTP 요청의 본문(Body)에 담긴 JSON/XML 데이터를 객체에 바인딩합니다. |
@ResponseBody | 메서드의 반환 값이 뷰 이름이 아니라, HTTP 응답 본문(Body)에 직접 쓰여져야 함을 나타냅니다. (@RestController에 포함됨) |
@PathVariable | URL 경로의 일부(e.g., /users/{userId})를 메서드의 매개변수에 바인딩합니다. |
DispatcherServlet이 모든 요청을 받아 중앙에서 조율하는 Front Controller 패턴을 사용합니다.HandlerMapping, HandlerAdapter, ViewResolver 등의 구성 요소들이 DispatcherServlet과 협력하여 요청을 체계적으로 처리합니다.