Dispatcher Servlet이란?

이진영·2024년 1월 29일
1

CS스터디

목록 보기
3/3

개요

Dispatcher Servlet에 대해서 잘 모르고 있다고 생각이 들어서 이번 CS스터디를 통해서 명확하게 무엇인지 짚고 넘어갈려 한다.

디스패쳐 서블릿?

dispatch라는 뜻은 보내다라는 뜻을 포함하고 있고 이를 포함한 단어로서 디스패쳐 서블릿은 HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 프런트 컨트롤러 라고 정의 할 수 있다.


근데 여기서 Servlet이 붙은 것을 볼수 있는데 단어에서 짐작이 갈 거라고 생각한다.

📌 디스패쳐 서블릿도 Servlet의 일종이다.(자세한 내용)

public class DispatcherServlet extends FrameworkServlet {
}

public abstract class FrameworkServlet extends HttpServletBean {
}

public abstract class HttpServletBean extends HttpServlet {
}

위의 구조로 상속 받고 있기 때문!!

프런트 컨트롤러 패턴

앞서 정의에서 적합한 컨트롤러에게 위임 한다고 언급한 바가 있다. 디스패쳐 서블릿에서는 엣날에 개발자가 모든 서블릿을 URL 매핑을 위해 web.xml에 등록해야 했지만

디스패쳐 서블릿이 모든 요청을 핸들링하고 공통작업을 처리해준다.

그렇기에 디스패쳐 서블릿은 프런트 컨트롤러 라고도 불린다. 또한 이러한 패턴을 프론트 컨트롤러 패턴이라고도 불린다.

장점은 무엇?

📌 정적자원과 동적자원을 따로 처리할 수 있다는 점

왜 따로 처리하는가?

Dispatcher Servlet이 모든 요청을 처리하다 보니 이미지나 HTML/CSS/JavaScript등과 같은 정적 파일에 대한 요청마자 가로채는 까닭에 정적자원을 불러오지 못하는 상황

구체적으로 어떻게 요청이 되는가?

  1. 요청에 대한 컨트롤러를 찾는다
  2. 없는 경우 2차적으로 설정된 자원(Resource) 경로를 탐색하여 자원을 탐색
    ex) /resources

결과

이렇게 영역을 분리하면 효율적인 리소스 관리를 지원할 뿐 아니라 추후에 확장을 용이하게 해준다는 장점이 있습니다.


구조

디스패쳐 서블릿이 제역할을 하기 위해서는 아래와 같은 구조를 뛰고 있다. 여기서 서블릿의 구조를 설명하지 않을 예정이다.

WebApplicationContext

  • DispatcherServlet이 직접 사용하는 컨트롤러를 포함한 웹 관련 빈을 등록하는 데 사용한다.
    또 한 여기서 Controller , ViewResolver, HandlerMapping등이 이 안에 있다.

  • DispatcherServlet은 독자적인 WebApplicationContext를 가지고 있고, 모두 동일한 application context 공유한다. 즉 appication context를 확장한 구조

📌 application context : 객체의 전체 라이프사이클을 인스턴스화, 연결, 구성 및 관리하는 역할을 하는 IOC 컨테이너(service, dao 등등)

Special Bean

디스패쳐 서블릿이 자기자신의 역할을 한 뒤 적절한 응답을 받기 위해 다른 빈들에게 작업을 위임하는데 이때 사용되는 빈들이 Special Bean이다.

  • HandlerMapping : 클라이언트의 요청 URL을 기반으로 어떤 컨트롤러가 해당 요청을 처리할지를 결정하는 매핑을 담당합니다.
  • HandlerAdapter : 해당 컨트롤러의 실행을 담당하는 어댑터입니다.
  • ViewResolver : 컨트롤러가 처리를 완료한 후에 클라이언트에 보여줄 뷰의 이름을 실제 뷰 객체로 매핑하는 역할을 합니다
  • HandlerExceptionResolver : 컨트롤러나 다른 구성 요소에서 발생한 예외를 처리하고, 클라이언트에게 적절한 오류 응답을 제공하는 역할을 합니다.

Spring MVC로 보는 동작 과정


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

과정을 통해서 명확하게 Dispatcher Servlet이 하는 역할을 분명하게 확인할 수 있습니다.

Dispatcher Servlet 동작 과정


1. 클라이언트 요청을 디스패처 서블릿이 받는다.
2. 요청 정보를 보고 web application context안에서 Handler Mapping을 통해 요청을 위임할 컨트롤러를 찾는다.
3. 찾은 컨트롤러로 요청을 위임할 handler adapter를 착고
4. handler adapter가 controller로 요청을 위임한다.
5. 컨트롤러는 application context 속 service, repository를 호출해가며 비지니스 로직을 처리
6. handler adapter는 리턴값을 view resolver에게 전달
7. view resolver가 view를 검색하고 찾은 view에 응답을 전달
8. 디스패쳐 서블릿에서 view로부터 받은 응답을 클라이언트에게 반환해준다.

마치면서

공부를 하니 왜 이렇게 작동이 됐는지 더 명확하게 알고가는 계기가 됐다.

📌참고 자료
https://velog.io/@betterfuture4/Spring-Dispatcher-Servlet-%EC%A0%95%EB%A6%AC#1-%EC%84%9C%EB%B8%94%EB%A6%BFjava-servlet
https://mangkyu.tistory.com/18
https://kingofbackend.tistory.com/78
https://jaeseo.tistory.com/entry/DispatcherServlet-%EB%8F%99%EC%9E%91-%EA%B3%BC%EC%A0%95%EA%B3%BC-Special-Bean-Types

profile
내가 공부한 것들을 적는 공간

0개의 댓글

관련 채용 정보