Dispatcher Servlet은 뭘까? (Servlet이 뭔지부터 알아야겠지?)

Sihwan Kim·2024년 4월 28일
0

Spring

목록 보기
5/6

Dispatcher Servlet이란

HTTP프로토콜로 들어오는 모든 요청을 제일 먼저 받아서 적당한 컨트롤러에 매핑시켜주는 프론트 컨트롤러이다.
Dispatcher ServletHttpServlet(Servlet 클래스) 를 상속 받는 Servlet의 일종이기 때문에 Dispatcher Servlet를 이해하기 위해서는 Servlet을 먼저 이해해야한다.


서블릿(Servlet)이란

웹 애플리케이션에서 HTTP 프로토콜을 이용해 요청처리하고 응답을 하는 자바 클래스
스프링 부트 먼저 공부한 사람이라면 Controller 라는 명칭이 익숙할텐데 Servlet을 더 간단하게 작성하도록 도와준게 Controller라고 생각하면 된다.


서블릿(Servlet)의 주요 특징

  • 클라이언트의 Request에 대해 동적으로 작동하는 웹 어플리케이션 컴포넌트
  • 기존의 정적 웹 프로그램의 문제점을 보완하여 동적인 여러 가지 기능을 제공
  • JAVA의 스레드를 이용하여 동작
  • MVC패턴에서 컨트롤러로 이용됨
  • 컨테이너에서 실행
  • 보안 기능을 적용하기 쉬움

서블릿(Servlet)의 구조

HttpServlet의 service() 코드

    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();
        if (method.equals("GET")) {
        
        	// 내용이 더있지만 생략
           this.doGet(req, resp);
        } else if (method.equals("HEAD")) {
            this.doHead(req, resp);
        } else if (method.equals("POST")) {
            this.doPost(req, resp);
        } else if (method.equals("PUT")) {
            this.doPut(req, resp);
        } else if (method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if (method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if (method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[]{method};
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(501, errMsg);
        }

    }

요청이 오면 service()함수가 method에 따라서 동작할 함수를 실행한다.


Servlet Container

Servlet ContainerServlet을 관라하는 역할을 한다.

Servlet Container 동작 순서

  1. 사용자가 요청을 하면 요청한 URL을 확인한다.
  2. Url에 맞는 인스턴스가 인스턴스화된 목록에 있으면 그 인스턴스를 반환한다.
  3. Url에 맞는 인스턴스가 인스턴스화된 목록에 없으면 init()함수와 함께 생성하여 저장한다.
    여기에서 init()은 위에서 나온 Servletinit()함수이다.


Dispatcher Servlet

앞서 Servlet Container 의 동작순서 첫번째인 요청한 URL을 확인하는 과정Dispatcher Servlet이 한다고 생각하면 된다.


포스팅 맨 위에서도 설명했듯이 Dispatcher Servlet은 HTTP프로토콜로 들어오는 모든 요청을 제일 먼저 받아서 적당한 컨트롤러에 매핑시켜주는 프론트 컨트롤러이다.
받은 요청의 URL에 대한 컨트롤러를 검색하고, 있다면 그 컨트롤러를 실행시킨다.

세부 코드

void initStrategies(ApplicationContext context)
void doService(HttpServletRequest request, HttpServletResponse response) // doDispatch() 호출
void doDispatch(HttpServletRequest request, HttpServletResponse response) // 실제 요청 처리
void processDispatchResult(HttpServletRequest request, HttpServletResponse response,HandlerExecutionChain) //render() 호출
void render(ModelAndView mv, HttpServletRequest, HttpServletResponse response) // 응답결과 생성 및 전송

Servlet의 한종류로 상속을 받기 때문에 doService()가 실행되는 것을 볼 수 있다.

이걸 Servlet Container 동작과 연결시키면 다음과 같다.

전체 동작과정을 "/hello"에 대한 요청으로 요약하면

  1. DispatcherServlet이 맨 처음 요청을 받는다.
  2. HandlerMapping"/hello"에 대한 컨테이너가 있는지 검색한다.
  3. "/hello"로 등록된 컨트롤러가 있으면 다음동작을, 없다면 404와 같은 에러를 리턴한다.
  4. "/hello"에 대한 컨트롤러에 대한 실행을 HandlerAdapter에 위임한다.
  5. HandlerAdapterServletContainer에서 생성된 Servlet인스턴스가 이미 있다면 그 Servlet을 가져오고, 없다면 새로 생성해서 저장하고 가져온다.
  6. HandlerAdapter는 이렇게 가져온 Servlet의 동작을 수행시키고 그 결과값을 DispatcherServlet에게 전달한다.
  7. DispatcherServletHandlerAdapter가 보낸 결과값을 Client에게 보낸다.

참고
7번과정에서 Controller의 결과가 @ResponseBody나 @RestController와 같은 값을 전달한다면 그대로 Client에게 보내지만,

Thymleaf, JSP처럼 View를 반환한다면, ViewResolver 한번 더 거쳐 View가 있는지 체크하고 있다면 그 View를 반환하게 된다.

참고

https://velog.io/@ejung803/Spring-Web-MVC%EC%9D%98-Dispatcher-Servlet%EC%9D%98-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC
https://velog.io/@hsw0194/Spring-MVC-HandlerMapping%EC%9D%98-%EB%8F%99%EC%9E%91%EB%B0%A9%EC%8B%9D-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-1%ED%8E%B8
https://mangkyu.tistory.com/18
https://velog.io/@han_been/%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88Servlet-Container-%EB%9E%80

0개의 댓글