본 글은 victolee님의 포스팅을 보고 따라 학습하며 내용을 정리한 포스팅 입니다.
servlet 생명 주기 (Life Cycle)
- 클라이언트가 Servlet에 요청을 하면, Servlet은 바로 호출이 되지 않습니다. Servlet은 객체를 생성하고 초기화 작업을 거친 후, 요청을 처리하는 생명주기를 갖고 있습니다.
Servlet 생명주기
- 요청이 오면, Servlet 클래스가 로딩되어 요청에 대한 Servlet객체가 생성됩니다.
- init()
- 서블릿은 init()메소드를 호출하여 초기화 됩니다.
- service()
- 서블릿은 service() 메소드를 호출하여 클라이언트의 요청을 처리합니다.
- service() 메소드는 HTTP요청 유형(GET, POST, PUT, DELETE 등)에 따라 적절하게 doGet, doPost, doPut, doDelete 등의 메소드를 호출하여 요청을 처리합니다.
- destroy()
- 서블릿은 destroy() 메소드를 호출하여 종료됩니다.
- 마지막으로, 서블릿은 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의 생명 주기를 알아야 합니다.