Post

서블릿과 서블릿 컨테이너

서블릿(Servlet) 은

Java 언어로 웹 애플리케이션을 개발할 때 동적인 웹 페이지를 생성하기 위해 사용되는 자바 클래스이다.

서블릿 컨테이너(Servlet Container) 는

서블릿 기술을 사용하는 웹 컨테이너 (Web Container) 를 말한다.

서블릿의 생명주기를 관리하고, 서블릿의 요청과 응답을 처리하는 역할을 한다.

서블릿 컨테이너를 사용하지 않으면 서버 개발자는
(1) 클라이언트의 HTTP 요청을 읽어서 확인하고
(2) 비즈니스 로직을 처리한 후
(3) HTTP 응답을 생성하고 클라이언트에게 전달하는 일을 직접 해야한다.

서블릿 컨테이너는 기본적으로 서블릿을 싱글톤으로 관리하여서 클라이언트의 여러 요청이 같은 서블릿 객체에 접근하는 경우도 있다.

서블릿 객체는 클라이언트의 요청이 왔을 때 생성할 수도 있고, 서버가 실행될 때 생성할 수도 있다. 이것은 서버의 설정에 따라 다르다.

Workflow

  1. 클라이언트로부터 요청이 오면 웹서버는 해당 요청이 동적인 콘텐츠를 생성해야하는 경우 서블릿 컨테이너로 요청을 전달한다.
  2. 서블릿 컨테이너는 요청을 처리하기 위한 적절한 서블릿을 찾고 request, response 객체를 생성하여 서블릿 객체에게 전달한 후 서블릿을 실행한다.
  3. 실행된 서블릿이 처리한 결과는 서블릿 컨테이너로 전달되어서 웹서버를 통해 클라이언트로 전달된다.

서블릿과 쓰레드

서블릿 컨테이너는 서블릿을 실행하기 위해 하나의 쓰레드를 사용하는데, 매 요청마다 쓰레드를 생성하는 것은 단점이 있다.

  1. 쓰레드 생성 비용이 매우 비싸다.
  2. 컨텍스트 스위칭 비용이 발생한다.

    쓰레드 컨텍스트 스위칭 = 코어가 한 쓰레드를 처리하고 다음 쓰레드로 전환하는 것

  3. 쓰레드 생성에 제한이 없어서 CPU나 메모리 임계점이 넘으면 서버가 다운된다.

그래서 쓰레드 풀이라는 것으로 일정 갯수의 쓰레드를 미리 생성해놓고, 요청이 오면 쓰레드 풀에서 쓰레드를 하나씩 꺼내서 사용하고 반납하는 식으로 운영한다.

만약 쓰레드 풀에서 꺼낼 쓰레드가 없다면 대기하거나 요청을 거절한다.

적정 쓰레드의 수

그럼 적정 쓰레드의 수는 어떻게 산정할 수 있을까?

적정 쓰레드의 수는 애플리케이션 로직의 복잡도, CPU, 메모리, IO 리소스 상황에 따라 모두 다르기 때문에 부하테스트를 진행해 산정해야한다..

부하테스트 프로그램 : Apache ab, JMeter, nGrinder

This post is licensed under CC BY 4.0 by the author.