Servlet 과 DispatcherServlet : Java 개발자라면 꼭 알아가자 - 너 한 번 Servlet 써블랫?

이가희·2025년 3월 17일

spring + java

목록 보기
7/14
post-thumbnail

이번에는 Java의 Servlet 과 Spring 의 Dispatcher Servlet 에 대해 알아 볼 것이다.

과거 Java 개발자에 단골 면접 질문이라고 들었는데 요즘은 잘 묻지는 않는 것 같다.
하지만 Interceptor, filter , AOP 와 같은 개념들을 이해하려면 사전 지식으로 Sevlet의 개념을 알고 있어야한다.

그럼 한 번 같이 알아보자.


1. Servlet

servlet 은 자바 기반의 웹 애플리케이션에서 클라이언트의 요청을 처리하고 응답을 생성하는 서버 측 프로그램이다.

HTTP 요청을 받아 비즈니스 로직을 수행한 후 HTTP 응답을 반환하는 역할을 한다.

Servlet 없이도 HTTP 요청을 처리할 수 있지만, 개발자가 직접 오고가는 문자열을 파싱해야 하거나, 세션 관리/ 보안 처리 등도 직접 구현해야 할 수도 있다.

Sevlet 은 이 문제들을 해결해주며, 이 Servlet 으로 동적 웹 페이지를 구현할 수 있다.

또한 Servlet 은 구현체이기 보다는 기능을 정의한 표준 API 이다.
실제 구현은 웹 애플리케이션에서 이뤄지는데 예를 들어 Apache Tomcat 등이 표준 API 를 기반으로 구현체를 만드는 식이다.

아래는 Jakarta 에서 설명하는 servlet 의 번역본이다.
서블릿(Servlet)은 Jakarta 기술 기반의 웹 컴포넌트로, 컨테이너에 의해 관리되며 동적인 콘텐츠를 생성합니다. 다른 Jakarta 기술 기반의 컴포넌트와 마찬가지로, 서블릿은 플랫폼에 독립적인 Java 클래스이며, 플랫폼에 중립적인 바이트 코드로 컴파일되어 Jakarta 기술을 지원하는 웹 서버에서 동적으로 로드 및 실행될 수 있습니다.
컨테이너(때때로 서블릿 엔진이라고도 함)는 웹 서버의 확장 기능으로서 서블릿을 실행하는 역할을 합니다. 서블릿은 요청/응답 방식(request/response paradigm)을 통해 웹 클라이언트와 상호작용하며, 이 과정은 서블릿 컨테이너에 의해 구현됩니다.

1.2 Servlet 의 주요 특징

  • HTTP 프로토콜 서비스를 지원하는 HttpServlet 클래스를 상속받는다.
  • servlet 은 단독으로 실행되지 않고, tomcat 과 같은 웹 컨테이너에서 실행된다.
  • HTTP 요청을 처리하고 응답을 반환하는 역할을 담당한다.
  • Java로 개발되며 서버에서 실행된다.
  • 여러 가지 요청을 동시에 처리할 수 있으며 높은 보안성을 제공한다.

1.2 Servlet 의 동작 원리

동작 원리를 알기 전에 Servlet Container 에 대해서도 알고 있어야 한다.


📂Servlet Container?

Servlet Container 는 서블릿을 실행하는 환경을 제공해주는 소프트웨어이다.
클라이언트 요청을 받아 서블릿에서 처리한 후 응답을 반환하는 역할을 한다.
또한 Servlet Container 는 서블릿의 생명주기를 관리하고 제어한다.

Servlet Container 의 주요 기능

  1. 클라이언트 요청 관리
    HTTP 요청을 받아 적절한 서블릿으로 전달한다.
    요청을 분석하고 필요한 파라미터를 HttpServletRequest 객체로 변환한다.
  2. 서블릿 생명주기 관리
    init() 을 통해 서블릿 클래스를 로드하고 인스턴스를 생성 및 초기화한다.
    service() 를 통해 Servlet 이 클라이언트 요청을 처리하도록 한다.
    서버 종료 시 destroy() 를 호출하여 리소스를 정리한다.
  3. 멀티스레딩 지원
    요청마다 새로운 스레드를 생성해 성능을 최적화한다.
  4. 세션 관리
    HttpSession 을 통해 클라이언트별 상태를 유지한다.
  5. 보안 관리
    HTTP(S) 프로토콜을 통한 보안 기능 및 인증/권한 부여 기능을 수행

그럼 이제 Servlet 동작 원리를 알아보겠다.

  1. 사용자가 URL 을 통해 요청을 보내면 HTTP Request 를 Servlet Container 로 전송한다.
  2. HTTP Request 를 전송받은 Servlet Container 는 HttpServletRequest, HttpServletResponse 두 객체를 생성한다. (init())
  3. 그 다음에 요청한 URL 을 분석하여 어느 서블릿에 대해 요청을 한 것인지 찾는다.
  4. 해당 서블릿에서 service method 를 호출한 후 POST, Get 여부에 따라 doGet() 또는 doPost() 를 호출한다.
  5. doGet() or doPost() method 는 동적 페이지를 생성한 후 HttpServletResponse 객체에 응답을 보낸다.
  6. 응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킨다. (destroy())

✨ 더 알아가기
servlet 객체를 생성하고 초기화하는 것은 작업 비용이 많이 든다.
그래서 tomcat 은 이미 생성된 servlet 객체는 메모리에 남겨두어, 다음 요청을 대비한다. 그리고 톰캣이 종료되기 전이나 reload 전에 모든 Servlet 을 제거하게 된다.


2. Dispatcher Servlet

servlet 만 사용하면 코드가 복잡해지기가 쉽다.
그래서 Spring MVC 와 같은 기술을 사용해서 개발을 보통 하게 되는데, 그 중 Dispatcher Servlet 은 Spring MVC 에서 사용되는 sevlet 기반의 핵심 기술 중 하나이다.

Dispatcher Servlet 은 스프링 설정을 사용해 요청을 매핑, 예외 처리, 뷰 결정 등에 필요한 위임 컴포넌트를 찾는다.

2.1 Dispatcher Servlet 의 역할

  1. Http 요청 처리 및 분배 : Client의 모든 HTTP 요청을 받아들이고 요청된 URL을 분석하여 적절한 핸들러에게 전달한다. 요청된 URL 을 기반으로 적합한 컨트롤러로 작업을 전달한다.

  2. 핸들러 매핑과 실행 : 핸들러 매핑을 이용해 요청된 URL 에 맞는 컨트롤러를 찾으며 해당 컨트롤러를 실행하여 요청을 처리하게 된다.

  3. 뷰 리졸버와 뷰 전달 : 요청을 처리한 후 뷰 리졸버 (View Resolver) 를 사용해 해당하는 뷰를 결정하고 뷰를 실행하여 Client 에게 응답 결과를 반환한다.

  4. 전체적인 웹 애플리케이션의 흐름 제어 : 애플리케이션 내의 요청 처리 과정을 관린한다.

2.2 Dispatcher Servlet 동작 원리

** 이미지 자료 출처는 Chat상우 블로그 입니다.

  1. 클라이언트의 HTTP 요청을 받는다.

  2. Handler Mapping 에 사용자 요청을 위임해 요청에 해당하는 URL 에 매핑된 컨트롤러를 탐색한다.

  3. 2 에서 반환된 값이 있는 경우 해당 컨트로러를 호출할 수 있는 HandlerAdapter 에 요청을 전달한다.

  4. HandlerAdapter 에서 해당 컨트롤러를 호출한다.

  5. 컨트롤러에서 처리된 결과를 Model 에 설정해 뷰 이름을 반환한다.

  6. 5 에서 전달된 View 를 View Resolver 에 전달하고 해당하는 View 개체를 찾아 반환한다.

  7. 6에서 반환된 View 에 model 의 값을 전달하고 화면 표시를 요청한다.

  8. 응답받은 View 의 결과를 클라이언트에게 응답한다.

여기서 만약 @RestContoller를 사용한다면 View 와 ViewResolver 를 거치지 않고, Controller 로부터 반환받은 데이터를 MessageConverter 를 거쳐 Json 형식으로 변환한다.
그 후 Json 을 ResposneBody로 응답한다.


Dispatcher Servlet 만 보았을 때 동작원리는 이렇다.
그런데 과연 웹 애플리케이션 환경에서 요청이 오면 오직 Dispatcher Servlet 만이 동작될까? 🤔
요청이 들어오면 설정된 Filter , interceptor 도 함께 동작될 것인데 이것의 정확한 개념와 처리 과정을 다음 포스팅에서 살펴보겠다.

보고싶다면?? 이곳으로! - Spring : Filter, Interceptor, AOP

이상으로 포스팅을 마치겠다.
작게라도 도움이 되면 좋겠다.


참조
Jakarta Servlet Specification
Spring Framework Reference Documentation
망나니 개발자 - [JSP] 서블릿(Servlet)이란?
openmaru.io
Chat상우 - spring Dispatcher Servlet 구조 및 동작원리

profile
안녕하세요 개발하는 사람입니다.

0개의 댓글