이 글은 공부를 하면서 알게 된 내용들을 기록하는 글 입니다. 오류나 고쳐야 할 사항들이 있다면 지적 부탁드립니다!
Dispatcher servlet에 대해 공부를 하던 중 궁금증이 생겼다.
이번 포스팅에서는 그 궁금증들을 모두 풀어보는 시간을 가져보도록 하겠다!
✅ Dispatcher-servlet도 Servlet의 일종이다.
Dispatcher-servlet은 Front-controller의 역할을 하며, Client로부터 들어오는 모든 request를 제일 먼저 받아 `해당 request를 처리할 Controller`를 찾는다.
Dispatcher-servlet은 그 이름처럼 Servlet의 종류 중 하나일까?
결론부터 이야기하자면 `YES`이다!
`DispatcherServlet` 클래스의 상속 관계를 살펴보면 정답이 금방 나온다.
위의 그림은 `DispatcherServlet`의 상속 관계를 다이어그램으로 나타낸 것이다.
(Spring boot 프로젝트를 열고 DispatcherServlet 클래스를 찾아서 직접 확인할 수 있다!)
Java에서 직접 Servlet을 구현하고 싶을 때 `Servlet` 인터페이스를 구현하는데, DispatcherServlet도 Servlet 인터페이스를 구현하기 때문에 `Servlet의 일종`임을 알 수 있다.
✅ Dispatcher-servlet과 Servlet container
Servlet container와 servlet에 대해 짧게 복기해보자.
Servlet container는 client로부터 request를 받았을 때, 이를 처리할 servlet을 찾아 request를 전달해 response를 다시 받아온다.
흠.. 이 때 궁금점이 생긴다.
servlet container가 request를 받아서 이를 처리할 servlet을 찾아 전달한다고 했는데, Dispatcher servlet은 Front-controller로서 `request를 처리할 controller를 찾아서 전달하는 역할`을 한다.
그렇다면 dispatcher-servlet과 다른 servlet은 어떻게 동작하는 것인가?
구글링을 통해 공부를 하다보니, Servlet container(Tomcat)에는 DispatcherServlet만 등록되어 사용된다는 이야기가 있었다.
진짜인지 궁금한 마음에 `DispatcherServlet`의 상속 관계들을 살펴보기로 했다.
만일 DispatcherServlet만 Servlet container에 등록이 된다면, 상속 관계에 있는 어떤 클래스(HttpServletBean이던 HttpServlet이던...)를 상속/구현한 클래스가 없어야하지 않을까? 하는 생각이 들었다.
`DispatcherServlet` → `FrameworkServlet` → `HttpServletBean` → `HttpServlet` → `GenericServlet` → `Servlet `
먼저 `FrameworkServlet`을 상속받는 클래스를 살펴보자.
`DispatcherServlet`과 `TestDispatcherServlet` 둘만이 FrameworkServlet을 상속받고 있음을 확인할 수 있다.
TestDispatcherServlet의 패키지 위치를 통해 테스트를 위한 클래스임을 확인할 수 있으므로, DispatcherServlet만 상속받았다고 봐도 무방할 것이다.
흠... 앞으로 더 가보자.
`HttpServletBean`을 살펴보자.
`FrameworkServlet`을 상속받은 두 클래스와 `FrameworkServlet`만 있으므로, 이 또한 DispatcherServlet만 상속받았다고 봐도 무방할 것 같다.
한 번만 더 앞으로 가보자.
`HttpServlet`을 살펴보자.
앞의 두 클래스와는 다르게 `HttpServlet`을 상속받은 클래스가 17개나 되는 것을 알 수 있다.
`DispatcherServlet`, `TestDispatcherServlet`, `FrameworkServlet`, `HttpServletBean`을 제외하고서도 13개나 되는 것을 확인할 수 있다.
이 Servlet들은 무엇일까?
흠... 해당 클래스들의 패키지를 보면 힌트가 될 수 있을 것 같다.
먼저 `org.apache.catalina` 패키지 내에 있는 클래스들을 확인할 수 있다.
CGIServlet을 포함한 총 9개의 클래스가 이 패키지에 속하는데, 의존성(Gradle)을 확인해보면 tomcat-embed-core에 속하는 것을 확인할 수 있다.
다른 클래스들도 의존성을 확인해보면 `logback-core`, `h2`와 같이 실질적으로 Spring 프레임워크(DispatcherServlet)에 영향을 미치는 클래스는 아닌 듯 싶다.
`HttpRequestHandlerServlet`은 spring-web 의존성에 포함되어 있으므로,
최종적으로 spring-webmvc 의존성에 속하면서, Servlet 인터페이스를 구현한 클래스는 `DispatcherServlet`이라고 봐도 무방할 듯 하다.
다시 돌아와서 그럼 다른 Servlet들은 DispatcherServlet와 어떤 식으로 동작하는 것일까?
(작성 중)
으으음.. 모르겠다...
이걸 더 정확히 파악하려면 tomcat이 어떻게 동작하는지 파악을 해봐야 할 것 같다.
앞으로 더 찾아보며 업데이트하도록 하겠습니다!
✅ 참고 자료 & 링크
- https://m.blog.naver.com/qhdqhdekd261/221751234846
- https://dncjf0223.tistory.com/95