Spring MVC는 Spring 프레임워크에서 제공하는 웹(Web) 애플리케이션 개발 모듈입니다. 웹 개발의 표준적인 디자인 패턴인 MVC(Model-View-Controller) 패턴을 기반으로, 웹 계층의 역할을 명확하게 분리하여 유연하고 확장성 있는 웹 애플리케이션을 만들 수 있도록 지원합니다.
MVC 패턴의 역할 분리:
DispatcherServletSpring MVC는 Front Controller 패턴을 기반으로 설계되었습니다. 이는 모든 클라이언트의 요청을 단 하나의 진입점에서 먼저 받은 후, 요청에 맞는 컨트롤러로 작업을 위임하는 중앙 집중형 구조입니다.
DispatcherServlet:
DispatcherServlet 덕분에 개발자는 서블릿을 직접 다루는 복잡함에서 벗어나, 컨트롤러 로직에만 집중할 수 있습니다.클라이언트의 요청이 들어와서 응답이 나가기까지, DispatcherServlet은 여러 협력 컴포넌트들과 함께 다음과 같은 순서로 작업을 처리합니다.

[요청] 클라이언트가 URL을 요청하면 DispatcherServlet이 요청을 받습니다.
[핸들러 탐색] HandlerMapping:
DispatcherServlet은 HandlerMapping에게 "이 요청 URL(.../users/1)을 처리할 컨트롤러(핸들러)가 누구인지 찾아줘"라고 요청합니다.HandlerMapping은 @RequestMapping, @GetMapping 등의 어노테이션 정보를 기반으로, 요청을 처리할 적절한 컨트롤러 메서드를 찾아 DispatcherServlet에 반환합니다.[핸들러 실행] HandlerAdapter:
DispatcherServlet은 찾아낸 컨트롤러를 직접 실행하지 않고, HandlerAdapter에게 컨트롤러 실행을 위임합니다.HandlerAdapter는 다양한 종류의 컨트롤러를 일관된 방식으로 실행할 수 있도록 도와주는 "어댑터" 역할을 합니다.HandlerAdapter는 컨트롤러 메서드를 실행하고, 그 결과를 ModelAndView라는 객체로 변환하여 DispatcherServlet에 반환합니다.[컨트롤러 실행] Controller:
Model 객체에 담습니다.@ResponseBody가 붙은 경우 데이터 객체(DTO)를 반환합니다.[뷰 탐색] ViewResolver:
DispatcherServlet은 컨트롤러로부터 받은 논리적인 뷰 이름(e.g., "home")을 ViewResolver에게 전달합니다.ViewResolver는 이 논리적 이름을 실제 물리적인 뷰 파일(e.g., /WEB-INF/views/home.jsp)이나 템플릿(e.g., templates/home.html)으로 변환하는 "주소록" 역할을 합니다.[렌더링 및 응답] View:
DispatcherServlet은 찾은 View 객체에 Model 데이터를 전달하여 최종 응답 화면을 렌더링하도록 요청합니다.View는 Model 데이터를 바탕으로 최종 응답(HTML)을 생성하여 클라이언트에게 반환합니다.@RestController의 경우, ViewResolver와 View 단계를 건너뛰고, HttpMessageConverter가 반환된 객체를 JSON으로 변환하여 즉시 응답합니다.)| 컴포넌트 | 역할 | 비유 |
|---|---|---|
DispatcherServlet | 중앙 관제탑 | 모든 요청을 받고 전체 흐름을 조율 |
HandlerMapping | 요청-컨트롤러 매칭 | "이 주소는 어느 부서 담당인가요?"를 알려주는 안내 데스크 |
HandlerAdapter | 컨트롤러 실행기 | 다양한 종류의 담당자(컨트롤러)를 동일한 방식으로 일하게 하는 비서 |
Controller | 실제 업무 처리 | 요청을 받아 실제 비즈니스 로직을 수행하는 담당자 |
ViewResolver | 뷰 주소록 | "결과 보고서 양식 어디있지?"를 알려주는 문서 관리자 |
View | 최종 보고서 작성 | 데이터를 받아 최종 결과물(HTML, JSON)을 만드는 역할 |
DispatcherServlet이라는 Front Controller가 먼저 받는 중앙 집중형 구조입니다.DispatcherServlet은 직접 모든 일을 처리하는 대신, HandlerMapping, HandlerAdapter, ViewResolver와 같은 전문화된 컴포넌트들에게 역할을 위임하여 요청 처리의 전 과정을 조율합니다.Controller의 구현에만 집중할 수 있어 생산성이 크게 향상됩니다.