Servlet은 Lifecycle이라는 것이 있다. 일단 Servlet의 작동 순서를 살펴보자.
Servlet은 웹브라우저, 웹서버, WAS를 거쳐 Servlet 컨테이너에서 실행된다. 이런 과정 속에서 Servlet 컨테이너는 객체를 스레드를 생성하고 Servlet객체를 생성해주는 것이다. Servlet은 Servlet의 사용도가 높은 이유는 빠른 응답 속도 때문이다. Servlet은 최초 요청 시 객체가 만들어져 메모리에 로딩되고, 이후 요청 시에는 기존의 객체를 재활용하게 됩니다. 따라서 동작 속도가 빠르다. Lifecycle을 살펴보자.
처음 객체를 생성하고 Init()메소드를 호출하는데 이것은 최초 한번만 실행된다. 그 다음 doget이나 doPost등은 요청이 왔을 때 마다 처리해주는 것이다. 그리고 마지막에 destroy()로 지워주는 것이다.
그리고 객체생성과 Init()호출 사이에 @PostConstruct로 선처리를 해줄 수 있다. 마찬가지로 destroy()가 끝난 뒤 @PreDestory로 후처리를 해줄 수 있다.
예제를 보자.
package com.javalec.ex;
import java.io.IOException;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class LifeCycleEx
*/
@WebServlet("/LifeCycleEx")
public class LifeCycleEx extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LifeCycleEx() {
super();
}
@Override
public void init() throws ServletException {
System.out.println("init");
}
@Override
public void destroy() {
System.out.println("destroy");
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost");
}
@PostConstruct
private void initPostConstruct() {
System.out.println("initPostConstruct");
}
@PreDestroy 또한 init()과 객체 생성사이, destroy() 후에 처리를 해주는 작업들이다.
실행 시 출력
private void destoryPreDestory() {
System.out.println("destoryPreDestory");
}
}
init()메소드와 destroy()메소드의 출력문은 각각 처음 최초 실행됐을 때, 마지막 종료 되었을 때 나타난다. @PostConstruct, @PreDestroy 또한 init()과 객체 생성사이, destroy() 후에 처리를 해주는 작업들이다.
실행 시 출력
initPostConstruct
init
doget
destroy
destoryPreDestory
이 순서대로 출력되는 것을 볼 수 있다. destroy와 @PreDestroy는 서버를 끄면 실행되는 것이다. 정말 생명주기같은 웹서버의 동작 과정을 볼 수 있다.
간단하게 웹서버의 라이프사이클을 알아보았다.