
이번에는 Java의 Servlet 과 Spring 의 Dispatcher Servlet 에 대해 알아 볼 것이다.
과거 Java 개발자에 단골 면접 질문이라고 들었는데 요즘은 잘 묻지는 않는 것 같다.
하지만 Interceptor, filter , AOP 와 같은 개념들을 이해하려면 사전 지식으로 Sevlet의 개념을 알고 있어야한다.
그럼 한 번 같이 알아보자.
servlet 은 자바 기반의 웹 애플리케이션에서 클라이언트의 요청을 처리하고 응답을 생성하는 서버 측 프로그램이다.
HTTP 요청을 받아 비즈니스 로직을 수행한 후 HTTP 응답을 반환하는 역할을 한다.
Servlet 없이도 HTTP 요청을 처리할 수 있지만, 개발자가 직접 오고가는 문자열을 파싱해야 하거나, 세션 관리/ 보안 처리 등도 직접 구현해야 할 수도 있다.
Sevlet 은 이 문제들을 해결해주며, 이 Servlet 으로 동적 웹 페이지를 구현할 수 있다.
또한 Servlet 은 구현체이기 보다는 기능을 정의한 표준 API 이다.
실제 구현은 웹 애플리케이션에서 이뤄지는데 예를 들어 Apache Tomcat 등이 표준 API 를 기반으로 구현체를 만드는 식이다.
아래는 Jakarta 에서 설명하는 servlet 의 번역본이다.
서블릿(Servlet)은 Jakarta 기술 기반의 웹 컴포넌트로, 컨테이너에 의해 관리되며 동적인 콘텐츠를 생성합니다. 다른 Jakarta 기술 기반의 컴포넌트와 마찬가지로, 서블릿은 플랫폼에 독립적인 Java 클래스이며, 플랫폼에 중립적인 바이트 코드로 컴파일되어 Jakarta 기술을 지원하는 웹 서버에서 동적으로 로드 및 실행될 수 있습니다.
컨테이너(때때로 서블릿 엔진이라고도 함)는 웹 서버의 확장 기능으로서 서블릿을 실행하는 역할을 합니다. 서블릿은 요청/응답 방식(request/response paradigm)을 통해 웹 클라이언트와 상호작용하며, 이 과정은 서블릿 컨테이너에 의해 구현됩니다.
동작 원리를 알기 전에 Servlet Container 에 대해서도 알고 있어야 한다.
Servlet Container 는 서블릿을 실행하는 환경을 제공해주는 소프트웨어이다.
클라이언트 요청을 받아 서블릿에서 처리한 후 응답을 반환하는 역할을 한다.
또한 Servlet Container 는 서블릿의 생명주기를 관리하고 제어한다.
Servlet Container 의 주요 기능
그럼 이제 Servlet 동작 원리를 알아보겠다.

✨ 더 알아가기
servlet 객체를 생성하고 초기화하는 것은 작업 비용이 많이 든다.
그래서 tomcat 은 이미 생성된 servlet 객체는 메모리에 남겨두어, 다음 요청을 대비한다. 그리고 톰캣이 종료되기 전이나 reload 전에 모든 Servlet 을 제거하게 된다.
servlet 만 사용하면 코드가 복잡해지기가 쉽다.
그래서 Spring MVC 와 같은 기술을 사용해서 개발을 보통 하게 되는데, 그 중 Dispatcher Servlet 은 Spring MVC 에서 사용되는 sevlet 기반의 핵심 기술 중 하나이다.
Dispatcher Servlet 은 스프링 설정을 사용해 요청을 매핑, 예외 처리, 뷰 결정 등에 필요한 위임 컴포넌트를 찾는다.
Http 요청 처리 및 분배 : Client의 모든 HTTP 요청을 받아들이고 요청된 URL을 분석하여 적절한 핸들러에게 전달한다. 요청된 URL 을 기반으로 적합한 컨트롤러로 작업을 전달한다.
핸들러 매핑과 실행 : 핸들러 매핑을 이용해 요청된 URL 에 맞는 컨트롤러를 찾으며 해당 컨트롤러를 실행하여 요청을 처리하게 된다.
뷰 리졸버와 뷰 전달 : 요청을 처리한 후 뷰 리졸버 (View Resolver) 를 사용해 해당하는 뷰를 결정하고 뷰를 실행하여 Client 에게 응답 결과를 반환한다.
전체적인 웹 애플리케이션의 흐름 제어 : 애플리케이션 내의 요청 처리 과정을 관린한다.

** 이미지 자료 출처는 Chat상우 블로그 입니다.
클라이언트의 HTTP 요청을 받는다.
Handler Mapping 에 사용자 요청을 위임해 요청에 해당하는 URL 에 매핑된 컨트롤러를 탐색한다.
2 에서 반환된 값이 있는 경우 해당 컨트로러를 호출할 수 있는 HandlerAdapter 에 요청을 전달한다.
HandlerAdapter 에서 해당 컨트롤러를 호출한다.
컨트롤러에서 처리된 결과를 Model 에 설정해 뷰 이름을 반환한다.
5 에서 전달된 View 를 View Resolver 에 전달하고 해당하는 View 개체를 찾아 반환한다.
6에서 반환된 View 에 model 의 값을 전달하고 화면 표시를 요청한다.
응답받은 View 의 결과를 클라이언트에게 응답한다.
여기서 만약 @RestContoller를 사용한다면 View 와 ViewResolver 를 거치지 않고, Controller 로부터 반환받은 데이터를 MessageConverter 를 거쳐 Json 형식으로 변환한다.
그 후 Json 을 ResposneBody로 응답한다.
Dispatcher Servlet 만 보았을 때 동작원리는 이렇다.
그런데 과연 웹 애플리케이션 환경에서 요청이 오면 오직 Dispatcher Servlet 만이 동작될까? 🤔
요청이 들어오면 설정된 Filter , interceptor 도 함께 동작될 것인데 이것의 정확한 개념와 처리 과정을 다음 포스팅에서 살펴보겠다.
이상으로 포스팅을 마치겠다.
작게라도 도움이 되면 좋겠다.
참조
Jakarta Servlet Specification
Spring Framework Reference Documentation
망나니 개발자 - [JSP] 서블릿(Servlet)이란?
openmaru.io
Chat상우 - spring Dispatcher Servlet 구조 및 동작원리