Java

Java의 Servlet Container

정의

스스로 동작하지 않는 서블릿을 관리해주는 컨테이너
요청을 올바른 서블릿에 전달해서 처리

목적 및 특징

클라이언트의 요청을 받고 응답 할 수 있도록 웹 서버와 소켓으로 통신하는 것
  1. 웹서버와의 통신 지원
  • 서블릿 컨테이너는 서블릿과 웹서버가 손쉽게 통신할 수 있게 해주어, 소켓을 만들고 listen, accept 등을 API로 제공하여 복잡한 과정을 생략할 수 있게 해준다.
  1. 서블릿 생명주기(Life Cycle) 관리
  • 서블릿 컨테이너는 서블릿의 생성과 소멸을 관리
    • 서블릿 클래스를 로딩하여 인스턴스화
    • 초기화 메소드를 호출
    • 요청이 들어오면 적절한 서블릿 메소드를 호출
    • 서블릿 소멸 시 Garbage Collection(가비지 컬렉션)을 진행
  1. 멀티쓰레드 지원 및 관리
  • 서블릿 컨테이너는 요청이 올 때 마다 새로운 자바 쓰레드를 하나 생성
  • HTTP 서비스 메소드를 실행하고 나면, 쓰레드는 자동으로 소멸
  • 서버가 다중 쓰레드를 생성 및 운영해주니 쓰레드의 안정성에 대해서 걱정하지 않아도 된다.

장점

  • HTTP 요청, 응답 / 자원 / 멀티쓰레드 신경쓰지 않고
    • 개발자는 비즈니스 로직에만 집중

주의할 점

  • 서블릿 하나로 다수 요청을 멀티 쓰레드 처리
    • 서블릿으로 웹 서버를 구현할 때, 상태를 두면 안된다. (동시성 문제)
    • 상태는 클래스 파일의 인스턴스 변수나 static 변수와 같은 것들이며, 이를 서블릿에서는 작성하면 안된다. (Thread-safe class로 작성해야한다.)
      • 서블릿은 상태를 공유하기 때문에 위 변수들은 공유가 된다.
    • 따라서 이 상태들에 다른 사용자에게 보여주면 안되는 정보를 담고있다고 하면 큰 문제가 될 수 있다.

예시

Tomcat

면접 질문

  • Servlet Container 목적 및 특징
  • 서블릿을 사용하여 웹 서버를 구현할 때, 주의해야할 사항
    • 서블릿 컨테이너는 요청이 올 때 마다 새로운 자바 쓰레드를 하나 생성
    • 따라서 다중 쓰레드를 생성 및 운영해주니 쓰레드의 안정성에 대해서 걱정하지 않아도 되지만
    • 인스턴스 변수나 static 변수와 같은 상태들을 서블릿에 작성하면 안된다.
  • Servlet Container가 진행하는 서블릿 생명 주기 관리 간단히 설명
    • 서블릿 컨테이너는 서블릿의 생성과 소멸을 관리
      • 서블릿 클래스를 로딩하여 인스턴스화
      • 초기화 메소드를 호출
      • 요청이 들어오면 적절한 서블릿 메소드를 호출
      • 서블릿 소멸 시 Garbage Collection(가비지 컬렉션)을 진행
  • Servlet Container의 동작방식을 개략적으로 설명
    • 사용자가 URL을 입력하면 HTTP RequestServlet Container로 전송
    • 요청을 전송받은 Servlet Container 는 HttpRequest, HttpResponse 객체를 생성
    • 사용자가 요청한 URL이 어느 서블릿에 대한 요청인지 찾는다.
    • service 메서드를 호출한 후 클라이언트의 GET, POST 여부에 따라 doGet(), doPost()를 호출
    • 동적페이지를 생성한 후, HttpServletResponse 객체에 응답을 보낸다.
    • 응답 후, HttpServletRequest, HttpServletResponse 객체를 소멸