웹 서버 (Web Server)
웹 서버는 HTTP 프로토콜을 이해하고, 요청/응답을 처리하는 서버 프로그램이다. 역할은 크게 2가지가 있다.
- 정적 파일 전송
- HTML, CSS, JS, 이미지, 동영상 같은 변하지 않는 파일
- 서버가 그냥 디스크를 읽어서 그대로 클라이언트(브라우저)에 보냄
- ex) index.html을 그대로 전송
- 동적 파일 전송
- 요청 시점에 코드를 실행해서 결과를 만들어 보내야 하는 경우
- 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 |
