Dispatcher Servlet 약식 정리

KKTRKKT·2022년 4월 22일
1

백엔드 공부

목록 보기
1/1

개요

Dispatcher Servlet에 대해 공부한 내용을 정리한 글입니다. 약식으로 글을 쓰기 때문에 부족하거나 틀린 부분이 있을 수 있습니다. 부족한 부분이나 틀린 부분에 대해서는 댓글 남겨주시면 감사하겠습니다!

목차

  • Web Server

  • Servlet

  • Servlet Container

  • Dispatcher Servlet

Web Server

Web Server란 HTTP를 통해 웹 브라우저에서 요청하는 HTML이나 파일들(css, images, js 등)을 전송해주는 서비스 프로그램을 의미한다.

웹서버의 동작은 간단하다. 클라이언트는 웹서버에게 파일을 요청하고, 웹서버는 파일을 찾아보고 있으면 파일을 준다. 간단하기 때문에 웹서버는 복잡한 내용이 없고 응답도 빠르다. 하지만 간단하기 때문에 복잡한 일처리를 하지 못한다. 가령 클라이언트마다 응답을 다르게 준다던지, 데이터를 CUD 한다던지, 페이징하는 등 동적으로 요청을 처리하지 못한다.

그래서 동적으로 요청을 처리하기 위해서 웹 서버에 프로그램을 붙여서 비즈니스 로직을 수행하기 시작했는데, 이런 웹서버와 프로그램이 합쳐진 형태를 WAS(Web Application Server)라고 하고, Servlet은 웹서버에 붙는 프로그램 중 하나다.

Servlet

Servlet은 Server + Applet의 합성어로, 서비스 프로그램을 뜻하는 서버와 작은 애플리케이션을 뜻하는 애플릿이 합쳐져 작은 애플리케이션 서버라는 의미다.

Servlet이 하는 일은 HTTP를 통해 요청이 오면, 해당 요청을 파싱해주고, HTTP Request Method에 따라 처리를 다르게 해준다.

위 그림에서처럼 요청이 오면 service()가 실행이 되고, service() 내에서 HTTP Method를 확인해 doGet(), doPost(), doPatch() 등을 호출한다.

결론적으로 개발자는 요청을 파싱하는 과정을 생략하고, HTTP Request Method에 따른 처리 함수들만 구현할 수 있게 된다.

Servlet Container

Servlet Container는 Servlet의 생명주기를 관리하고, URL에 따른 특정 Servlet을 매핑해준다

Web Container 또는 Servlet Container는 웹서버로부터 요청을 받고 그 요청에 적합한 Servlet을 찾아서 매핑시켜준다. (적합한 Servlet은 web.xml에서 찾는다 )

Servlet Container는 Servlet의 생명주기도 관리해주는데, 위에 그림을 순서대로 보면 아래와 같다.

  1. 웹서버에서 웹 컨테이너로 요청을 위임
  2. 웹 컨테이너는 요청에 맞는 서블릿을 찾고, 서블릿이 생성된 상태인지 확인한다. 서블릿이 메모리에 없으면 init()를 실행시켜 생성한다.
  3. 스레드를 생성해 service()를 개별적으로 실행시킨다.

만약 웹컨테이너에 여러 요청이 온다면 요청마다 스레드를 생성하고 service()를 실행시킨다.
그런데 이럴 경우 만약 요청이 100만건이 오면 스레드를 100만개 생성해야하므로 성능이 대폭 떨어질 수 있다. 따라서 멀티스레드에 대해 주의가 필요하고, Servlet을 web.xml에 새로운 요청마다 추가를 해줘야 하며, service()에 공통 로직이 있을 경우 분리가 힘들다는 단점이 있다.

Dispatcher Servlet

Dispatcher Servlet은 Front Controller 패턴을 사용한 하나의 Servlet으로 웹 컨테이너의 단점을 보완해준다.

Dispatcher의 뜻은 급파자라는 의미를 가지고 있다. 단어 의미 그대로 가장 먼저 요청을 먼저 받고, 적절하게 처리할 함수, 즉 컨트롤러를 찾아서 정해주는 역할을 한다. 이렇게 되면 요청마다 스레드가 생성되지 않고, 공통 로직은 dispatcher servlet에서 처리를 하므로 웹컨테이너를 사용했을 때보다 비즈니스 로직에 신경쓸 수 있다.

Dispatcher Servlet 처리 순서는 아래와 같다

  1. Dispatcher Servlet은 웹서버로부터 요청을 위임 받는다
  2. Handler Mapping에게 요청을 위임하고, Handler Mapping은 적절한 컨트롤러를 찾아서 반환한다.
  3. Dispatcher Servlet은 반환 받은 컨트롤러를 적절한 Handler Adpater에게 위임한다.
  4. Handler Adapter는 Controller를 실행한다.
  5. Controller는 비즈니스 로직을 수행한다
  6. Controller는 수행 결과를 Handler Adapter에 반환한다.
  7. Handler Adapter는 ModelAndView 객체에 결과를 담아서 반환한다.
  8. Dispatcher Servlet은 ViewResolver에게 ModelAndView를 위임하고 View를 반환받는다(이 그림에는 없는 단계입니다)
  9. Dispatcher Servlet이 view를 web server에게 반환한다.

결론

dispatcher servlet을 사용하면 구현해야할 비즈니스 로직에 집중할 수 있어 좋다

profile
https://kktrkkt.github.io/

0개의 댓글