[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>
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() 메서드만 실행됨을 알 수 있다.
'Web Programming' 카테고리의 다른 글
[Template] 홈페이지 템플릿 모음 (0) | 2020.07.04 |
---|---|
[Web Programming] Servlet. get/post (0) | 2020.06.21 |
[Web Programming] 웹서버, WAS, Servlet, 컨테이너 구조 개괄 (0) | 2020.06.13 |
[Web Programming ] Servlet 1. Servlet API(Generic/HTTP Servlet) (0) | 2020.06.03 |
댓글