[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() 호출 후에 실행됨

Categories:

JSP/Servlet