[Servlet] Servlet 동작과정 / 라이프사이클
Servlet 동작 과정
클라이언트의 URL 요청
▶
HTTP 요청 처리 위한 HttpServletRequest / HttpServletResponse 객체 생성
▶
요청된 서블릿 파일이 있는지 체크
▶
실행된 적 있다면 기존 인스턴스에 스레드 생성 / 처음 실행되는 것이라면 인스턴스 생성 후 init() 호출, 초기화 후 스레드 생성
▶
Get/Post 방식에 따라 doGet() 또는 doPost() 호출
▶
doGet()/doPost() 호출로 생성된 동적 웹 페이지 결과물은 HttpServletResponse 객체에 담김
▶
HttpServletResponse 객체를 서블릿 컨테이너에서 HTTP 형태로 바꾸어 웹서버로 전송
▶
HttpServletRequest / HttpServletResponse 객체의 메모리 소멸 및 스레드 종료
Servlet 라이프 사이클 (생명 주기)
Servlet 객체 생성 : 최초 한 번, 최초 요청 시 객체가 만들어져 메모리에 로딩, 이후 요청 시에는 기존의 객체를 재활용 -> 응답속도 및 동작속도 빠름
▶
Init() 호출 : 최초 한 번
▶
service() / doGet() / doPost() 호출 : 요청 시 마다
▶
destroy() 호출 : 마지막 한 번
- ex)
import java.io.IOException;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/ServletLifeCycle")
public class ServletLifeCycle extends HttpServlet {
private static final long serialVersionUID = 1L;
public ServletLifeCycle() {
System.out.println("생성자 호출");
}
@Override
public void init() throws ServletException {
System.out.println("init 메서드 호출");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet 메서드 호출");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost 메서드 호출");
}
@Override
public void destroy() {
System.out.println("destroy 메서드 호출");
}
@PostConstruct
private void initPostConstructor() {
System.out.println("선처리");
}
@PreDestroy
private void destroyPredestroy() {
System.out.println("후처리");
}
}
- 실행 결과
생성자 호출
선처리
init 메서드 호출
doGet 메서드 호출
doGet 메서드 호출
doGet 메서드 호출
...
destroy 메서드 호출
...
후처리
-
-
init() : 최초 한 번만 실행
-
주소표시줄에서 새로고침 시 doGet() 호출됨
-
doGet() / doPost() : 실행되면 서블릿 객체가 메모리에 로딩, 계속 재사용
-
PostConstruct / PreDestroy : 오버라이딩이 아닌 직접 메서드를 생성하는 것
-
PostConstruct 선처리, init() 호출 전에 실행됨
-
PreDestroy 후처리, destroy() 호출 후에 실행됨
-
-