-
[Spring] Spring MVC - 서블릿Study/Spring 2025. 4. 17. 20:56
서블릿
- HTTP 요청을 수신하고 데이터를 응답하는 역할 수행 (HTTP 요청/응답을 위한 처리를 대신 수행하는 것)
- 특징
- urlPatterns의 URL이 호출되면 서블릿 코드가 실행
- HttpServletRequest, HttpServletResponse 생성
HTTP 요청, 응답 흐름
- HTTP 요청 시 WAS는 Request와 Response 객체를 새로 만들어서 서블릿 컨테이너 내 서블릿 객체를 호출함
- 개발자는 Request 객체에서 HTTP 요청 정보를 꺼내서 사용
- 개발자는 Response 객체에 HTTP 응답 정보를 편리하게 입력
- WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성함
서블릿 컨테이너
- 서블릿 컨테이너 덕분에 서블릿 객체 생성 및 관리를 개발자가 수행하지 않아도 됨
- Tomcat 처럼 서블릿을 지원하는 WAS를 ‘서블릿 컨테이너’라고 함
- 서블릿 컨테이너는 서블릿 객체 생성, 초기화, 호출, 종료하는 생명주기를 관리함
- 서블릿 객체는 싱글톤으로 관리
- 요청이 올 때마다 계속 서블릿 객체를 생성하는 것은 비효율적임
- *Request, Response는 요청마다 생성하는게 맞음
- 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용함
- 모든 요청은 동일한 서블릿 객체에 접근함 (공유 변수 사용 주의)
- 서블릿 컨테이너 종료 시 함께 종료됨
- 요청이 올 때마다 계속 서블릿 객체를 생성하는 것은 비효율적임
- 동시 요청을 위한 멀티 스레드 처리를 지원함
동시 요청 - 멀티 스레드
스레드 풀
- WAS는 스레드 풀을 생성해 요청을 동시에 여러 개 처리함 (요청을 수행하는 것은 스레드)
- 특징
- 필요한 스레드를 스레드 풀에 보관하고 관리함
- 스레드 풀에 생성 가능한 스레드의 최대치를 관리함 (톰캣은 최대 200개 기본 설정)
- 사용
- 요청이 들어오면, 이미 생성되어 있는 스레드를 스레드 풀에서 꺼내 사용함
- 사용을 종료하면 스레드 풀에 해당 스레드를 반납함
- 최대 스레드가 모두 사용중이어서 스레드 풀에 스레드가 없으면?
- 기다리는 요청을 거절하거나 특정 숫자만큼만 대기하도록 설정할 수 있음
- 장점
- 스레드가 이미 생성되어 있으므로, 스레드를 생성하고 종료하는 CPU 비용이 절약되고, 응답 시간이 빠름
- 생성 가능한 스레드의 최대치가 있으므로 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리할 수 있음
- 실무 팁
- WAS의 주요 튜닝 포인트는 최대 스레드(max thread) 수
- 너무 낮게 설정하면?
- 동시 요청이 많으면, 서버 리소스는 여유롭지만, 클라이언트는 금방 응답 지연 상태가 됨
- 너무 높게 설정하면?
- 동시 요청이 많으면, CPU 및 메모리 리소스 임계점 초과로 서버 다운될 수 있음
- 어플리케이션의 로직의 복잡도, CPU, 메모리, IO 리소스 상황에 따라 모두 다름
- 너무 낮게 설정하면?
- WAS의 주요 튜닝 포인트는 최대 스레드(max thread) 수
WAS의 멀티 스레드 지원
- 멀티 스레드에 대한 부분은 WAS가 처리
- 개발자가 멀티 스레드 관련 코드를 신경쓰지 않아도 됨
- 멀티 스레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)는 thread-safe 하도록 주의해서 사용
참고
'Study > Spring' 카테고리의 다른 글
[Spring] Spring MVC - 필터, 인터셉터 (0) 2025.04.19 [Spring] Spring MVC - 구조 이해 및 기본 기능 (0) 2025.04.19 [Spring] 스프링 핵심 원리 - 빈 스코프 (0) 2025.04.17 [Spring] 스프링 핵심 원리 - 빈 생명주기 콜백 (0) 2025.04.16 [Spring] 스프링 핵심 원리 - 의존관계 자동 주입 (0) 2025.04.16