Spring

Spring Dispatcher Servlet & Request Life Cycle

muyeon 2024. 1. 29. 15:58

Dispatcher Servlet 이란?

dispatcher(보내다) 라는 뜻

HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러이다.

자세히는 클라이언트로부터 어떤 요청이 들어오면 톰캣과 같은 서블릿 컨테이너가 요청을 받게 된다.

 

그리고 모든 요청을 Dispatcher Servlet이 가장 먼저 받게 된다. 이 서블릿은 공통적인 작업을 먼저 처리한 후에 해당 요청을 처리해야 하는 컨트롤러를 찾아서 작업을 위임한다.

 

즉 컨트롤러를 구현해두기만 하면 Dispatcher Servlet이 알아서 적합한 컨트롤러로 위임을 해주는 구조가 되었다.

 

요청을 컨트롤러를 넘겨주는 방식은 효율적으로 보이지만 Dispatcher Servlet이 모든 요청을 처리하다 보니 이미지나 HTML/CSS/JS 같은 정적 파일에 대한 요청마저 모두 가로채기 때문에 정적자원을 불러오지 못하는 문제가 있었다.

 

이 문제를 해결하기 위해 두가지 방법을 고안하였다.

 


해결방법

 

1. 정적 자원 요청과 애플리케이션 요청을 분리

  • /apps 의 URL 로 접근하면 디스팻처 서블릿이 담당
  • /resources 의 URL 로 접근하면 디스펫처 서블릿이 컨트롤할 수 없으므로 담당하지 않음

이 방법은 코드가 지저분해지며 모든 요청에 대해 URL 을 붙여야 하므로 직관적인 설계가 불가하다.

 

2. 애플리케이션 요청을 탐색하고 없으면 정적 자원 요청으로 처리

  • 디스팻처 서블릿이 요청을 처리할 컨트롤러를 먼저 찾고, 요청에 대한 컨트롤러를 찾을 수 없는 경우에 2차적으로 설정된 자원(Resource) 경로를 탐색하여 자원을 탐색한다.
  • 이렇게 영역을 분리하면 효율적인 리소스 관리를 지원할 뿐 아니라 추후 확장을 용이하게 해준다.

Request Life Cycle

 

 

  1. Client로 부터 Request(요청) 이 오면 가장 먼저 Dispatcher Servlet 이 그 요청을 받는다.
  2. Dispatcher Servlet은 가장 먼저 Handler Mapping을 통해 Controller의 존재 여부를 판단을 지시
  3. Dispatcher Servlet으로 부터 지시를 받은 Handler Adapter는 Controller에 위임
  4. Client요청에 따라 Service → Repository → Database 를 거친다.
  5. Response(응답)으로 반환한다.
  6. 만일 Controller 에 존재 하지않았을때 View Resolver 에 위임하여 정적 파일이 있는지 확인.
  7. 정적파일 있는지의 여부를 판단한 후 View 로 Respose(응답)를 해준다.
  8. Client로부터 Request(요청) 이 오면 가장 먼저 Dispatcher Servlet 이 그 요청을 받는다.
  9. Dispatcher Servlet은 가장 먼저 Handler Mapping을 통해 Controller의 존재 여부를 판단을 지시
  10. Dispatcher Servlet으로 부터 지시를 받은 Handler Adapter는 Controller에 위임
  11. Client요청에 따라 Service → Repository → Database를 거친다.
  12. Response(응답)으로 반환한다.
  13. 만일 Controller 에 존재하지 않았을 때 View Resolver에 위임하여 정적 파일이 있는지 확인.
  14. 정적파일 있는지의 여부를 판단한 후 View로 Respose(응답)를 해준다.

예시)

  1. 업무(Client) 의 지시를 받아 행보관(Servlet)에게 전달
  2. 지시를 받은 행보관(Servlet)은 김병장(Mapping)에게 성윤모이병(Controller)가 있는지 확인을 지시
  3. 행보관에 지시로 김상병(Adapter)는 다시 성윤모이병(Controller)에게 업무를 지시
  4. 노상병(Adapter)에게 성윤모이병(Controller)에 Service, Repository, Datebase 의 임무를 수행시킴
  5. 임무완료.
  6. 성윤모이병(Controller) 가 없을 경우 바로 행보관(Servlet) 에게 전달 후 대체인력(정적파일) 투입
  7. 보고를 받은 행보관(Servlet)은 대체인력(정적파일)로 업무(Client)수행.
  8. 업무(Client)의 지시를 받아 행보관(Servlet)에게 전달
  9. 지시를 받은 행보관(Servlet)은 김병장(Mapping)에게 성윤모이병(Controller)이 있는지 확인을 지시
  10. 행보관에 지시로 김상병(Adapter)는 다시 성윤모이병(Controller)에게 업무를 지시
  11. 노상병(Adapter)에게 성윤모이병(Controller)에 Service, Repository, Datebase의 임무를 수행시킴
  12. 임무완료.
  13. 성윤모이병(Controller)이 없을 경우 바로 행보관(Servlet) 에게 전달 후 대체인력(정적파일) 투입
  14. 보고를 받은 행보관(Servlet)은 대체인력(정적파일)로 업무(Client) 수행.

참고링크

 

https://mangkyu.tistory.com/18

 

[Spring] Dispatcher-Servlet(디스패처 서블릿)이란? 디스패처 서블릿의 개념과 동작 과정

이번에는 servlet의 심화 또는 대표주자인 dispatcher-servlet에 대해서 알아보도록 하겠습니다. 1. Dispatcher-Servlet(디스패처 서블릿)의 개념 [ Dispatcher-Servlet(디스패처 서블릿) 이란? ] 디스패처 서블릿의

mangkyu.tistory.com

https://hermeslog.tistory.com/446

 

[Spring] Spring MVC의 라이프사이클

Spring MVC 라이프 사이클을 공부합니다. 검색을 해보니 대부분 다음과 같은 이미지로 통일되더군요.. 그 중 제일 알아보기 쉬운 장표를 찾았습니다. Request가 들어오는 Flow는 그림과 같이 순서대로

hermeslog.tistory.com