[Spring] Dispatcher Servlet (디스패쳐 서블릿)

Seongho·2023년 10월 27일
0

Spring

목록 보기
13/13

intro...

자바 서블릿에 대한 글에 이어서 스프링 디스패쳐 서블릿에 대해 한번 알아보겠다.

디스패쳐 서블릿? (쉽게)


위와 같이 서블릿의 공통로직을 묶어서 프론트 컨트롤러 역할을 하는 것이 스프링 디스패쳐 서블릿이다.
카페 예에서, 주문을 받고, 계산을 하는 직원(디스패쳐 서블릿)이 아메리카노, 라떼, 스무디 직원(핸들러)에게 주문을 분배하고 제조가 끝난 커피를 받아서 손님(클라이언트)에게 주는 동작을 생각하면 된다.
디스패쳐 서블릿이 모든 요청을 핸들링 해주고 공통 로직을 처리해 줌으로써 기존에 요청마다 서블릿을 지정해주어야 하는 불편하고 비효율적인 과정에서 벗어날 수 있게 되었다.

디스패쳐 서블릿의 동작


Dispatcher Servlet은 서블릿 컨테이너에서 생성되고 관리되며 서블릿 필터를 거친 요청을 처리한다.

0. 클라이언트의 요청이 웹 서버와 서블릿 필터 체인을 거쳐 디스패쳐 서블릿에 전송된다.
1. 디스패쳐 서블릿은 요청을 받는다.
2. 디스패쳐 서블릿은 핸들러 매핑을 통해 요청 url에 맞는 컨트롤러를 찾는다.

0 = RequestMappingHandleMapping : 애너테이션 기반의 컨트롤러인 @RequestMapping에서 사용
1 = BeanNameUrlHandlerMapping   : 스프링 빈의 이름으로 핸들러 찾음

++ 0순위로 @RequestMapping 기반의 컨트롤러를 찾고, 1순위로 빈 이름으로 핸들러를 찾는다.

3. 핸들러 매핑을 통해 찾은 핸들러(컨트롤러)에 맞는 핸들러 어댑터를 선택한다.

0 = RequestMappingHandleAdapter    : @RequestMapping 기반 처리
1 = HttpRequestHandlerAdapter      : HttpRequestHandler interface 처리
2 = SimpleControllerHandlerAdapter : SimpleController interface 처리

++ 0순위로 @RequestMapping가 붙은 컨트롤러를 호출하는 핸들러,
++1순위로 HttpRequestHandler 인터페이스의 구현체를 호출하는 핸들러,

실제로 SimpleControllerHandlerAdapter.class에 핸들러가 HttpRequestHandler의 인스턴스인지 확인하는 코드가 있음.

++2순위로 SimpleController 인터페이스의 구현체를 호출하는 핸들러가 존재한다.

4. 핸들러(컨트롤러)를 호출하여 실행한다.
5. 핸들러(컨트롤러)에서 서비스 로직을 실행한다.
6. 컨트롤러에서 반환값을 반환한다.
7. 핸들러 어댑터가 반환값을 처리한다.
8. 디스패쳐 서블릿에서 필터로 응답을 전송한다.

장점

  1. 프론트 컨트롤러 역할을 함으로써 공통 로직을 한 서블릿에서 처리해줌으로써 개발자는 다양한 요청마다 서블릿을 만들지 않아도 돼서 서비스 로직에만 집중할 수 있다.
  2. 정적 자원과 동적 자원을 분할 처리할 수 있다.
    디스패쳐 서블릿은 설정을 통해 동적 자원 요청(컨트롤러 요청)은 디스패쳐 서블릿으로 보내도록 하고, 정적 자원(HTML, CSS, JS, image..)는 웹 서버에서 처리하도록 할 수 있다. (xml에서 설정 or @Controller, @RequestMapping 사용하기)
<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern> <!-- URL 패턴 설정 -->
</servlet-mapping>

**참고
https://mangkyu.tistory.com/18
https://www.youtube.com/watch?v=calGCwG_B4Y&t=462s
https://velog.io/@betterfuture4/Spring-Dispatcher-Servlet-%EC%A0%95%EB%A6%AC

profile
Record What I Learned

0개의 댓글