Spring을 공부하면 꼭 나오는 주제 “Dispatcher Servlet”
본격적으로 프로젝트와 공부를 병행하다보니, Controller가 Clinet의 요청을 전달받고 Server로부터의 응답을 반환하는 연결다리임은 알았지만 그 과정이 어떻게 진행되는지 몰랐었다.
“왜 Spring은 이렇게 작동할까?”하는 의문이 계속해서 생겨났고, Dispatcher Servlet도 그 궁금중 중 하나였다. 이번 포스팅을 통해 정확히 그 과정을 이해하고 넘어가고자 한다. 🌱
Dispatcher Servlet이란?
Dispatch
: “보내다” + Servlet
: “클라이언트의 요청에 대해 동적으로 작동하는 웹 어플리케이션 컴포넌트”
HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 Controller에 위임해주는 Front Controller
Spring은 왜 Dispatcher Servlet을 사용할까?
이전에는 Spring에서 xml을 사용하던 시절에는 Front와 Back개발자가 모두 개발을 같이 개발을 햇엇다. 하지만 Spring MVC는 Dispatcher Servlet이 나옴에 따라 xml의 역할을 줄였고, 결과적으로 개발의 분리를 가능하게 해줬다.
- 과거 : 모든 서블릿을 URL매핑을 위해 web.xml에 등록
- 현재 : DIsptacher-servlet이 해당 어플리케이션으로 들어오는 모든 요청을 Handling + 공통 작업을 처리
⇒ Controller를 구현만 해두면 알아서 Dispatcher Servlet이 적합한 Controller로 위임을 해준다.
Dispatcher Servlet의 동작 과정

1) 클라이언트의 요청을 Dispatcher Servlet이 받음
Filter들을 지나 Spring Context에서 Dispatcher Servlet이 가장 먼저 요청을 받는다.

2) Handler Mapping : 요청 정보를 통해 요청을 위임할 Controller를 찾음
ex) @Controller에 @RequestMapping을 사용해서 Controller작성
ex) RequestMappingHandlerMapping ⇒ @Controller로 작성된 모든 Controller를 찾고 파싱하여 HashMap으로 <요청정보, 처리할 대상>으로 관리
즉, 요청이 오면 Http Method, URI등을 사용해서 요청정보를 만들고, HashMap에서 요청을 처리할 대상(Handler Method)를 찾은 후에 HandlerExecutionChain으로 감싸서 반환
⚠️ 여기서, HandlerExecutionChain로 감싸는 이유가 Controller로 요청을 넘겨주기 전에 처리해야하는 Interceptor 등을 포함하기 위해서이다!
3) Handler Adaptor : Controller로 요청을 위임할 때 Handler Adapter를 통해 위임
❓ 왜 Handler Adpater를 통해 위임해야할까?
✅ Controller 구현 방식이 다양하기 때문이다.
이전에는 다양하게 작성되는 Controller에 대응하기 위해 Adapter Interface를 통해 Adapter Pattern을 적용함으로써 Controller 구현 방식에 상관없이 요청을 위임할 수 있도록 했다.
4) Handler Adaptor가 Controller로 요청을 위임
요청을 위임한 전/후에 공통적인 전/후처리 과정이 필요하다.
ex) ArgumentResolver : Interceptor들을 포함하여 요청시 @RequestParam, @RequestBody등을 처리하기 위해 사용
ex) ReturnValueHandler : 응답시 ResponseEntity의 Body를 Json으로 직렬화 처리
5) Business Logic 수행
Service를 호출해서 작성한 비지니스 로직들이 진행
6) Controller가 ResponseEntity를 반환
비지니스 로직들이 처리된 후에 Controller가 ResponseEntity를 반환한다.
ex) 응답 데이터 : Response Entity 반환
(→ 최근에는 Front와 Back을 분리하고 MSA 시대이므로 데이터로 반환하는 경우가 더 많다.)
ex) 응답 페이지 : String으로 View의 이름을 반환 (ex.Thymeleaf)
7) Handler Adapter가 반환값을 처리
handlerAdapter는 Controller로부터 받은 응답을 응답 처리기(ReturnValueHandler)가 후처리한 후에 Dispatcher Servlet에게 전송한다.
ex) ResponseEntity 반환 : HttpEntityMethodProcessor가 MessageConverter를 사용해 응답 객체를 직렬화하고 HttpStatus를 설정한다.
(→ 그렇기에 ResponseEntity를 공용패키지에 작성하는 경우가 많다.)
ex) View 반환 : ViewResolver를 통해 View를 반환한다
8) 서버의 응답을 클라이언트에게 전송
Dispatcher Servlet을 통해 반환되는 응답은 다시 Filter를 거쳐 Client에게 반환 (⚠️)
🔗 참고 url
https://mangkyu.tistory.com/18
Uploaded by N2T