본문 바로가기
Web Programming

[Web Programming ] Servlet4. life cycle - load on startup

by Classic! 2020. 6. 3.

[WAS 작동 매커니즘]

 

★클라이언트의 요청이 들어오면~

1. web.xml(서블릿 인스턴스 매핑정보, 초기화를 위한 ServleteConfig정보)읽기

2. 서블릿 객체 생성 -> 기본 생성자 호출

2-1. WAS는 서블릿 인스턴스 객체를 생성할 때 기본생성자를 호출하는데 명시적 생성자는 WAS가 못 만들기 때문에 ServletConfig객체에서 오버라이딩 init() 호출

2-2. init() 으로 명시적인 초기화해줌.

------------------------------------ready on 상태 : 요청이 여러번 되더라도 최초 한번만 수행되고 반복되지 않음.

3. 클라이언트가 요청을 하면 req,res객체가 생성, 스레드 생성, service 호출.

3-1. req,res객체를 service메서드의 인자로 넘겨줌.

3-2. service()가 doGet()/doPost()함수 재호출

4. 서비스를 실행, 실행이 끝나면 응답(=요청의 처리결과를 res에 담아서 클라이언트로 돌려보냄). 

5. 응답을 하면 스레드를 Death됨. req,res도 사라짐. 수행 끝나면 servlet만 남음.

------------------------------------3,4,5번 과정은 새로운 요청이 들어올 때마다 반복됨.

 

 

WAS가 요청 받는 매커니즘에서 1,2 단계는 요청과 무관하게 서버가 가동되자마자 실행된다.

그런데 실제로 코드를 실행하면 요청 전에 서버를 먼저 가동해도 ready-on 실행한다. 대부분 기본 설정이 lazy loading 으로 되어 있기 때문이다.

 

- lazy loading

이 경우, 최초의 요청이 들어올 때 서버 가동한 후 1~5번까지 상태를 모두 실행하므로 이후 요청보다 속도가 느리다.

서버를 가동하고 요청이 들어올 때까지 아무것도 하지 않는 것을 lazy loading이라고 한다.

- pre loading

반면, 앞서 말한 것처럼 서버 가동과 동시에 ready-on 단계를 실행하는 것을 pre loading이라고 한다.

기본 설정이 lazy loading으로 되어 있기 때문에 web.xml에서 직접 설정을 바꿔주어야 한다.

<load-on-startup>1</load-on-startup>

</servlet>닫기 직전에 <load-on-startup>1</load-on-startup>  첫번째로 만든  서블릿이므로 숫자 1을 기입

public class ServletLifecycleTest1 extends HttpServlet{
	private static final long serialVersionUID = 1L;
	private int count=0;//
	
    public ServletLifecycleTest1() {
    	System.out.println("1. ServletLifecycleTest1 생성자..called by Container(WAS)");
    }
    
    public void init() throws ServletException {
    	System.out.println("2...init called by Container(WAS)");
    }
    
    public void destroy() {// servlet은 서버가 셧다운될 때 무조건 호출됨.
    	System.out.println("4. destroy called by Container(WAS)");
    	}
    
 	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}
	
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("3. service called by Container(WAS)");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		
		//브라우저로 출력
		out.println("<html><body bgcolor='magenta'>");
		out.println("<h3>Life Cycle Call-Back Method Test<><h3>");
		out.println("<b>Count :: </b>"+ ++count);
		out.println("</html></body>");
		
		out.close();
	}

web.xlm에 위와 같이 load-on-startup을 추가한 후 서버만 가동하면 위 코드에서 생성자 부분과 init() 메서드만 실행됨을 알 수 있다.

 

pre loading

 

댓글