본문 바로가기

Backend/JSP & Servlet

[JSP & Servlet] Servlet 의 실행과정

728x90

* Container

 

컨테이너는 웹서버와 서블릿 사이의 통신을 지원한다.

컨테이너는 서브릿의 생명주기를 관리한다.

컨테이너는 새로운 요청이 들어올 때마다 스레드를 생성하여 사용자의 요청을 처리한다.

 

* Servlet 이 실행되는 방식

 

1) 사용자가 url을 호출하여 컨테이너에 새로운 요청을 한다.

2) 컨테이너가 요청을 접수하여 HttpServletRequest request 객체 / HttpServletResponse response 객체를 생성

3) 접수된 url을 분석하여 해당 서블릿 객체를 생성

 - 서블릿 객체가 생성되면서 서블릿에서 init() 메서드를 실행하여 Servlet 객체를 초기화 한다. 

 - 사용자 요청을 처리하기 위해 스레드를 생성 

4) service(request, response) 메서드가 호출되어, request 타입을 분석하여 타입에 따라 적절한 메서드를 호출

 - GET 방식이라면 doGet() 으로, POST 방식이라면 doPost를 호출하는 식.

5) 응답을 클라이언트에 전송

6) was가 종료되면서 destory()메서드 실행, 생성된 스레드를 소멸시킴.

 

 

* Servlet 의 라이프 사이클

최초요청/ 컨테이너 시작   init()

모든 요청과 응답             service() -> 쓰레드를 통한 동시 실행 (doGet(), doPost()로 분기)

컨테이너 종료/ WAS종료  destory()

 

* 코드로 확인

public class LifeCycle extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public LifeCycle() {
        super();
        System.out.println("LifeCycle 실행..");
    }
    
	@Override
	public void init() throws ServletException {
		System.out.println("init() 호출됨...");
	}

	@Override
	public void destroy() {
		System.out.println("destroy() 호출됨...");
	}
	
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("service() 호출됨");
	}
}
	<servlet>
    	<servlet-name>LifeCycle</servlet-name>
		<servlet-class>sample.LifeCycle</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>LifeCycle</servlet-name>
		<url-pattern>/LifeCycle</url-pattern>
	</servlet-mapping>

실행결과

 F5를 눌러 새로고침할때 service() 메서드만 실행되는 것을 볼 수있다. 처음임에만 servlet을 초기화한후 그뒤로는 초기화 되지 않는다. 즉 처음 servlet을 호출할때만 실행시간이 조금 걸리고 그뒤에는 메모리에 올라와있으므로 빠르게 요청을 처리할 수 있다. 

728x90