2025. 2. 27. 22:12ㆍSpring Framework/Web on Servlet Stack
1. DispatcherServlet이란?
Spring MVC에서 DispatcherServlet은 웹 애플리케이션의 센트럴 컨트롤러 역할을 하는 프론트 컨트롤러(Front Controller)입니다.
📌 프론트 컨트롤러 패턴이란?
- 모든 HTTP 요청을 한 곳에서 받아들이고, 이를 적절한 처리기로 위임하는 패턴입니다.
- Spring MVC에서는
DispatcherServlet
이 이러한 역할을 수행합니다. - 요청을 받고, 어떤 컨트롤러가 이를 처리할지 결정한 후, 결과를 적절한 뷰(View)로 전달합니다.
2. DispatcherServlet의 핵심 기능
DispatcherServlet은 요청을 처리하는 전체적인 공통 알고리즘(Shared Algorithm)을 제공하며, 나머지 작업은 설정된 위임(delegate) 컴포넌트가 수행합니다. 주요 기능은 다음과 같습니다.
기능 | 설명 |
---|---|
요청(Request) 수신 | 클라이언트의 HTTP 요청을 수신 |
HandlerMapping 조회 | 요청을 처리할 컨트롤러(Handler)를 찾음 |
HandlerAdapter 실행 | 컨트롤러의 실제 메서드를 호출하여 요청을 처리 |
ViewResolver 조회 | 반환된 결과를 적절한 뷰(View)로 변환 |
응답(Response) 반환 | 최종적으로 클라이언트에게 응답을 반환 |
📌 즉, DispatcherServlet은 요청을 받고 적절한 컨트롤러에게 위임하며, 응답을 생성해 클라이언트에게 반환하는 역할을 합니다.
3. DispatcherServlet 설정 방법
DispatcherServlet을 사용하려면 서블릿 컨테이너(Servlet Container)에 등록해야 합니다.
이는 Java 설정 또는 web.xml
을 사용하여 할 수 있습니다.
✅ Java 설정을 사용한 DispatcherServlet 등록
Spring Boot와 같은 최신 환경에서는 DispatcherServlet
이 자동으로 등록되지만, 직접 설정할 수도 있습니다.
@Configuration
public class WebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(AppConfig.class);
DispatcherServlet dispatcherServlet = new DispatcherServlet(context);
ServletRegistration.Dynamic registration = servletContext.addServlet("dispatcher", dispatcherServlet);
registration.setLoadOnStartup(1);
registration.addMapping("/");
}
}
📌 설명
WebApplicationInitializer
를 구현하면 Spring이 자동으로 실행해줍니다.AnnotationConfigWebApplicationContext
를 사용하여AppConfig.class
(Spring 설정 클래스)를 등록합니다.DispatcherServlet
을 생성하고 컨텍스트를 연결한 뒤, 서블릿 컨테이너에 등록합니다.- URL 패턴
/
로 모든 요청을DispatcherServlet
이 처리하도록 설정합니다.
✅ web.xml을 사용한 설정 (구버전)
과거에는 web.xml
을 통해 DispatcherServlet을 등록했습니다.
<web-app>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-mvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
📌 설명
<servlet>
태그로 DispatcherServlet을 정의합니다.<servlet-mapping>
을 통해 URL 패턴을 지정하여 모든 요청을 받도록 설정합니다.
4. DispatcherServlet과 Spring 설정
DispatcherServlet은 Spring 구성을 이용하여 여러 위임 컴포넌트를 자동으로 찾고 사용합니다.
🔹 핵심 컴포넌트
컴포넌트 | 역할 |
HandlerMapping | 요청 URL을 어떤 컨트롤러가 처리할지 결정 |
HandlerAdapter | 컨트롤러의 특정 메서드를 실행 |
ViewResolver | 컨트롤러의 메서드에서 리턴된 데이터를 적절한 뷰로 변환 |
ExceptionResolver | 예외가 발생했을 때 처리 방식 결정 |
✅ DispatcherServlet은 위 컴포넌트들을 자동으로 감지하여 사용할 수 있습니다.
5. Reactive Stack에서의 대응 개념
Spring 5부터는 Reactive Programming을 위한 WebFlux
가 등장했습니다.
Reactive 환경에서는 DispatcherHandler
가 DispatcherServlet
과 유사한 역할을 합니다.
📌 DispatcherServlet vs. DispatcherHandler
특징 | DispatcherServlet (Spring MVC) | DispatcherHandler (Spring WebFlux) |
실행 방식 | 서블릿 기반 (Blocking, Thread-per-request) | 리액티브 스트림 기반 (Non-blocking, Event-driven) |
주된 컨트롤러 유형 | @Controller & @RestController | @RestController & @Controller (WebFlux 스타일) |
주요 설정 방식 | DispatcherServlet + Spring 구성 | DispatcherHandler + WebFlux 설정 |
즉, Spring WebFlux에서는 DispatcherServlet
대신 DispatcherHandler
가 사용되며, 요청을 비동기적으로 처리하는 방식이 다릅니다.
🚀 Summary
DispatcherServlet
은 Spring MVC의 프론트 컨트롤러로, 모든 요청을 받아 적절한 컨트롤러에 위임하고 응답을 반환합니다.- 요청을 처리하는 과정에서 HandlerMapping, ViewResolver, ExceptionResolver 등의 컴포넌트를 자동으로 찾아 사용합니다.
Java 설정
을 사용하면DispatcherServlet
을 쉽게 등록할 수 있으며, 예전에는web.xml
을 사용하기도 했습니다.- Spring WebFlux에서는
DispatcherServlet
대신 DispatcherHandler를 사용하여 리액티브 방식으로 요청을 처리합니다.
➡ Spring MVC를 사용할 경우, DispatcherServlet이 핵심적인 역할을 한다는 점을 꼭 기억하세요!
Spring Boot는 다른 초기화 순서를 따릅니다. 서블릿 컨테이너의 라이프사이클에 연결하는 대신 Spring Boot는 Spring 구성을 사용해 스스로 자기 자신과 임베디드 서블릿 컨테이너를 부트스트랩합니다. 필터와 서블릿 선언은 Spring 구성에서 감지되어 서블릿 컨테이너에 등록됩니다. 자세한 내용은 Spring Boot 문서를 참조하세요.
- Context Hierarchy
- Special Bean Types
- Web MVC Config
- Servlet Config
- Processing
- Path Matching
- Interception
- Exceptions
- View Resolution
- Locale
- Themes
- Multipart Resolver
- Logging
출처 : https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-servlet.html
'Spring Framework > Web on Servlet Stack' 카테고리의 다른 글
Special Bean Types (0) | 2025.02.27 |
---|---|
Context Hierarchy (0) | 2025.02.27 |
Spring Web MVC (0) | 2024.10.15 |
Advanced Java Config (0) | 2024.10.15 |
Path Matching (0) | 2024.10.15 |