이 글은 공부를 하면서 알게 된 내용들을 기록하는 글 입니다. 오류나 고쳐야 할 사항들이 있다면 지적 부탁드립니다!
✅ Dispatcher Servlet이란?
디스패처 서블릿의 dispatch는 "보내다"라는 뜻을 가지고 있다.
Dispatcher servlet은 HTTP 프로토콜을 통해 들어오는 요청을 먼저 받아(Front-controller) 적합한 컨트롤러에 위임(보내주는) 역할을 한다.
✅ Dispatcher-servlet의 동작 방식
Spring boot 웹 어플리케이션에서 `Dispatcher-servlet`은 중요한 역할을 하며, request들을 처리(Handling)하는 복잡한 components들을 조율한다.
`Dispatcher-servlet`은 들어오는 각각의 Request가 적절한 controller에 도달할 수 있도록 보장하며, 적절한 비지니스 로직을 수행하여 알맞은 응답을 반환할 수 있도록 한다.
1. Request의 진입점(Entry Point) 역할
`Dispatcher-servlet`은 Spring boot 웹 어플리케이션에서 심장과 같은 역할을 한다.
HTTP request를 받으면 `Dispatcher-servlet`은 마치 `gateway`와 같이 동작하는데, 들어오는 요청을 가로채서(intercept) request를 처리하는 프로세스를 실행한다.
이는 request와 response의 흐름을 관리하는 `중앙 허브`와 같은 역할을 한다.
2. Web Application Context
`Dispatcher-servlet`은 `Spring application context`이라는 큰 맥락 안에서 동작한다.
`Spring application context`는 controller, service 혹은 다른 컴포넌트(component)를 포함한 `bean`들을 관리하는데에 꼭 필요한 container이다.
`Dispatcher-servlet`는 이 context를 활용하여 request를 처리할 수 있는 적절한 components들을 찾고 실행시킨다.
3. Handler Mapping: 어떤 Handler를 사용할 것인지
`Dispatcher-servlet`의 주요 역할 중 하나가 바로 `HandlerMapping`를 참고하는 것이다.
HandlerMapping를 통해 `request URL`, `request method(GET, POST...)`, `parameter`들을 통해 요청받은 request를 어떤 controller(handler)가 처리해야하는지 알 수 있다.
HandlerMapping을 통해 request를 처리할 controller에 대한 정보를 `Dispatcher-servlet`에게 전달하게 된다.
4. Handler Adapter: Bridging the Interface Gap
Spring boot에서의 Controller들은 각자 다른 method signature들을 가지고 있을 것이다.
🔥 method signature
메서드의 정의에서 `메서드 이름`과 `매개변수 리스트`의 조합을 이야기한다. Java 컴파일러에서는 메서드 이름과 매개변수 리스트를 통해 메서드를 식별한다.
3번에서 `HandlerMapping`을 통해 어떤 Handler를 사용할 것인지 정했다.
`HandlerAdapter`는 controller들 간의 차이(gap) 간에 다리(bridge)역할을 하며, 처리를 담당하는 handler가 표준화 된(standardized) 인터페이스를 사용함으로서, request를 처리할 때에 통일된(unified) 처리 방식을 따를 수 있도록 한다.
`Dispatcher-servlet`은 적절한 parameter를 통해 method를 호출할 수 있도록 도와주는 `HandlerAdapter`를 필요로 한다.
5. Handler Execution: 비지니스 로직 처리
위의 과정을 통해 `Dispatcher-servlet`은 어플리케이션의 비지니스 로직이 구현되어 있는 Controller의 메서드를 실행한다.
해당 메서드에 개발자는 해당 메서드에 어플리케이션이 client의 요청에 대해 어떻게 응답을 해야하는지, database와 어떤 작업을 해야하는지 등을 정의한다.
6. View Resolution: Response 준비하기
Handler가 request를 처리하여 결과 값을 생성하면 `Dispatcher-servlet`은 `ViewResolver`를 호출한다.
`ViewResolver`는 실제 view를 보여주기 위해 logical view name을 얻어 반환한다. 이 view는 HTML, JSON 혹은 다른 content-type과 같이 적절한 응답 포맷을 반환하는데에 중요한 역할을 한다.
RESTful한 서비스는 JSON 응답을 하는데, view resolution의 전통적인 컨셉으로 보면 이는 적절하지 않다.
controller에서 데이터를 바로 반환하는 것에 포커스가 맞춰져 있으며, response의 포맷(format)은 request header의 `media type`을 통해 정해진다. (e.g., `application/json`)
이러한 케이스에서는 view resolution의 역할은 미미하고, 요구하는 응답 포맷을 만들기 위해 data를 serialization하는 것에 중점을 두고 있다.
Spring boot에서는 `HttpMessageConverter`를 유틸화하고 있는데, 그 중 `MappingJackson2HttpMessageConverter`의 경우에는 POJO와 같은 객체(object)를 `JSON` 포맷으로 변환한다.
7. Sending Response
`Dispatcher-servlet`은 client에게 response를 전달하는 역할을 한다.
client는 렌더링 된 web-page 혹은 controller를 통해 data-payload와 같이 생성된 응답(content)를 받는다.
✅ 참고 자료 & 링크
- https://mangkyu.tistory.com/18
- Dispatcher-servlet의 동작 방식: https://medium.com/@lakshyachampion/the-dispatcherservlet-the-engine-of-request-handling-in-spring-boot-3a85c2bdbe6b