DispatcherServlet 개념

LSM ·2022년 1월 10일
0

1. DispatcherServlet를 공부하는 이유

해당 클래스는 Servlet의 중심이자, Spring MVC의 중심이다.
이것을 이해하는 것이 곧 Spring MVC를 이해하는 것과 같다고 할 수 있을 정도로 중요한 요소라고한다.


2. DispatcherServlet의 탄생배경

Dispatcher Servlet에서 Dispatch의 의미는 급파하다, 파견 등의 의미로,
해석해보면 받은 요청을 어딘가로 빨리빨리 보내는 서블릿이다.
프론트 컨트롤러라고 불리기도 하는 DispatcherServlet은 과연 요청을 어디로 보낸다는 것인가.

이에 대한 동작 원리나 특징 등을 살펴보기전에, 왜 DispatcherServlet이 그렇게 대단한 건지 먼저 살펴보려 한다. 그러기 위해 일단 Spring이 없는 환경으로 돌아가야한다.

1) web.xml의 복잡성

Spring이 없는 JAVA 런타임에서는 컨트롤러가 존재하지 않는다.
따라서 우리는 서블릿 객체를 생성하고, 그것을 web.xml에다 일일히 다 등록해줘야 했다.

<servlet>
    <servlet-name>서블릿1</servlet-name>
    ...
</servlet>
<servlet-mapping>
    <servlet-name>서블릿1</servlet-name>
    ...
</servlet-mapping>
<servlet>
    <servlet-name>서블릿2</servlet-name>
    ...
</servlet>
<servlet-mapping>
    <servlet-name>서블릿2</servlet-name>
    ...
</servlet-mapping>

하나의 서블릿은 하나의 경로만 담당한다. 즉 경로의 개수만큼 서블릿 객체의 수가 필요하여, 매우 복잡한 web.xml이 형성된다.

2) 높은 의존성

Servlet 객체는 HttpServlet를 상속한 객체이다.
이렇게 되면 HttpServlet 기능을 필수로 Override 해야 하고, 더이상 일반 객체로 사용할 수 없다.
즉, 클래스끼리 값을 주고받기가 까다로워진다는 것이다.

3) 작업 처리

모든 서블릿이 공통으로 처리하는 작업이나, 가장 우선시 되야하는 작업이 분명 있을 것이다. 이런 것을 서블릿 객체로 처리하기란 불가능하고, 매우 까다로울 것이다.

4) Request 처리의 복잡성

웹페이지에 대한 경로가 바뀔 때, 초기 Request가 손실되지 않고 넘겨줄 수 있게 하기 위해서는 FrontController, RequestDispatcher 와 같은 처리를 수동으로 해주어야 한다.


3. DispatcherServlet 의 등장

DispatcherServlet은 위의 단점들을 모두 해소해 줄 수 있고, 사용성 또한 더욱 간편하다고 한다.

Controller의 등장으로 인해 서블릿은 더이상 HttpServlet을 확장하지 않고, POJO를 사용한다. => @Controller 어노테이션을 붙여서 간편히 사용할 수 있으며, 의존성이 낮아져서 다른 객체들과 연계가 자유롭다.

/* Servlet 객체 */
@WebServlet("/user")
public class testServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // GET 작업 처리
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // POST 작업 처리
    }
    
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 서블릿 동작 처리
    }
}

또, DispatcherServlet이 FrontController 의 역할을 수행하면서, web.xml에 복잡하게 서블릿을 등록할 필요가 없어졌다.

DispatcherServlet이 모든 요청을 받고 세부 경로는 각 Controller에게 뿌려주는 프론트 컨트롤러의 역할을 함


4. 참고자료

https://velog.io/@seculoper235/2.-DispatcherServlet-이란

profile
개발 및 취준 일지

0개의 댓글