본문 바로가기
개발/Spring

[Spring] DispatcherServlet이란 무엇인가?

by solchan98 2022. 2. 10.

DispathcerServlet

  • Dispathcher의 dispatch는 보내다는 뜻을 가지고 있다. 즉, Servlet으로 보낸다는 뜻이다.
  • servlet-container 내에서 작동된다.
  • [FrameworkServlet.java > HttpServlet.java > Servlet.java] 를 상속받아 구현한 Servlet이다. 따라서 Servlet-Container와 Servlet의 개념을 먼저 알고 있어야 한다.

Servlet

  • 정의된 클라이언트의 요청에 대해 상응하는 응답 결과인 웹 페이지나 결과값을 동적으로 생성해 주기위한 자바 프로그램이다.
  • 스레드 단위로 실행된다.
  • Servlet은 독립적으로 실행될 수 없으며, Servlet-Container에 의해 관리된다.

다음은 java8에서 제공하는 servlet의 인터페이스 코드이다.

public interface Servlet {

    public void init(ServletConfig config) throws ServletException;

    public ServletConfig getServletConfig();

    public void service(ServletRequest req, ServletResponse res)
            throws ServletException, IOException;

    public String getServletInfo();

    public void destroy();
}

Servlet을 만들기 위해서는 위 interface의 구현체를 직접 만들어 사용한다. 실제 구현되는 Servlet은 위 인터페이스를 구현한 HttpServlet을 상속받아 작성된다.

아래는 HttpServlet을 상속받아 구현하게 된 servlet의 주요 메서드이며, servlet-container에서 servlet의 life-cycle을 이해하기 위해 필요하다.

  • init()
  • destroy()
  • doGet()
  • doPost()

이후, Spring MVC에서는 Dispatcher Servlet이라는 모든 요청을 담당하는 servlet을 servlet-container에 두고 요청에 맞는 Controller를 찾아 요청을 위임한다. 이에 대한 장점은 servlet-container을 다루면서 알 수 있다.

Servlet-Container

  • Servlet-Container는 servlet의 life-cycle를 관리하고, 요청에 따른 servlet 스레드를 생성한다.
  • Servlet을 관리하는 방법은 web.xml 파일을 통한 방법과 Spring MVC의 Dispatcher-Servlet를 통해 관리되는 방법이 존재한다.
  • Servlet-Container는 Tomcat 내에서 작동한다.

web.xml

  • Servlet-Container가 요청에 알맞는 servlet에 매핑하기 위해 servlet에 대한 정보가 저장된 파일이다.
  • 즉, servlet의 정보를 web.xml에 모두 정의해야 한다.
    • 정의하지 않으면 servlet-container가 요청에 맞는 servlet을 매핑할 수 없다.
  • servlet life-cycle
    • 클라이언트의 요청을 받아 Servlet-Container는 request, response 객체를 생성(HttpServletRequest, HttpServletResponse)
      • 요청된 URI를 web.xml을 참조하여 어떤 servlet인지 확인.
      • 만약, servlet-container에서 한 번도 실행된 적이 없거나, 메모리에 생성된 servlet 인스턴스가 없는 경우 init()을 통해 인스턴스 생성.
      • 생성된 혹은 기존에 있던 servlet 인스턴스를 통해 servlet 스레드를 생성한 후, servlet의 service()메서드 호출
      • 이후 GET, POST 등 요청에 맞는 doXXX메서드 호출
      • 이후 동적인 페이지 혹은 결과값을 response객체로 응답을 보낸다.
      • 이후, request, response 객체는 소멸된다.
      • 생성된 servlet인스턴스는 바로바로 destroy()하는 것이 아닌, servlet-container가 주기적으로 제거(destroy() 호출)를 한다.

Dispatcher-Servlet

  • dispatcher-servlet 처음 설명에서 말한 것 처럼 servlet이다.
  • web.xml에 모든 servlet에 대한 정보를 정의해야 한다는 단점을 극복한다.
  • 클라이언트의 요청 처리 과정
    • dispatcher-servlet도 serlvet이다. 따라서 클라이언트 요청시, servlet-container에 dispatcher-servlet 인스턴스가 없는 경우 생성한다.
    • 이후, dispathcer-servlet은 내부에 HandlerMapping, HandlerAdapter, ViewResolver를 통해 클라이언트의 요청에 따라 개발자가 정의해둔 내용으로 응답한다.
      • HandlerMapping: 클라이언트로의 요청을 분석하여 매핑되는 Controller를 찾는다.
      • HandlerAdapter: 매핑되는 Controller에게 클라이언트 요청을 보낸다.
      • ViewResolver: Controller에서 view를 응답하면, view를 찾아 클라이언트에게 응답한다.

참고 자료
https://taes-k.github.io/2020/02/16/servlet-container-spring-container/