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 스펙을 편리하게 사용할 수 있음

  • 1

Servlet Container(서블릿 컨테이너)

  • 서블릿을 지원하는 WAS e.x) 톰캣
  • 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기 관리
  • 서블릿 객체는 싱글톤으로 관리
    • 클라이언트의 요청마다 객체 생성은 비효율
    • 최초 로딩 시점에 서블릿 객체를 생성하고, 이를 재활용
    • 모든 클라이언트 요청은 동일한 서블릿 객체 인스턴스에 접근
    • 따라서 공유 변수 사용 주의
  • JSP도 서블릿으로 변환 되어서 사용
  • 동시 요청을 위한 멀티 쓰레드 처리 지원
  • 2
  • 쓰레드 풀
    • 특징
      • 필요한 쓰레드를 쓰레드 풀에 보관하고 관리
      • 쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리한다(톰캣은 최대 200개 기본 설정, 변경 가능함)
    • 사용
      • 쓰레드가 필요하면, 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내서 사용
      • 사용을 종료하면 쓰레드 풀에 해당 쓰레드 반납
      • 모든 쓰레드가 사용중이면?
        • 기다리는 요청을 거절하거나, 특정 숫자만큼 대기하도록 설정 가능
    • 장점
      • 쓰레드가 미리 생성되어 있으므로, 쓰레드를 매번 생성하고 종료하는 비용이 절약, 응답 시간이 빠름
      • 생성 가능한 쓰레드의 최대치가 있으므로, 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리 가능(죽지 않음)
    • 쓰레드 풀을 사용 안하면?
      • 쓰레드 생성 비용이 계속 발생(응답 속도 지연)
      • 고객 요청이 많아질 경우 CPU, 메모리 임계점을 넘어서 서버가 죽을 수 있음

실무 팁

  • WAS의 주요 튜닝 포인트는 최대 쓰레드(max thread)의 수
  • 최대 쓰레드(max thread) 값을 너무 낮게 설정하면?
    • 동시 요청이 많아질 때, 서버 리소스는 여유롭지만 클라이언트 응답이 지연됨
  • 최대 쓰레드(max thread)이 값을 너무 높게 설정하면?
    • 동시 요청이 많아질 때, CPU, 메모리 리소스 임계점 초과로 서버 다운 가능
  • 장애 발생시?
    • 클라우드 사용중이면 일단 서버부터 늘리고, 이후 튜닝
    • 클라우드 사용 안하면 열심히 튜닝..ㄲㄲ
  • 쓰레드 풀의 적정 숫자 튜닝 방법
    • 애플리케이션 로직의 복잡도, CPU, 메모리, IO 리소스 상황에 따라 모두 다름
    • 성능 테스트
      • 최대한 실제 서비스와 유사하게 성능 테스트
      • 아파치 ab, 제이미터, nGrinder

  • 정리
    • WAS의 멀티 쓰레드 지원
      • 멀티 스레드에 대한 부분은 WAS가 처리해줌
      • 개발자가 멀티 쓰레드 관련 코드를 신경쓰지 않아도 됨(쓰레드 세이프 말고..)
      • 싱글 쓰레드 프로그래밍 하듯 편리하게 개발 가능
      • 멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)는 주의해서 사용해야 함(쓰레드 세이프를 항상 염두)

서블릿 분석

  • 위에서 예제로 작성한 소스코드를 실행해보면?
  • 3
  • 서블릿에 HttpServletRequest, HttpServletResponse 두 개가 파라미터로 전달됨
  • 실제 실행을 해보면 이 두 파라미터는 아래의 구현체로 전달되는데
  • 4
  • Apache에서 구현한 구현체가 전달됨
  • 즉 서블릿 표준 스택(인터페이스)을 WAS들이 구현한 것





© 2020.02. by blupine