서블릿 컨테이너와 스레드

이재서·2026년 7월 16일

서블릿 컨테이너

서블릿이란?

클라이언트의 HTTP 요청을 받아 처리하고 동적인 웹 페이지를 생성하여 응답을 반환하는 서버 측 자바 기술

클라이언트의 요청을 받아 요청에 맞춰 비즈니스 로직을 수행하고, 처리 결과를 응답을 만들어 보낸다.

DispatcherServlet

HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러

Spring MVC에서 모든 요청은 먼저 DispatcherServlet을 통해 들어오게 된다.

DispatcherServlet은

  • 어떤 Controller를 호출할지 찾고
  • 필요한 객체를 생성하고
  • 응답을 만들어 반환한다
    Spring MVC의 핵심 Servlet이라고 할 수 있다.

서블릿 컨테이너

서블릿의 탄생부터 죽음까지 모든 생명주기를 관리하고 구동해주는 환경

Servlet은 혼자서는 동작할 수 없다. Servlet을 생성하고 실행해주는 환경이 필요한데 그것이 바로 Servlet Container이다.

대표적으로

  • Tomcat
  • Jetty
  • UnderTow

같은 구현체들이 존재한다.

ServletContainer의 역할은 다음과 같다.

  • Servlet의 생성
  • Sevlet 초기화
  • URL 매핑
  • 요청 전달
  • 응답 반환
  • 스레드 관리
  • 생명 주기

스레드

프로그램에서 실행되는 작업의 최소 단위

servlet 기반 서버에서는 스레드 하나 당 하나의 요청만 처리한다.

그렇다면 servlet 기반 서버가 아니라면 어떻게 작동할까?

싱글 스레드 - node.js

하나의 스레드를 효율적으로 사용하는 방식으로, spring과 달리 요청 당 하나의 스레드를 할당하는 것이 아니라 하나의 스레드가 요청을 받아들이고 이벤트 루프에서 요청을 비동기 처리하여 연산이 완료되는 동안 기다리지 않고 (논블로킹) 스레드가 다른 요청을 받는다. 요청이 완료되면 다시 스레드에 넘겨 응답을 보낸다.

멀티 스레드 - spring

하나의 요청에 하나의 스레드를 할당하는 방식으로, 스레드는 요청이 들어오면 완료되는 즉시 반환하는 동기 방식으로 작동하며, 연산이 완료되는 동안 스레드가 다른 작업을 하지 못하는 블로킹 방식을 사용한다.

spring에서 스레드를 관리하는 방식

사실 HTTP 요청에서 spring은 스레드를 생성하지 않는다. 스레드를 생성하고 관리하는 주체는 Servlet Container다.

HTTP 요청이 들어오면 Servlet Container에서 스레드를 할당하고 DispatcherServlet에 전달할뿐, spring은 스레드를 직접 생성하거나 관리하지 않는다.

스레드 풀

스레드의 생성과 제거에는 많은 비용이 든다. 모든 요청에 새로운 스레드를 할당한다고 하면 요청을 처리하는 비용보다 스레드의 생성과 제거에 드는 비용이 크다.

그렇기 때문에 Servlet Container는 스레드 풀을 이용한다.

스레드 풀은 미리 생성한 스레드를 해당 요청에 할당해서 사용하는 일종의 스레드 저장소다.

요청이 들어오면 스레드 풀에서 스레드를 할당받고 요청을 처리하면 해당 스레드는 다시 스레드 풀에 반환된다.

이를 통해 스레드의 생성 및 제거에 적은 비용을 소모하게 되고, 성능을 크게 향상시킬 수 있다.

profile
아무거나 쓰는 중

0개의 댓글