JSP, Servlet

Servlet의 생명주기

엥이게되네 2023. 8. 8. 13:16
728x90

서블릿의 생명주기 

 

서블릿의 생명주기는 서블릿 컨테이너가 관리한다. 서블릿 컨테이너는 웹 애플리케이션 서버와 서블릿 실행환경을 제공한다. 종류로는 Tomcat, Jetty, IBM WebSphere, Oracle WebLogic Server, GlassFish 등이 있다.

 

서블릿의 생명주기는 로딩(Loading) - 초기화(Initialization) - 서비스(Service) - 소멸(Destruction) 순으로 실행된다.

 

1. 로딩(Loading) : 웹 애플리케이션의 시작 시점에서 서블릿 컨테이너가 web.xml 파일이나 애노테이션을 통해 설정된 서블릿들을 로딩한다. 이때 각 서블릿 클래스의 인스턴스를 생성하고, init 메서드를 호출하여 초기화 작업을 수행한다.

 

2. 초기화(Initialization) : init 메서드는 서블릿 인스턴스가 생성될 때 호출된다. 서블릿 초기화 시 필요한 설정 작업이나 리소스 로딩과 같은 작업을 이 단계에서 수행할 수 있다. 이 메서드를 오버라이딩하여 초기화 로직을 구현한다.

 

3. 서비스(Service) : 웹 애플리케이션이 실행 중일 때, 클라이언트의 요청이 들어올 때마다 service 메서드가 호출된다. 이 메서드는 각 요청에 따라 서블릿이 작업을 처리하는 로직을 구현하는 곳이다. 실제로 요청에 대한 처리는 doGet, doPost, doPut 등의 메서드 내에서 이루어진다.

 

4. 소멸(Destruction) : 웹 애플리케이션 종료 시점에서 서블릿 컨테이너는 각 서블릿의 destroy 메서드를 호출하여 서블릿의 인스턴스를 소멸시킨다. 이 단계에서는 서블릿이 사용한 리소스를 정리하거나 마무리 작업을 수행한다.

 


서블릿 생명주기 메서드

 

서블릿 생명주기 메서드는 웹 애플리케이션의 시작부터 종료까지 서블릿의 상태 변화와 관련된 작업을 관리하는 데 사용됩니다. 개별적인 요청마다 service 메서드가 호출되어 클라이언트의 요청을 처리하게 되며, 이 과정에서 필요한 초기화나 정리 작업은 init 및 destroy 메서드에서 수행됩니다. getServletConfig와 getServletInfo는 추가적인 정보를 제공하기 위해 사용됩니다.

 

init(ServletConfig config) : 서블릿 인스턴스가 처음 생성될 때 호출된다. 서블릿 초기화 시 필요한 작업을 수행하는데 사용된다. ServletConfig 객체는 서블릿의 환경 설정 정보를 포함한다.

 

service(ServletRequest request, ServletResponse response) : 클라이언트의 요청이 들어올 때마다 호출되며, 실제로 서블릿이 클라이언트의 요청을 처리하는 로직을 구현한다. 이 메서드 내에서 요청에 따라 doGet, doPost, doPut 등의 메서드가 호출되어 작업을 수행한다.

 

destroy() : 서블릿 인스턴스가 소멸될 때 호출되는 메서드로, 서블릿에서 사용한 리소스를 정리하거나 마무리 작업을 수행하는 데 사용된다.

 

getServletConfig() : 현재 서블릿의 설정 정보를 담고 있는 ServletConfig 객체를 반환한다. init 메서드에서 전달받은 ServletConfig 객체를 반환한다.

 

getServletInfo() : 서블릿의 정보를 나타내는 문자열을 반환한다. 이 문자열은 보통 서블릿의 버전이나 설명을 담고 있다.

 


서블릿 생명주기 예제 코드

import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/ex01/first")
public class Servlet01 implements Servlet {

  ServletConfig config;

  public Servlet01() {
    System.out.println("Servlet01()");
  }

  @Override
  public void init(ServletConfig config) throws ServletException {
    // 서블릿 객체를 생성한 후 생성자 다음에 이 메서드가 호출된다.
    // => 서블릿을 실행할 때 사용할 자원을 이 메서드에서 준비한다.
    // => 파라미터로 받은 ServletConfig 객체는 인스턴스 변수에 보관해 두었다가 필요할 때 사용한다.
    // => 각각의 서블릿 클래스마다 객체는 한 개만 생성된다.
    // => 따라서 각 서블릿에 대해 init()는 한 번만 호출된다.
    this.config = config;
    System.out.println("Servlet01.init(ServletConfig)");
  }

  @Override
  public void service(ServletRequest req, ServletResponse res)
      throws ServletException, IOException {
    HttpServletRequest req2 = (HttpServletRequest) req;
    HttpServletResponse res2 = (HttpServletResponse) res;
    // 클라이언트가 이 서블릿의 실행을 요청할 때마다 호출된다.
    // 클라이언트가 요청한 작업을 수행한다.
    System.out.println("Servlet01.service(ServletRequest,ServletResponse)");
  }

  @Override
  public void destroy() {
    // 웹 애플리케이션을 종료할 때(서버 종료 포함) 호출된다.
    // => 이 서블릿이 만든 자원을 해제하는 코드를 이 메서드에 둔다.
    System.out.println("Servlet01.destroy()");
  }

  @Override
  public ServletConfig getServletConfig() {
    // 서블릿에서 작업을 수행하는 중에 서블릿 관련 설정 정보를 꺼낼 때 이 메서드를 호출한다.
    // 이 메서드가 리턴하는 값이 ServletConfig 객체인데
    // 이 객체를 이용하면 서블릿 설정 정보를 알 수 있다.
    // 보통 init()의 파라미터 값을 리턴한다.
    System.out.println("Servlet01.getServletConfig()");
    return this.config;
  }

  @Override
  public String getServletInfo() {
    // 서블릿 컨테이너가 관리자 화면을 출력할 때 이 메서드를 호출한다.
    // 이 메서드의 리턴 값은 서블릿을 소개하는 간단한 문자열이다.
    System.out.println("Servlet01.getServletInfo()");
    return "Servlet01";
  }

}
728x90