[Spring] 서블릿(Servlet)과 서블릿 컨테이너

2025. 7. 16. 01:40·Spring

웹 서버 (Web Server) 

웹 서버는 HTTP 프로토콜을 이해하고, 요청/응답을 처리하는 서버 프로그램이다. 역할은 크게 2가지가 있다. 

  1. 정적 파일 전송 
    • HTML, CSS, JS, 이미지, 동영상 같은 변하지 않는 파일 
    • 서버가 그냥 디스크를 읽어서 그대로 클라이언트(브라우저)에 보냄
    • ex) index.html을 그대로 전송 
  2. 동적 파일 전송 
    • 요청 시점에 코드를 실행해서 결과를 만들어 보내야 하는 경우 
    • ex) 로그인 처리, 게시판 목록 조회, 검색 기능, 주문 처리 등 
    • 웹 서버 자체는 코드 실행이 아니라, 파일 전송이 주 목적이기 때문에 위와 같은 예시들의 요청에 애플리케이션 로직을 처리할 수 있는 프로그램에게 넘겨준다. 그리고 이 프로그램이 자바에서는 `서블릿` 에 해당한다. 

전체 동작 흐름 

[브라우저]
   ↓ (HTTP 요청)
[웹 서버 + 서블릿 컨테이너]
   ├─ 정적 파일 요청? → 디스크에서 그대로 읽어 전송
   └─ 동적 요청? → 서블릿 컨테이너가 해당 서블릿 실행
                      ↓
                 서블릿이 로직 처리 (DB 조회 등)
                      ↓
                 HTML/JSON 생성
                      ↓
             컨테이너가 HTTP 응답으로 변환
   ↑ (HTTP 응답)
[브라우저]

HTTP (HyperText Transfer Protocol) 

브라우저와 서버가 요청(request) - 응답(response) 방식으로 통신하는 규칙으로 모든 웹 통신의 기본이 되는 프로토콜이다. 


서블릿 (Servlet) 

자바로 작성된 HTTP 요청 처리용 프로그램이다. 정적 파일이 아니라 동적으로 만들어진 결과를 HTTP 응답으로 전송한다. 

요청 파라미터 읽기, DB 조회, 비즈니스 로직 수행, HTML/JSON 응답 생성 등의 작업을 수행한다. 

 

서블릿 라이프 사이클 

  • `init()` : 서블릿 최초 생성 시 한 번 호출 
  • `service()` : 요청마다 호출 
  • `destroy()` : 서버 종료 시 호출 

 

서블릿 컨테이너 (Servlet Container) 

서블릿이 혼자 실행되는 것이 아니라, 서블릿 컨테이너 안에서 실행된다.

[브라우저]  -- HTTP 요청 -->
        [Tomcat(서블릿 컨테이너)]
            1. HTTP 요청 파싱
            2. URL → 서블릿 매핑
            3. 해당 서블릿의 service() 호출
            4. 서블릿이 로직 처리(DB 조회, HTML 생성 등)
            5. HTTP 응답 객체 생성
            6. 응답 전송
[브라우저]  <-- HTTP 응답 --

Tomcat 

자바에서 대표적인, 가장 널리 쓰는 오픈소스 서블릿 컨테이너이다. 

  • 간단한 정적 파일 처리도 가능
  • 스프링 부트 실행 시, Tomcat이 자동으로 내장되어 서블릿 실행 환경을 제공한다. 
  • Apache 재단에서 관리
  • 오픈소스, 대규모 서비스에서도 안정적으로 동작한다. 

+) Tomcat도 정적 파일 제공이 가능하지만, 정적 파일을 Nginx에서 처리하면 더 빠르고 효율적이다. HTTPS, 로드밸런싱, 보안 처리에도 좋기 때문에 Nginx를 앞단에 둔다. 


서블릿 인스턴스 

서블릿은 싱글톤 패턴이다.

싱글톤 패턴 (Singleton Pattern = 어떤 클래스의 인스턴스를 하나만 만들어서 프로그램 전체에서 공유하는 디자인 패턴) 

서블릿 컨테이너(Tomcat)은 서블릿 클래스 당 인스턴스를 1개만 생성한다. URL(엔드포인트)마다 매핑된 서블릿 클래스가 있고, 각 클래스는 인스턴스 1개씩만 유지한다. 


스레드 

요청이 들어오면 Tomcat은 스레드 풀(thread pool)에서 스레드를 꺼내서 처리한다. (요청 1개 = 스레드 1개) 

요청 처리가 끝나면 스레드 풀에 반납하고 다음 요청에서 재사용한다. 여러 요청이 동시에 들어오면 여러 스레드가 동시에 동작한다. 그래서 동시성 문제 (= 같은 인스턴스를 여러 스레드가 동시에 접근하므로, 인스턴스 변수(=필드)를 변경하면 값이 꼬일 수 있다.) 가 발생하기도 한다.

 

/hello → HelloServlet (인스턴스 1개)
    ├─ Thread-1 (요청 A)
    ├─ Thread-2 (요청 B)
    └─ Thread-3 (요청 C)

/bye → ByeServlet (인스턴스 1개)
    ├─ Thread-4 (요청 D)
    └─ Thread-5 (요청 E)

 

그러나, Spring MVC 방식에서는 URL마다 서블릿 클래스를 만들지 않는다. 이 부분에 대해서는 다음 포스트를 참고하면 된다.

 

'Spring' 카테고리의 다른 글

[Spring] 레이어드 아키텍처(Layered Architecture)와 Spring MVC  (0) 2025.08.05
[Spring] DispatcherServlet과 스프링부트 동작 구조  (3) 2025.07.26
[Spring] Spring Security의 구조와 흐름  (0) 2025.07.17
[Spring] JWT 토큰 인증 & 쿠키, 세션, 토큰  (0) 2025.07.16
[Spring] 스프링 컨테이너와 빈  (0) 2025.07.16
'Spring' 카테고리의 다른 글
  • [Spring] DispatcherServlet과 스프링부트 동작 구조
  • [Spring] Spring Security의 구조와 흐름
  • [Spring] JWT 토큰 인증 & 쿠키, 세션, 토큰
  • [Spring] 스프링 컨테이너와 빈
erika0915
erika0915
백엔드 개발자가 되고 싶어요 .
  • erika0915
    erikoding
    erika0915
  • 전체
    오늘
    어제
    • 분류 전체보기 (78)
      • 프로젝트 (13)
        • 끼니콩 (3)
        • 덕메랑 (3)
        • handDoc (7)
        • Haeil (0)
      • Java (9)
        • 클린코더스 (0)
      • Spring (30)
      • Redis (3)
      • CS (7)
        • 운영체제 (3)
        • 컴퓨터구조 (0)
        • 네트워크 (4)
      • DevOps (2)
      • 코딩테스트 (0)
      • Tech (14)
        • TDD (1)
        • 정리 (5)
        • 우테코 (0)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    STT
    jira
    git
    coderabbit
    지라
    자바
    Network
    AI
    도커
    java
    TDD
    MongoDB
    스프링
    파인튜닝
    redis
    깃
    promtail
    Spring
    코드레빗
    docker
    레디스
    CoolSMS
    스프링부트
    운영체제
    OS
    몽고디비
    깃허브
    네트워크
    springboot
    github
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
erika0915
[Spring] 서블릿(Servlet)과 서블릿 컨테이너

티스토리툴바