Dispatcher Servlet이란?
스프링의 핵심 요소 Dispatcher Servlet에 대해 알아봅니다.
개념
디스패처 서블릿(Dispatcher Servlet)은 스프링 프레임워크(Spring Framework)에서 가장 중요한 핵심 구성 요소 중 하나입니다. 스프링 MVC (Model-View-Controller) 패턴의 중심에 위치하며, 클라이언트의 요청을 적절한 컨트롤러로 전달하고, 처리된 결과를 뷰(View)로 전달하는 역할을 합니다. 간단히 말해, 디스패처 서블릿은 웹 애플리케이션에서 들어오는 모든 HTTP 요청을 받아서 해당 요청을 처리할 수 있는 컨트롤러로 전달하고, 결과를 생성하여 응답을 클라이언트에게 돌려주는 중앙 허브 역할을 합니다.
Dispatcher Servlet은 흔히 프론트 컨트롤러라고도 언급하는데 이는 디자인 패턴 중 하나이며, 하나의 진입점을 통해 모든 요청을 처리하는 방식을 의미합니다. 클라이언트의 요청을 받아서 해당 요청을 처리할 컨트롤러나 핸들러로 전달하며, 이를 통해 공통적인 처리 로직(예: 인증, 로깅 등)을 중앙 집중화할 수 있는 특징을 가지고 있습니다. DispatcherServlet은 이러한 프론트 컨트롤러 디자인 패턴으로 구현된 대표적인 예입니다.
특징
디스패처 서블릿의 주요 특징은 다음과 같습니다.
-
중앙 관리
모든 요청을 하나의 서블릿이 처리함으로써 애플리케이션의 요청 흐름을 중앙에서 관리할 수 있습니다. -
플러그 가능
다양한 뷰 기술(JSP, Thymeleaf, FreeMarker 등)을 지원하며, 필요에 따라 쉽게 변경할 수 있습니다. -
유연성
다양한 핸들러 매핑, 인터셉터, 뷰 리졸버 등을 통해 유연하게 확장할 수 있습니다. -
통합성
스프링의 다른 모듈(예: 스프링 보안, 스프링 데이터 등)과의 긴밀한 통합을 지원합니다.
동작 과정
디스패처 서블릿의 동작 과정을 단계별로 설명하면 다음과 같습니다.
-
HTTP 요청
사용자가 웹 브라우저에서 URL을 입력하거나 링크를 클릭하여 웹 서버로 HTTP 요청을 보냅니다. -
요청 전달
웹 서버는 클라이언트로부터 HTTP 요청을 수신하고, 해당 요청을 처리하도록 서블릿 컨테이너로 전달합니다. -
디스패처 서블릿으로 요청 전달
서블릿 컨테이너는 웹 서버로부터 전달된 요청을 받아 스프링 애플리케이션의 디스패처 서블릿으로 전달합니다. -
핸들러 매핑을 통해 컨트롤러 찾기
디스패처 서블릿이 요청 URL과 매핑된 핸들러(컨트롤러)를 찾기 위해 핸들러 매핑(Handler Mapping)을 사용합니다. -
핸들러 어댑터를 통해 컨트롤러 호출
디스패처 서블릿이 찾은 컨트롤러를 호출하기 위해 적절한 핸들러 어댑터(Handler Adapter)를 사용하여 컨트롤러를 호출합니다. -
컨트롤러가 요청 처리 및 모델 생성
컨트롤러는 요청을 처리하고, 필요한 데이터를 모델(Model) 객체에 담아 반환합니다. 또한, 반환할 뷰의 논리적 이름도 함께 반환합니다. -
뷰 리졸버를 통해 뷰 결정
디스패처 서블릿이 뷰 리졸버(View Resolver)를 사용하여 컨트롤러가 반환한 논리적 뷰 이름을 실제 뷰(View)로 변환합니다. -
뷰 렌더링
뷰는 모델 데이터를 사용하여 최종 응답 페이지를 렌더링합니다. -
응답 생성
디스패처 서블릿이 렌더링된 뷰를 HTTP 응답으로 생성합니다. -
HTTP 응답 웹 서버로 보내기
블릿 컨테이너는 생성된 HTTP 응답을 웹 서버로 보냅니다. -
HTTP 응답
웹서버가 서블릿 컨테이너로부터 받은 HTTP 응답을 클라이언트로 전달하며, 최종적으로 사용자에게 응답 페이지가 표시됩니다.
아래 이미지는 위 내용을 도식화한 것입니다.
서블릿과의 차이
스프링 등장 전 사용되었던 서블릿이 스프링의 디스패처 서블릿과 어떤 차이점을 가지고 있는지 이해하는 것 또한 살펴볼 필요가 있습니다.
내용은 다음과 같습니다.
-
역할
일반 서블릿
주로 클라이언트의 요청을 처리하고 응답을 생성하는 데 사용됩니다. 서블릿은 주로 HTTP 프로토콜을 직접 다루고, 로우 레벨의 요청 및 응답 처리를 담당합니다.디스패처 서블릿
스프링 MVC의 중앙 컨트롤러 역할을 하며, 클라이언트의 요청을 적절한 컨트롤러에 분배하고, 처리 결과를 뷰로 전달하는 고수준의 역할을 합니다. -
구조
일반 서블릿
단일 책임을 갖고 직접 요청을 처리합니다.디스패처 서블릿
여러 핸들러 매핑, 컨트롤러, 뷰 리졸버 등을 사용하여 요청을 분산 처리합니다. -
확장성
일반 서블릿
확장성이 제한적이며, 새로운 기능을 추가하려면 서블릿 코드를 직접 수정해야 합니다.디스패처 서블릿
스프링의 다양한 컴포넌트와 쉽게 통합할 수 있어 확장성이 뛰어납니다.