CS/Spring
서블릿(Servlet)
leah-only
2025. 4. 29. 19:09
🚍 Servlet
서블릿은 웹 서버에서 동작하는 프로그램이다.
쉽게 말하면, 사용자의 HTTP 요청(Request)를 받아서 처리하고 HTTP 응답(Response)을 만들어주는 자바 클래스이다.
HTTP 요청, 응답의 흐름
HTTP 요청 시, WAS는 Request, Response 객체를 새로 만들어 서블릿에게 넘김
개발자는 Request 객체에서 HTTP 요청 정보를 꺼내서 사용
개발자는 Response 객체에 HTTP 응답 정보를 입력
WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성
⚙️ Servlet 환경 구성
Annotation
- @ServletComponentScan
- 서블릿 자동 등록
- @WebServlet
- 서블릿 annotation
- name : 서블릿 이름
- urlPatterns : URL 매핑
서블릿 특징
- urlPattern(/hello)의 URL이 호출되면 서블릿 코드가 실행
- HTTP 요청 정보를 편리하게 사용할 수 있는 HttpServletRequest
- HTTP 응답 정보를 편리하게 제공할 수 있는 HttpServletResponse
🪣서블릿 컨테이너
tomcat 처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.
서블릿 객체 생성, 초기화, 호출, 종료하는 생명주기를 관리한다.
서블릿 객체는 singleton으로 관리한다.
- 요청이 들어올 때마다 새로운 서블릿 객체를 만드는 것이 아니라, 최초 로딩 시 생성한다.
- 서블릿 객체를 미리 만들어 두고 재활용
- 장점 : 메모리 절약, 성능 향상
- 주의할 점
- 여러 스레드(요청)가 동시에 하나의 서블릿 객체를 공유하기 때문에 공유 변수를 잘못 사용하면 동시성 문제가 발생할 수 있다. (ex. 어떤 요청이 값을 바꿔버리면 다른 요청에도 영향을 줄 수 있음)
- WAS(서블릿 컨테이너) 종료시 destory() 호출을 통 함께 종료
동시 요청을 위한 멀티스레드 처리 지원
🧵스레드 (Thread)
- 자바 프로그램은 스레드가 없으면 실행할 수 없다.
- 애플리케이션 코드는 스레드가 명령어를 하나하나 순차적으로 실행한다.
- main() 메서드가 실행될 때 JVM은 자동으로 main 스레드를 생성한다.
- 서블릿 호출도 결국 WAS(Tomcat)가 만들어준 스레드가 호출한다.
🧵단일 요청 - 하나의 스레드 사용
- 사용자가 HTTP 요청을 보낸다.
- WAS가 하나의 스레드를 할당해서 서블릿을 호출한다.
- 서블릿이 요청을 처리하고 응답을 돌려준다.
- 요청/응답이 끝나면 스레드는 다시 풀(pool)로 반납하거나 휴식 상태로 돌아간다.
🧵다중 요청 - 스레드 하나로 처리하면?
- 여러 요청이 동시에 들어오는데 스레드가 하나만 있다면
- 요청 하나를 처리하는 동안 다른 요청을 무조건 대기해야 한다.
- 이는 병목 현상 발생, 처리 지연 발생 할 수 있다.
🧵요청마다 스레드 생성
- 요청이 들어올 때마다 새로운 스레드를 생성해서 요청을 처리할 수 있다.
- 장점
- 여러 요청을 동시에 처리할 수 있다.
- CPU, 메모리 리소드 한도 내에서는 효율적이다.
- 단점
- 스레드를 생성할 때마다 비용(context switching)이 발생한다.
- 너무 많은 스레드 생성 → 서버 리소스 초과 → 서버 다운 위험
🧵스레드 풀 (Thread Pool)
- 요청마다 스레드 생성의 단점을 보완한다.
- WAS는 스레드 풀로 관리한다.
- 미리 스레드를 일정 수량 만들어놓고 요청이 오면 풀에서 꺼내 사용한다.
- 요청이 끝나면 스레드를 반납해서 다시 사용 가능하게 만든다.
Tomcat 기본 설정
- 기본 최대 스레드 수 : 200개 (maxThreads="200")
- 초과하는 요청은(최대 스레드가 모두 사용중이고 스레드 풀에 스레드가 없다면)
- 바로 거절하거나
- 기다리게 하고, 일정 숫자까지 대기하도록 설정 가능
장점
- 스레드 생성/삭제 비용을 아낄 수 있다. (빠른 응답 가능)
- 서버 리소스를 효율적으로 관리할 수 있다.