[웹 스터디] DispatcherServlet

박준수·2022년 11월 21일
0

[웹 스터디]

목록 보기
6/19

자바 웹 애플리케이션은 대부분 자바 서블릿을 기반으로 한다.
서블릿 기반의 서버를 사용하기 위해 개발자는 Javax.servlet.http.HttpServlet을 상속받는 서브 클래스를 작성해야 한다. 그러면 서블릿 컨테이너가 서블릿 서브 클래스를 실행시킨다.

DispatcherServlet이 없다면...

  1. 일단 HttpServlet을 상속하는 서브 클래스를 만들고 doGet() 메서드를 구현해야 한다.
  2. 매개변수로 넘어오는 HttpServletRequest에서 원하는 정보를 추출한다.
  3. 비지니스 로직인 process()를 실행하고, 반환할 정보를 HttpServletResponse에 담는다.

우리가 정말 시간을 투자하고 싶은 로직은 process() 메서드 하나더라도 매개변수 해석과 응답을 부분을 항상 작성해야한다. 또 API를 하나 만들 때마다 이 작업을 반복해야 한다.

DispatcherServlet 등장!!

스프링 부트는 어노테이션과 서브 클래스를 적절히 이용해 개발자들이 반복 잡업과 코드를 최소화할수 있도록 도와준다.

스프링 부트에서의 서블릿 서브 클래스 ==> DispatcherServlet!!!!
따라서 개발자가 서블릿 클래스를 작성하지 않아도 된다. 개발자는 스프링 부트가 제공하는 어노테이션과 인터페이스를 이용해 스프링이 우리의 비지니스 로직을 이해할 수 있도록 내부 기능을 구현하면 된다.

스프링 사용의 장점

  • HttpServlet을 상속받지 않아도 됨
  • doGet()을 오버라이드 하지 않아도 됨
  • HttpServletRequest를 직접 파싱하지 않아도 됨
  • HttpServletResponse를 작성하지 않아도 됨

DispatcherServlet의 역할

HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨틀롤러(Front Controller)라고 정의 할 수 있다.
클라이언트로부터 어떠한 요청이 오면 Tomcat과 같은 서블릿 컨테이너가 요청을 받게 되는데 이때 디스패처 스블릿이 가장 먼저 받게 된다.
디스패처 서블릿은 공통적인 작업을 먼저 처리한 후에 해당 요청을 처리해야하는 컨트롤러를 찾아서 작업을 위입한다.

여기서 잠깐!

Front Controller란..

주로 서블릿 컨테이너의 제일 앞에서 서버로 들어오는 클라이언트의 모든 요청을 받아서 처리해주는 컨트롤러로써 MVC 구조에서 함께 사용되는 디자인 패턴이다.

DispatcherServlet의 장점

  • web.xml의 역할을 상당히 축소!
  • 과거에는 모든 서블릿을 URL 매핑을 위해 web.xml에 모두 등록해주어야 했지만, dispatcherservlet이 해당 어플리케이션으로 들어오는 모든 요청을 핸들링 해주고 공통 작업을 처리 => 상당히 편리하다!
  • 개발자는 컨트롤러를 구현해두기만 하면 디스패처서블릿이 알아서 적합한 컨트롤러로 위임을 해주는 구조가 되었다!

DispatcherServlet의 정적 자원 처리

문제 상황

Dispatcher Servlet이 모든 요청을 처리하다보니 이미지나 HTML/CSS/JavaScript 등과 같은 정적 파일에 대한 요청마저 모두 가로채는 까닭에 정적자원(Static Resources)을 불러오지 못하는 상황도 발생하곤 했습니다.

해결 방법

  1. 정적 자원에 대한 요청과 애플리케이션에 대한 요청을 분리
  • 클라이언트의 요청을 2가지로 분리하여 구분하는 것!
    • /apps 의 URL로 접근하면 Dispatcher Servlet이 담당한다.
    • /resources 의 URL로 접근하면 Dispatcher Servlet이 컨트롤할 수 없으므로 담당하지 않는다.
      이 방식은 괜찮지만 상당히 코드가 지저분해지며, 모든 요청에 대해서 저런 URL을 붙여주어야 하므로 직관적인 설계가 될 수 없다!
  1. 애플리케이션에 대한 요청을 탐색하고 없으면 정적 자원에 대한 요청으로 처리
    Dispatcher Servlre이 요청을 처리할 컨트롤러를 먼저 찾고, 요청에 대한 컨트롤러를 찾을 수 없는 경우에, 2차적으로 설정된 자원(Resource) 경로를 탐색하여 자원을 탐색한다!

DispatcherServlet의 동작 방식

  1. 클라이언트의 요청을 디스패처 서블릿이 받음
  2. 요청 정보를 통해 요청을 위임할 컨트롤러를 찾음
  3. 요청을 컨트롤러로 위임할 핸들러 어댑터를 찾아서 전달함
  4. 핸들러 어댑터가 컨트롤러로 요청을 위임함.
  5. 비지니스 로직을 처리함
  6. 컨트롤러가 반환값을 반환함
  7. HandlerAdapter가 반환값을 처리함
  8. 서버의 응답을 클라이언트로 반환함

HandlerMapping : 클라이언트의 요청 URL을 어떤 Controller가 처리할지를 결정한다.
HandlerAdapter : Controller를 처리할 수 있는 Adapter를 찾아서 반환해준다.
Controller : 클라이언트의 요청을 처리한 뒤, 그 결과를 DispatcherServler에 알려준다.

Reference : DispatcherServlet

profile
방구석개발자

0개의 댓글