Servlet Container와 Servlet의 관계

2026. 2. 5. 21:33·Backend/Servlet

 

정적인 웹 페이지의 한계

HTML만으로 웹 페이지를 만들면 기본적으로 정적인 페이지만 만들 수 있다.
정적인 페이지란, 한 번 만들어진 내용이 사용자, 시간, 상태에 따라 바뀌지 않는 페이지를 의미한다.

하지만 실제 웹 서비스에서는 다음과 같은 요구가 존재한다.

  • 사용자마다 다른 화면을 보여줘야 한다
  • 로그인 상태에 따라 다른 결과를 반환해야 한다
  • 게시판, 상품 목록처럼 데이터가 계속 바뀌어야 한다

이러한 요구는 HTML만으로는 해결할 수 없다.
이 한계를 극복하기 위해 등장한 것이 동적인 웹 페이지이고,
자바 진영에서 동적인 웹 페이지를 만들기 위한 기술 중 하나가 Servlet이다.

 

 

Servlet이란 무엇인가

Servlet은 자바로 작성된 서버 쪽 프로그램이다.
역할은 다음과 같다.

  • 클라이언트의 요청을 받아서
  • 요청에 포함된 데이터를 처리하고
  • 그 결과를 기반으로 HTML 응답을 생성하는 것

즉, Servlet은 단순히 파일을 내려주는 존재가 아니라
요청을 해석하고, 로직을 수행하고, 응답을 만들어내는 코드이다.

지금까지 Hello World를 출력하거나,
요청 파라미터를 읽어서 화면에 다시 출력했던 모든 작업이
Servlet이 수행한 동적인 처리에 해당한다.

 

 

Tomcat은 무엇을 하는가

Servlet은 혼자서는 실행될 수 없다.
Servlet을 실행하고 관리해주는 실행 환경이 필요하다.

이 역할을 수행하는 것이 Tomcat이다.

Tomcat의 핵심 역할은 다음과 같다.

  • 클라이언트의 HTTP 요청을 받는다
  • 요청 URL에서 경로(path)를 추출한다
  • 해당 경로에 매핑된 Servlet을 찾는다
  • Servlet을 실행하고
  • Servlet이 만든 응답을 클라이언트에게 전달한다

즉, Tomcat은 Servlet을 실행해주는 서버다.

 

 

WAS와 Servlet Container

Tomcat과 같은 서버를 일반적으로 웹 애플리케이션 서버라고 부른다.
줄여서 `WAS`라고 한다.

이때 자주 등장하는 개념이 `Servlet Container`이다.

  • Container는 “담는 그릇”이라는 의미다
  • Servlet Container는 `Servlet`을 담고 관리하는 환경이다

Tomcat은 다음 두 가지 역할을 동시에 수행한다.

  • WAS
  • Servlet Container

즉, Tomcat은 `Servlet Container`의 대표적인 구현체다.

 

 

Servlet Container의 동작 구조

`Servlet Container`는 서버가 시작될 때부터 동작을 시작한다.

1) 서버 시작 시점

  • Tomcat이 시작된다
  • 프로젝트에 포함된 Servlet 클래스를 로딩한다
  • 각 Servlet에 대해 인스턴스를 하나 생성한다
  • 생성된 Servlet 인스턴스를 컨테이너가 보관한다

이 시점에서 중요한 점은 다음이다.

Servlet 인스턴스는 서버 시작 시 한 번만 생성된다

요청이 올 때마다 새로 생성되지 않는다.

 

2) 클라이언트 요청 처리 흐름

클라이언트가 브라우저를 통해 HTTP 요청을 보내면 다음 순서로 처리된다.

  1. 클라이언트가 HTTP 요청을 보낸다
  2. Tomcat(Servlet Container)이 요청을 받는다
  3. 요청 URL에서 path를 추출한다
    예: /hello
  4. 해당 path에 매핑된 Servlet을 찾는다
  5. HttpServletRequest 객체 생성
  6. HttpServletResponse 객체 생성
  7. 요청 처리를 위한 스레드 하나를 할당
  8. Servlet의 service() 메서드를 호출하면서
    request, response 객체를 전달한다

 

 

service(), doGet(), doPost() 호출 구조

Servlet 실행의 핵심 메서드는 service()이다.

  • 모든 요청은 먼저 service() 메서드로 들어온다
  • service()는 HTTP 메서드를 기준으로 분기한다

 

HTTP 요청 호출되는 메서드
GET doGet()
POST doPost()

즉, 실제 개발자가 구현하는 로직은
doGet() 또는 doPost() 안에서 실행된다.

 

 

멀티스레드 기반 동작

Servlet Container는 멀티스레드 기반으로 동작한다.

  • 요청 하나당 스레드 하나
  • 여러 사용자의 요청이 동시에 처리된다
  • Servlet 인스턴스는 하나
  • 스레드는 여러 개

즉, 구조는 다음과 같다.

  • Servlet 인스턴스 1개
  • 여러 스레드가 같은 Servlet 인스턴스를 공유하며 실행

이 점이 Servlet에서 가장 중요한 특징 중 하나다.

 

 

요청 종료 후 자원 정리

요청 처리가 끝나면 다음이 발생한다.

  • 응답 데이터가 클라이언트로 전송된다
  • 해당 요청을 처리하던 스레드는 반환된다
  • request 객체와 response 객체는 소멸된다

하지만 여기서 중요한 차이가 있다.

Servlet 인스턴스는 소멸되지 않는다

Servlet 인스턴스는 다음 시점까지 살아 있다.

  • Tomcat 서버가 종료될 때까지

즉,

  • request / response → 요청 단위 객체
  • thread → 요청 단위 자원
  • servlet instance → 서버 생명주기 단위 자원

이다.

 

 

왜 이 구조를 반드시 이해해야 하는가

Servlet 인스턴스가 하나이고,
여러 스레드가 동시에 접근한다는 구조 때문에 다음 문제가 발생할 수 있다.

  • 인스턴스 필드에 상태를 저장하면 동시성 문제가 발생한다
  • 사용자별 데이터가 섞일 수 있다
  • 예측 불가능한 버그가 발생한다

그래서 Servlet에서는 다음 원칙이 중요하다.

  • 요청 데이터는 지역 변수로 처리한다
  • 인스턴스 필드에 요청 상태를 저장하지 않는다
  • 공유 자원에 대한 접근은 신중해야 한다

 

 

 

 

'Backend > Servlet' 카테고리의 다른 글

forward와 JSP 실행 흐름  (0) 2026.02.06
멀티스레드 환경에서 Servlet 사용  (0) 2026.02.06
RequestMapping static Map은 괜찮은 이유  (0) 2026.02.05
서블릿에서의 static  (0) 2026.02.05
서블릿 요청 흐름 : Request가 채워지는 시점과 service() 호출 위치  (0) 2026.02.05
'Backend/Servlet' 카테고리의 다른 글
  • forward와 JSP 실행 흐름
  • 멀티스레드 환경에서 Servlet 사용
  • RequestMapping static Map은 괜찮은 이유
  • 서블릿에서의 static
sqaxe1
sqaxe1
woojoo-devlog 님의 블로그 입니다.
  • sqaxe1
    Woojoo's Devlog
    sqaxe1
  • 전체
    오늘
    어제
    • 분류 전체보기 (148)
      • Backend (9)
        • Servlet (7)
        • Spring (2)
      • Frontend (1)
      • CS (0)
      • Book (33)
        • 자바 웹 프로그래밍 Next Step (30)
        • 테스트 주도 개발: 고품질 쾌속개발을 위한 TDD.. (1)
        • 성공과 실패를 결정하는 1%의 네트워크 원리 (2)
      • Engineering (0)
        • Testing (0)
      • Infra (6)
        • AWS (6)
      • Java (4)
      • Network (1)
      • 김영한 (28)
        • 자바 입문 (8)
        • 실전 자바 - 기본편 (6)
        • 실전 자바 - 중급편 (10)
        • 실전 자바 - 고급편 (4)
      • Web (39)
        • Web Basics (39)
      • Project (24)
        • NeoSquare (0)
        • Memo Evolution (24)
      • 정보처리기사 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    개발서적
    java
    aws
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
sqaxe1
Servlet Container와 Servlet의 관계
상단으로

티스토리툴바