* 라이프 사이클이란?
어떤 객체의 생성부터 소멸까지의 과정을 라이프 사이클(Life Cycle)라고 한다.
Servlet의 라이프 사이클
서블릿 생명주기를 확인해 보기 위한 간단한 실험
우선, LigecycleServlet이란 서블릿을 작성하고
HttpServlet의 3가지 메소드를 오버라이딩 한다.
- init()
- service(request, response)
- destory()
...
@WebServlet("/LifecycleServlet")
public class LifecycleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LifecycleServlet() {
System.out.println("LifecycleServlet 생성!!");
}
public void init(ServletConfig config) throws ServletException {
System.out.println("init 호출!!");
}
public void destroy() {
System.out.println("destroy 호출!!");
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
System.out.println("service호출!!");
}
}
서버를 실행시키고 해당 url을 요청하게 되면 콘솔에 다음과 같은 메세지가 출력된다.
한 번 더 요청을 해보면 이번에는 "service 호출!!" 이란 메세지만을 출력하게 될 것이다. 메모리에 해당 서블릿이 존재하지 않으면 해당 서블릿을 생성하고 init() 메소드가 실행 된 뒤에 service()가 호출이 되는데 이 경우에는 이미 서블릿이 메모리에 존재하기 때문에 service()만 다시 호출하는 것이다.
destroy()는 언제 호출될까?
서블릿을 조금 수정해 보자. init()의 호출 메세지를 "init test 호출!!"로 바꾸고 저장을 해보자.
서블릿을 수정하게 되면 기존에 있던 서블릿은 더 이상 없는 것이기 때문에 destroy()메소드가 호출되고 다시 새로운 서블릿을 불러들이기 위해 servelt을 생성하고 init()을 거친 다음에서야 service()가 호출이 된다.
Servlet 생명주기
- WAS는 서블릿 요청을 받으면 해당 서블릿이 메모리에 있는지 확인
- if (메모리에 없음) {
- 해당 서블릿 클래스를 메모리에 올림
- init() 메소드를 실행
}
- service()메소드를 실행 - WAS가 종료되거나, 웹 어플리케이션이 새롭게 갱신될 경우 destroy() 메소드가 실행됨
doGet(), doPost()?
service(request, response) 메소드에 더 주목해 보자.
Servlet 클래스는 HttpServlet을 상속 받아 만들어졌다. 그리고 위에서 service() 메소드는 부모에게 있던 service()를 오버라이딩하여 구현했다. 만약, 서블릿에서 service()를 구현하지 않는다면 당연히 부모 클래스인 HttpServlet이 실행될 것이다.
HttpServlet의 service메소드는 템플릿 메소드 패턴으로 구현되어 있다.
- 클라이언트의 요청이 GET인 경우에는 자신이 가지고 있는 doGet(request, response)메소드를 호출하고,
- 클라이언트의 요청이 POSTd일 경우에는 자신이 가지고 있는 doPost(request, response)메소드를 호출한다.
service메소드가 이렇게 동작하고 있었기 때문에 service메소드를 직접 구현하지 않고 doGet()메소드를 오버라이딩하여 구현했기 때문에 우리가 의도한대로 웹이 동작한 것이다.
아래 소스 코드를 통해 확인 가능하다.
url을 요청할 때는 Get 요청이므로 doGet()에서 구현한 화면을 출력하고
화면에 버튼을 클릭하면 Post 요청으로 들어가 doPost()에서 구현한 화면을 출력한다.
...
@WebServlet("/LifecycleServlet")
public class LifecycleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LifecycleServlet() {
System.out.println("LifecycleServlet 생성!!");
}
public void init(ServletConfig config) throws ServletException {
System.out.println("init test 호출!!");
}
public void destroy() {
System.out.println("destroy 호출!!");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>form</title></head>");
out.println("<body>");
out.println("<form method='post' action='/firstweb/LifecycleServlet'>");
out.println("name : <input type='text' name='name'><br>");
out.println("<input type='submit' value='ok'><br>");
out.println("</form>");
out.println("</body>");
out.println("</html>");
out.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
out.println("<h1> hello " + name + "</h1>");
out.close();
}
[부스트코스 관련 강의 링크]
Servlet 라이프 싸이클 - https://www.edwith.org/boostcourse-web/lecture/16688/
'Tech > BoostCourse - WEB' 카테고리의 다른 글
[부스트코스] 자바스크립트 변수-연산자-타입 (0) | 2020.02.18 |
---|---|
[부스트코스] Request, Response 객체 이해하기 (0) | 2020.02.14 |
[부스트코스] Servlet 작성 방법 (0) | 2020.02.13 |
[부스트코스] Servlet 이란? (0) | 2020.02.13 |
[부스트코스] 톰캣(Tomcat) 다운로드 및 설치하기 (0) | 2020.02.11 |