심심한 개발자의 취미생활

본 글은 victolee님의 포스팅을 보고 따라 학습하며 내용을 정리한 포스팅 입니다.

servlet 생명 주기 (Life Cycle)

  • 클라이언트가 Servlet에 요청을 하면, Servlet은 바로 호출이 되지 않습니다. Servlet은 객체를 생성하고 초기화 작업을 거친 후, 요청을 처리하는 생명주기를 갖고 있습니다.

Servlet 생명주기

  1. 요청이 오면, Servlet 클래스가 로딩되어 요청에 대한 Servlet객체가 생성됩니다.
  2. init()
    • 서블릿은 init()메소드를 호출하여 초기화 됩니다.
  3. service()
    • 서블릿은 service() 메소드를 호출하여 클라이언트의 요청을 처리합니다.
    • service() 메소드는 HTTP요청 유형(GET, POST, PUT, DELETE 등)에 따라 적절하게 doGet, doPost, doPut, doDelete 등의 메소드를 호출하여 요청을 처리합니다.
  4. destroy()
    • 서블릿은 destroy() 메소드를 호출하여 종료됩니다.
  5. 마지막으로, 서블릿은 JVM의 가비지 컬렉터에 의해 가비지 수집됩니다.

LifeCycleServlet.java

@WebServlet("/lifeCycle")
public class LifeCycleServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public void init(ServletConfig config) throws ServletException {
        System.out.println("init called");
        super.init();
    }

    public void destroy() {
        System.out.println("destroy called");
        super.destroy();
    }

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("service called");
        super.service(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet called");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doPost called");
    }
}
  • localhost:8080/projectNM/lifeCycle 요청 결과
    • init called
    • service called
    • doGet called (doPost called)
  • 새로고침 요청 결과
    • service called
    • doGet called (doPost called)
  • 한 번 Servlet 객체가 생성되었기 때문에, Servlet객체는 메모리에 저장되어 있습니다. 그래서 새로고침시에는 init()메서드를 호출하지 않고, 곧바로 service() 메서드를 호출합니다.
  • 톰캣과 같은 WAS는 자원을 효율적으로 사용할 수 있도록 관리를 해주지만, 개발자 역시 같은 작업을 한 번에 처리할 수 있도록 하는 노력이 필요합니다. 그러기 위해서는 Servlet의 생명 주기를 알아야 합니다.