본문 바로가기
Web

[Web] Servlet과 Servlet Container

by 홍홍_ 2022. 8. 2.

Servlet?

  1. 동적 웹 페이지를 만들 때 사용되는 자바기반 웹 프로그래밍 기술
  2. Java EE의 표준 중 하나로 javax.servlet package를 기반으로 server에 동작하는 class
  3. 클라이언트의 요청과 응답의 흐름을 체계적으로 다룰 수 있게 해주는 기술

Servlet의 동작 방식

  1. Client가 URL을 입력 하면 HttpRequest가 요청을 Servlet Container에게 전송
  2. 받은 요청을 Servlet Container는 HttpRequest, HttpResponse 객체를 생성
  3. Client가 요청한 URL에 해당하는 서블렛을 찾는다
  4. service() 메서드를 호출 후 get, post에 따라 doGet(), doPost()를 호출
  5. 동적 페이지 생성 후 HttpServletResponse 객체에 응답
  6. 응답 후 객체 소멸

Servlet lifecycle

  1. Servlet Container가 Request를 받은 후 클래스 로더가 Servlet 클래스를 로드합니다.
  2. Servlet 클래스 로드 후, Servlet Container가 Servlet 클래스의 인스턴스 생성.
  3. Servlet 클래스 인스턴스 화 후 init() 메서드 호출하여 Servlet을 초기화
  4. service() 메서드 호출, 요청 및 응답을 처리
  5. destroy() 메서드 호출하여 객체와의 연결 끊기

Servlet method

  • init() : init method는 Servlet 생성 시에 호출, Servlet Container가 해당 Servlet을 생성 후, 최초 1회 호출하여 초기화한다. Servlet은 SingleTon으로 관리,그러므로 한번 더 호출 시 생성된 인스턴스를 호출한다.
    SingleTon(싱글톤 패턴) : 생성자가 여러 차례 호출이 되더라도 최초에 하나의 인스턴스만 생성, 이후 호출된 생성자는 최초의 인스턴스를 리턴한다.

  • service() : 요청을 받고 응답을 보내줄 때 필요한 메서드, Servlet interface를 구현하여, HttpServlet 클래스의 doGet, doPost 같은 메서드들이 호출됩니다.

  • destroy() : 주기적으로 Servlet Container가 destroy 메서드를 호출, 또는 서비스 종료시 호출, destroy() 메소드는 인스턴스화한 객체를 없애는 것이 아니라, 연결을 끊는다가 정확하다.연결을 끊고 그 후에 garbage collector의 제거 대상이 되어 없어진다. 이 경우, 해당 Servlet의 service() 메서드들을 사용하는 모든 스레드가 종료된 후, 이 Servlet 클래스를 다시 사용하려면 새로 init()메서드를 이용하여 초기화 하는 작업이 필요하다.


Servlet Container(=Web Container)?

서블릿의 생성, 실행, 파괴 등 관리를 담당


Servlet Container의 역할

  1. 웹 서버와 통신 지원
  • 서블릿 컨테이너는 서블릿과 웹 웹서버 간에 요청과 응답, 즉 통신을 할 수 있도록 소켓을 만들어준다.
  1. 서블릿 생명주기 관리
  • 서블릿 클래스 로딩, 인스턴스 화
  • 초기화 메서드를 호출
  • 요청이 들어오면 적절한 서블릿 메서드를 호출한다.
  • 서블릿 소멸 시 Garbage Collection(jvm)의 대상이 되게 한다.
  1. 멀티 스레드 지원 및 관리
  • 서블릿 컨테이너는 요청이 올 때마다 새로운 자바 스레드를 생성하여 처리

  • HTTP 서비스 메소드를 실행 후, 스레드는 다시 스레드 풀로 반납된다.

  1. 선언적인 보안 관리
  • 개발자는 보안에 관련된 내용을 구현해두지 않아도 된다.

  • xml로 관리


ServletContainer의 요청 처리 과정

  1. 클라이언트가 보낸 요청을 웹 서버가 받습니다.
  2. 웹서버는 요청을 서블릿 컨테이너로 전달합니다.
  3. 요청을 처리할 해당 서블릿이 컨테이너에 없다면, 서블릿을 동적으로 검색 후 주소 공간에 로드합니다.
  4. 컨테이너가 서블릿의 init() 메소드를 호출하면, 서블릿을 초기화 합니다.
  5. 컨테이너가 서블릿의 service() 메소드를 호출하여 HTTP 요청을 처리한다.
    (요청의 데이터를 읽고, 응답을 만들어낸다)
  6. 서블릿은 컨테이너 주소에 남아있고, 다른 HTTP 요청들을 처리할 수 있습니다.
  7. 웹서버는 동적으로 생성된 결과를 올바른 위치에 반환한다.

댓글