Servlet(서블릿)이란?
Servlet(서블릿)이란?
- 서버에서 실행되면서 클라이언트의 요청에 따라 동적으로 서비스를 제공하는 자바 클래스(표준 스펙)
- 즉, 웹 서버에서 실행되는 작은 프로그램 단위
- HTTP 프로토콜 기반에서 확장된 CGI 방식의 서버 프로그래밍
- 서블릿 컨테이너에서 실행됨
- 스레드에서 실행됨
- HTTP 요청에 대해 특정 기능을 수행 + HTML 등의 형식으로 응답을 하는 프로그램
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) {
// 애플리케이션 로직 수행
// response에 응답 정보를 넣어서 반환
}
}
urlPatterns
의 URL이 호출되면 서블릿 코드가 실행됨- HTTP 요청 정보(스펙, 생성)를 편리하게 사용할 수 있는
HttpServletRequest
- HTTP 응답 정보(스펙, 생성)를 편리하게 사용할 수 있는
HttpServletResponse
서블릿을 이용해서 HTTP 스펙을 편리하게 사용할 수 있음
Servlet Container(서블릿 컨테이너)
- 서블릿을 지원하는 WAS e.x) 톰캣
- 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기 관리
- 서블릿 객체는
싱글톤
으로 관리- 클라이언트의 요청마다 객체 생성은 비효율
- 최초 로딩 시점에 서블릿 객체를 생성하고, 이를 재활용
- 모든 클라이언트 요청은 동일한 서블릿 객체 인스턴스에 접근
- 따라서 공유 변수 사용 주의
- JSP도 서블릿으로 변환 되어서 사용
- 동시 요청을 위한
멀티 쓰레드
처리 지원 - 쓰레드 풀
- 특징
- 필요한 쓰레드를 쓰레드 풀에 보관하고 관리
- 쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리한다(톰캣은 최대 200개 기본 설정, 변경 가능함)
- 사용
- 쓰레드가 필요하면, 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내서 사용
- 사용을 종료하면 쓰레드 풀에 해당 쓰레드 반납
- 모든 쓰레드가 사용중이면?
- 기다리는 요청을 거절하거나, 특정 숫자만큼 대기하도록 설정 가능
- 장점
- 쓰레드가 미리 생성되어 있으므로, 쓰레드를 매번 생성하고 종료하는 비용이 절약, 응답 시간이 빠름
- 생성 가능한 쓰레드의 최대치가 있으므로, 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리 가능(죽지 않음)
- 쓰레드 풀을 사용 안하면?
- 쓰레드 생성 비용이 계속 발생(응답 속도 지연)
- 고객 요청이 많아질 경우 CPU, 메모리 임계점을 넘어서 서버가 죽을 수 있음
- 특징
실무 팁
- WAS의 주요 튜닝 포인트는 최대 쓰레드(max thread)의 수
- 최대 쓰레드(max thread) 값을 너무 낮게 설정하면?
- 동시 요청이 많아질 때, 서버 리소스는 여유롭지만 클라이언트 응답이 지연됨
- 최대 쓰레드(max thread)이 값을 너무 높게 설정하면?
- 동시 요청이 많아질 때, CPU, 메모리 리소스 임계점 초과로 서버 다운 가능
- 장애 발생시?
- 클라우드 사용중이면 일단 서버부터 늘리고, 이후 튜닝
- 클라우드 사용 안하면 열심히 튜닝..ㄲㄲ
- 쓰레드 풀의 적정 숫자 튜닝 방법
- 애플리케이션 로직의 복잡도, CPU, 메모리, IO 리소스 상황에 따라 모두 다름
- 성능 테스트
- 최대한 실제 서비스와 유사하게 성능 테스트
아파치 ab
,제이미터
,nGrinder
- 정리
- WAS의 멀티 쓰레드 지원
- 멀티 스레드에 대한 부분은 WAS가 처리해줌
- 개발자가 멀티 쓰레드 관련 코드를 신경쓰지 않아도 됨(쓰레드 세이프 말고..)
- 싱글 쓰레드 프로그래밍 하듯 편리하게 개발 가능
- 멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)는 주의해서 사용해야 함(쓰레드 세이프를 항상 염두)
- WAS의 멀티 쓰레드 지원
서블릿 분석
- 위에서 예제로 작성한 소스코드를 실행해보면?
- 서블릿에
HttpServletRequest
,HttpServletResponse
두 개가 파라미터로 전달됨 - 실제 실행을 해보면 이 두 파라미터는 아래의 구현체로 전달되는데
Apache
에서 구현한 구현체가 전달됨- 즉 서블릿 표준 스택(인터페이스)을
WAS
들이 구현한 것