DispatcherServlet이란?
DispatcherServlet은 Spring MVC에서 프론트 컨트롤러 역할을 하는 핵심 서블릿이다. 프론트 컨트롤러란, 모든 웹 요청을 가장 먼저 받아서 적절한 컨트롤러에게 요청을 위임하는 역할을 하는 객체이다. 예를 들면 공항의 관제탑처럼, 들어오는 모든 비행기(요청)를 받아서 적절한 게이트(컨트롤러)로 안내하는 역할을 하는 것과 같다.
왜 Spring은 DispatcherServlet을 만들었나?
Spring이 DispatcherServlet을 만든 이유는 모든 웹 요청을 중앙에서 처리하는 단일 진입점을 제공하여, 개발자가 복잡한 서블릿 코드 대신 비즈니스 로직에만 집중할 수 있게 하기 위해서이다.
DispatcherServlet의 동작 방식
DispatcherServlet이 요청을 처리하는 과정은 여러 단계로 나뉘어진다.

- 클라이언트 요청 & DispatcherServlet 수신: 클라이언트(웹 브라우저)가 웹 서버에 HTTP 요청을 보내면, 웹 서버는 모든 요청을 DispatcherServlet에게 전달한다. DispatcherServlet은 이 요청을 가장 먼저 받는다.
- 핸들러 매핑: DispatcherServlet은 요청을 처리할 적절한 컨트롤러를 찾기 위해 HandlerMapping에게 요청을 보낸다. HandlerMapping은 요청 URL에 매핑되는 적합한 컨트롤러를 찾아준다. 예를 들어, /hello라는 URL 요청이 들어오면 HelloController를 찾아서 반환해 준다.
- 핸들러 어댑터 호출: DispatcherServlet은 찾아낸 컨트롤러를 직접 실행하는 대신 HandlerAdapter에게 위임한다. HandlerAdapter는 다양한 종류의 컨트롤러(예: @Controller, @RestController 등)를 공통된 방식으로 실행할 수 있도록 변환해 주는 역할을 한다.
- 추가 설명: Spring은 애플리케이션 시작 시 클래스에 붙어 있는 @Controller와 @RestController 애노테이션을 스캔하고, 이들을 HandlerMapping에 등록한다.
- Controller 실행: HandlerAdapter에 의해 호출된 컨트롤러는 요청을 처리하는 비즈니스 로직을 수행(컨트롤러 메서드 실행)하고, 처리 결과를 담은 ModelAndView 객체를 반환한다. (이 과정에서 모델(Model) 데이터를 생성하고, 어떤 뷰(View)를 보여줄지 결정)
- 뷰 이름 반환: 컨트롤러의 실행이 끝나면, ModelAndView 객체가 다시 DispatcherServlet으로 돌아온다. 이 객체에는 뷰의 논리적인 이름(예: "home")이 담겨 있다.
- 뷰 리졸버 호출: DispatcherServlet은 컨트롤러가 반환한 ModelAndView 객체에서 뷰의 논리적인 이름을 얻는다. 그리고 이 이름을 ViewResolver에게 전달하여, 실제 뷰 파일의 경로(예: /WEB-INF/views/home.jsp)를 찾도록 한다.
- 뷰 렌더링: ViewResolver가 반환한 변환된 뷰 경로를 통해 실제 뷰(JSP, Thymeleaf 등)를 찾아서 렌더링한다. 이 과정에서 모델에 담겨 있던 데이터가 뷰에 적용되어 HTML 형태로 만들어진다.
- 클라이언트에 응답 반환: 렌더링이 완료된 최종 HTML 응답이 클라이언트에게 다시 전달된다.
요약
DispatcherServlet은 Spring MVC의 중심에서 모든 요청을 받고, 필요한 컴포넌트(HandlerMapping, HandlerAdapter, ViewResolver 등)들을 호출하여 요청을 처리하고 응답을 반환하는 핵심적인 역할을 수행한다.
추가 정리
정적 페이지와 동적 페이지 차이
- 정적: 미리 만들어진 HTML 파일 그대로 제공
- 동적: 요청 시점에 데이터를 처리해서 HTML 생성
동작방식 비교
- 정적: localhost:8080/hello.html → 바로 파일 반환
- 동적: localhost:8080/mypage → DB 조회 → 개인화된 페이지 생성
웹서버 vs WAS 역할 분담
- 웹서버(Apache, Nginx): 정적 컨텐츠 처리 + 동적 요청은 WAS로 전달
- WAS(Tomcat): 동적 처리 담당
반응형
'TIL' 카테고리의 다른 글
| [TIL] jakarta vs springframework Transactional (0) | 2025.10.02 |
|---|---|
| [TIL] Layered Architecture (0) | 2025.10.01 |
| [TIL] Java에서의 병렬 처리 (1) | 2025.09.26 |
| [TIL] 스케줄링 (@Scheduled & Quartz) (0) | 2025.09.24 |
| [TIL] ResponseEntity (0) | 2025.09.22 |