서블릿 라이프사이클

1.
클라이언트의 첫 번째 요청 시 OR 컨테이너가 시작될 때 생성
위의 두 가지 선택지는 컨테이너 속성 값으로 설정

2.
첫 번째의 클라이언트 요청에 대해서만 객체가 생성
   - 서블릿 객체 생성
   - init() 메소드 호출되어 서블릿에 필요한 초기화 작업을 수행
            -init()메소드에서는 서블릿 전체에서 공유되는 자원을 생성

두 번째 부터는 각 클라이언트 마다 스레드를 생성하여 요청 처리
    - 두 번째 요청 시 부터 service() 메소드 호출
    - 요청당 한개의 service() 메소드 호출

컨테이너에서는 service 메소드를 호출하기 전
HttpServletRequest 객체와 HttpServlet Response 객체를 생성하여
service 메소드 파라미터로 전송한다.
    - 클라이언트 요청이 GET방식이면 doGet() 메소드를 호출하고,
    - 클라이언트가 POST 방식이면 doPost() 메소드를 호출한다


 

service() 메서드는 재정의 하지 않는다

 

3. 
컨테이너가 종료될 때 서블릿 객체는 소멸

동작

Client ------------> Server ------------------------------> Container---------------------->Servlet
        1) 1번요청         2) 요청 url 분석 후 서블릿 결정                3) 서블릿 객체 생성
                                                                                       4) init 메소드 호출
                                                                                       5) service 메소드 호출
                                                                                       6) doGet 이나

                                                                                          doPost 메소드 호출
                                                                                       7) destroy 메소드 호출

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//서블릿 클래스를 정의한다. 서블릿 클래스를 정의할 때는 HttpServlet 클래스를 상속한다
public class ServletLifeCycle extends HttpServlet {
	private static final long serialVersionUID = 1L;
	//생성자를 정의한 부분이다. 이 부분은 첫 번째 클라이언트 요청이 들어올 때 실행된다.
	public ServletLifeCycle () 
	{
		super();
		System.out.println("Constructor");
	}
	
	//init 메소드를 재정의한 부분이다. 이 메소드는 첫 번째 요청이 들어올 때만 호출된다.
    //두 번째 요청부터는 호출 되지 않는다.
	@Override
	public void init(ServletConfig config) throws ServletException 
	{		
		super.init(config);
		System.out.println("init");
	}
	
	//service 메소드를 정의한 부분이다. 이 메소드는 클라이언트의 요청이 들어올 때 마다 반복적으로 호출되면서 각 클라이언트의 요청을 처리한다.
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
	{
		
		System.out.println("service");
		super.service(request, response);
	}
	//doGet 메소드를 정의한 부분이다. 이 메소드는 클라이언트의 요청이 들어올 때 마다 반복적으로 호출되면서 각 클라이언트의 요청을 처리한다.
	protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
	{
		System.out.println("doGet");
	}
	//doPost 메소드를 정의한 부분이다. 이 메소드는 클라이언트가 post 방식으로 요청을 하면 호출된다.
	protected void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		System.out.println("doPost");
	}
	//destroy() 메소드를 정의한 부분이다. 서블릿 인스턴스가 소멸되기 직전에 단 한번만 호출되는 메소드이다. 톰캣 서비스를 중지하면 실행된다.
	@Override
	public void destroy()
	{
		System.out.println("destroy");
		super.destroy();
	}
}