Spring Boot

[Spring] Dispatcher servlet과 servlet container (작성 중)

HEY__ 2024. 7. 30. 22:05
728x90

이 글은 공부를 하면서 알게 된 내용들을 기록하는 글 입니다. 오류나 고쳐야 할 사항들이 있다면 지적 부탁드립니다!

 

Dispatcher servlet에 대해 공부를 하던 중 궁금증이 생겼다.

이번 포스팅에서는 그 궁금증들을 모두 풀어보는 시간을 가져보도록 하겠다!

 

Dispatcher-servlet도 Servlet의 일종이다.

Dispatcher-servlet은 Front-controller의 역할을 하며, Client로부터 들어오는 모든 request를 제일 먼저 받아 `해당 request를 처리할 Controller`를  찾는다.

 

Dispatcher-servlet은 그 이름처럼 Servlet의 종류 중 하나일까?

결론부터 이야기하자면 `YES`이다!

 

`DispatcherServlet` 클래스의 상속 관계를 살펴보면 정답이 금방 나온다. 

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들은 무엇일까?

 

흠... 해당 클래스들의 패키지를 보면 힌트가 될 수 있을 것 같다.

HttpServlet을 상속받은 클래스들
HttpServlet을 상속받은 클래스들

 

먼저 `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

 

 

 

 

728x90