본문 바로가기
JAVA/Spring

DispatcherServlet의 역할과 설정 방법

by GangDev 2024. 3. 22.

DispatcherServlet은 FrontController 패턴의 전형적인 사례이자, 웹 애플리케이션 내의 모든 요청을 중앙에서 처리하는 핵심 구성 요소이다.
Spring MVC의 핵심이기도 하다.
클라이언트(사용자)로부터 받은 요청을 적합한 컨트롤러에 전달하는 역할을 한다.

*FrontController 패턴이란? 웹 애플리케이션의 아키텍처에서 핵심 역할을 하는 디자인 패턴.
모든 클라이언트 요청을 단일 지점을 통해 처리하여 시스템의 전체적인 제어 흐름을 중앙화한다.
이러한 과정을 통해 요청 처리 과정의 일관성을 유지하고, 유지보수를 용이하게 만든다.


DispatcherServlet 기능 및 특징

DispatcherServlet은 들어오는 요청의 URL을 분석하고, 해당 요청을 처리할 적절한 핸들러(컨트롤러)를 찾는다. 주로 @RequestMapping 어노테이션이 달린 메서드와 매핑된다.
요청에 맞는 핸들러가 결정되면, DispatcherServlet은 해당 핸들러의 메서드를 실행하여 요청을 처리한다.

컨트롤러가 로직을 처리하고, 결과 데이터를 Model 객체에 담아 반환한다.
컨트롤러가 반환한 View 이름을 기반으로, 적절한 뷰 템플릿(JSP, Thymeleaf)과 결합하여 최종적인 응답을 생성한다.

DispatcherServlet은 @ExceptionHandler를 사용한 메서드를 통해 컨트롤러나 서비스 계층에서 발생하는 예외를 적절하게 처리한다.(사용자에게 오류 페이지 보여줄 수 있음)

요청의 전처리와 후처리를 위해 추가 작업을 할 수 있도록 인터셉터(Interceptor)를 지원한다.(인터셉터는 로깅, 인증, 권한 검사, 트랜잭션 관리 등의 공통 기능 구현에 유용)

다국어 지원을 위한 기능을 제공한다. (사용자의 지역 정보에 따라 다른 언어의 콘텐츠를 제공)


DispatcherServlet 설정하는 법

Spring MVC에서 web.xml 에 DispatcherServlet을 설정한다.

<web-app>
    <!-- DispatcherServlet 선언 -->
    <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/dispatcher-servlet.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>

contextConfigLocation: dispatcherServlet에 대한 설정 파일의 위치를 지정한다.(여기에선 /WEB-INF/spring/dispatcher-servlet.xml)

load-on-startup: 서블릿의 로드 순서를 지정한다. '1'로 설정하면 웹 애플리케이션이 시작될 때 자동으로 로드된다.

dispatcher-servlet.xml: Spring MVC 애플리케이션을 위한 빈(Bean) 설정이 포함되어 있다.(뷰 리졸버, 인터셉터, 컨트롤러 등의 정의)

servlet-mapping: 선언된 서블릿에 URL 패턴을 매핑하는 데 사용된다.

<url-pattern>: 서블릿이 처리할 URL 패턴을 지정한다. 여기서는 '/'로 설정되어 있어서, 모든 HTTP요청이 'DispatcherServlet'으로 전달된다.


dispatcher-servlet.xml

DispatcherServlet의 설정을 정의하는 XML 파일. DispatcherServlet이 처리할 요청과 관련된 빈들(컨트롤러, 뷰 리졸버, 핸들러 매핑, 인터셉터 등)을 설정한다.

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">
    
    <!-- 여기에 빈 설정이 들어갑니다 -->
    <!-- mvc:annotation-driven 태그를 사용하여 Spring MVC에서 어노테이션 기반의 컨트롤러를 사용할 수 있도록 설정한다. -->
    <mvc:annotation-driven />

    <!-- context:component-scan 태그를 사용하여 컨트롤러, 서비스, 레포지토리 등의 컴포넌트를 자동으로 스캔하고 빈으로 등록한다. -->
    <context:component-scan base-package="com.example.myapp.controller" />

    <!-- 뷰 리졸버를 정의하여, 컨트롤러가 반환하는 뷰 이름을 실제 뷰 리소스로 매핑한다. -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
    </bean>

    <!-- 정적 리소스(이미지, CSS, JavaScript 파일 등)에 대한 처리를 설정한다.  -->
    <mvc:resources mapping="/resources/**" location="/resources/" />
    


</beans>

dispatcher-servlet.xml 파일은 웹 어플리케이션의 웹 관련 부분을 설정한다. 일반적인 서비스나 데이터 관련 빈 같은 애플리케이션의 다른 부분은 별도의 Spring 설정 파일에서 정의한다.