< 2024.12.15 업로드 >
DispatcherServlet: Spring MVC에서의 역할과 요청 흐름
지난 기사에서 서블릿(Servlet)에 대해 다뤘었죠? 오늘은 그 내용을 바탕으로, Spring MVC에서 중요한 역할을 맡고 있는 DispatcherServlet에 대해 좀 더 깊이 들어가 보려고 합니다. 복잡해 보일 수 있지만, 하나씩 차근차근 쉽게 설명해 드리겠습니다! 함께 시작해볼까요?
✍️ MVC 패턴이란?
MVC(Model-View-Controller) 패턴은 애플리케이션을 세 가지 주요 영역으로 분리하여 구성하는 디자인 패턴입니다. 이 방식은 애플리케이션의 유지보수성과 확장성을 높이고, 각 구성 요소가 독립적으로 동작할 수 있도록 돕습니다.
📌 MVC 패턴의 주요 구성 요소
Model
- 애플리케이션의 상태와 데이터를 캡슐화합니다.
- 데이터와 비즈니스 로직을 처리하며, 상태 변경 시 View에 이를 통지합니다.
View
- Model의 데이터를 기반으로 사용자에게 시각적인 정보를 제공합니다.
- 사용자의 입력을 Controller에 전달하는 역할을 합니다.
Controller
- 사용자의 요청을 받아 처리하고, 필요한 경우 Model을 업데이트하거나 View를 선택합니다.
- 애플리케이션의 동작을 제어하는 역할을 합니다.
📌 MVC 패턴의 장점과 단점
장점
- 화면(View)과 비즈니스 로직(Model)을 분리하여 개발할 수 있습니다.
- 각 영역별로 독립적인 개발이 가능하여 확장성과 유지보수성이 뛰어납니다.
- 코드의 재사용성을 높이고, 협업 작업이 용이해집니다.
단점
- 초기 개발 과정이 복잡하며, 설계 시 더 많은 시간을 필요로 합니다.
- 초보자에게는 이해하기 어려울 수 있고, 구현 과정에서 높은 숙련도가 요구됩니다.
♻ Model2 (Web MVC) 아키텍처의 요청 흐름
Model2 아키텍처는 웹 애플리케이션에서 요청과 응답을 처리하는 흐름을 정의합니다.
클라이언트의 요청은 Controller를 거쳐 Model로 전달되며, 처리된 결과는 View를 통해 사용자에게 응답됩니다.
이 구조는 애플리케이션의 유지보수와 확장성을 높이는 데 기여합니다.
✍️ Spring MVC란?
Spring은 DI (Dependency Injection)나 AOP (Aspect-Oriented Programming)와 같은 강력한 기능 외에도, Servlet 기반의 웹 개발을 위한 MVC 프레임워크를 제공합니다. Spring MVC는 Model2 아키텍처와 Front Controller 패턴을 프레임워크 차원에서 구현하고 있습니다.
📌 Front Controller 패턴
Front Controller는 클라이언트의 모든 요청을 한 곳으로 모은 후, 적절한 Controller를 호출하여 처리한 결과를 반환하는 역할을 합니다. 이를 통해 요청 처리의 일관성을 유지하고, 흐름을 통제할 수 있습니다.
Spring MVC에서는 DispatcherServlet이 프론트 컨트롤러 역할을 수행합니다.
✍️ DispatcherServlet
DispatcherServlet은 HTTP 프로토콜을 통해 들어오는 모든 요청을 가장 먼저 받아, 적절한 컨트롤러로 요청을 위임하는 역할을 합니다. 이를 앞서 설명한, Front Controller라고 부릅니다.
클라이언트로부터 요청이 들어오면, 먼저 서블릿 컨테이너(Tomcat 등)가 이를 처리하고, 그다음에 DispatcherServlet이 요청을 받아 공통적인 작업을 처리한 후, 적합한 컨트롤러로 전달하여 실제 작업을 처리하도록 합니다.
Front Controller는 서버로 들어오는 모든 요청을 중앙에서 처리하는 컨트롤러로, 주로 서블릿 컨테이너의 앞단에서 역할을 맡습니다. 이 방식은 MVC 구조에서 자주 사용되는 디자인 패턴으로, 요청 처리의 흐름을 명확하게 관리할 수 있도록 돕습니다.
♻️ DispatcherServlet의 요청 처리 흐름
- 클라이언트의 HTTP 요청이 Dispatcher Servlet으로 전달됩니다.
- Dispatcher Servlet은 Handler Mapping을 통해 요청을 처리할 적절한 Controller를 찾습니다.
- Dispatcher Servlet은 Handler Adapter를 통해 해당 Controller를 호출할 준비를 합니다.
- Handler Adapter는 실제 RestController를 호출하여 비즈니스 로직을 처리합니다.
- RestController는 비즈니스 로직 처리를 위해 Service 계층을 호출하고, 필요한 경우 Repository를 통해 Database에 접근합니다.
- Service 계층에서 처리된 결과는 ResponseEntity 객체로 변환됩니다.
- ResponseEntity는 Handler Adapter를 통해 Dispatcher Servlet으로 전달됩니다.
- 최종적으로 Dispatcher Servlet은 응답을 클라이언트에게 반환합니다.
📌 Controller 응답 처리 방식
Controller는 두 가지 방식으로 응답을 반환할 수 있습니다.
ResponseEntity 객체와 ModelAndView 반환 방식입니다. 각각의 반환 방식은 사용되는 환경에 따라 다릅니다.
@Controller와 @RestController의 차이점
1. ResponseEntity 반환 (주로 REST API에서 사용)
@GetMapping("/api/items")
public ResponseEntity<List<Item>> getItems() {
List<Item> items = itemService.findAll();
return ResponseEntity.ok(items);
}
- RESTful API에서 주로 사용됩니다.
- HTTP 상태 코드, 헤더, 본문 등을 직접 제어할 수 있습니다.
2. ModelAndView 반환 (전통적인 웹 애플리케이션에서 사용)
@GetMapping("/items")
public ModelAndView getItems() {
List<Item> items = itemService.findAll();
ModelAndView mav = new ModelAndView("items/list");
mav.addObject("items", items);
return mav;
}
- 전통적인 웹 애플리케이션에서 주로 사용됩니다.
- Model과 View를 함께 반환하여 화면을 처리합니다.
ModelAndView 흐름
- Controller가 ModelAndView를 반환합니다.
- HandlerAdapter는 ModelAndView를 DispatcherServlet에 전달합니다.
- DispatcherServlet은 ViewResolver를 통해 실제 View를 찾습니다.
- View가 Model 데이터를 사용하여 화면을 생성합니다.
- 생성된 화면이 클라이언트에게 반환됩니다.
📌 각 구성 요소
DispatcherServlet (Front Controller)
- 클라이언트의 모든 요청을 받아 적절한 Controller에게 위임합니다.
- Controller의 처리 결과를 View에 전달하여 최종 응답을 생성합니다.
HandlerMapping
- 클라이언트의 요청 URL과 매핑된 Controller를 결정합니다.
- 적합한 Handler(Controller 메서드)를 찾아 DispatcherServlet에 반환합니다.
HandlerAdapter
- DispatcherServlet과 Controller 간의 연결을 돕습니다.
- 다양한 방식으로 구현된 Controller의 요청 처리를 일관되게 위임할 수 있도록 어댑터 패턴을 적용합니다.
Controller
- 클라이언트 요청을 처리하고 Model을 호출하여 필요한 데이터를 반환합니다.
- 처리된 결과를 View로 전달합니다.
ModelAndView
- Controller에서 처리된 데이터와 화면 정보를 포함하는 객체입니다.
ViewResolver
- Controller가 반환한 View 이름을 물리적인 파일 경로로 변환합니다.
- 적절한 화면(View)을 선택하여 클라이언트에게 응답을 전달합니다.
View
- 최종적으로 클라이언트에게 전달될 응답 화면을 생성합니다.
Spring MVC는 DispatcherServlet을 중심으로 요청 흐름을 관리하고, MVC 패턴을 적용하여 애플리케이션의 유지보수성과 확장성을 높입니다. DispatcherServlet은 모든 요청을 중앙에서 처리하여, 각 구성 요소들이 효율적으로 협력할 수 있도록 돕습니다. 이를 통해 웹 애플리케이션의 구조를 명확하게 관리하고, 개발자들이 효율적으로 작업할 수 있도록 합니다.😁
🗂️ References
Spring DispatcherServlet(디스패처서블릿) 개념부터 동작 과정까지
[Spring] Dispatcher-Servlet(디스패처 서블릿)이란? 디스패처 서블릿의 개념과 동작 과정
👀 SSAFY의 다양한 소식과 이야기를 더 알고 싶다면
📌 SSAFYcial 인스타그램
📌 SSAFY 홈페이지
'SSAFY' 카테고리의 다른 글
[싸피셜이 알려드림: 기술편] Filter와 Interceptor의 차이 (0) | 2025.01.07 |
---|---|
[싸피셜이 알려드림: SSAFY편] 게임으로 평가받는다? 배틀싸피 등장! (2) | 2024.12.22 |
[싸피셜이 알려드림: SSAFY편] SSAFY 12기 1학기 최종 관통 프로젝트 회고 (1) | 2024.12.21 |
[싸피셜이 알려드림: SSAFY편] SSAFY 1학기 후기 (1) | 2024.12.21 |
[싸피셜이 알려드림: 기술편] Servlet이 뭘까? (0) | 2024.12.21 |