1. 생명 주기?
처음에 생명주기란 말을 듣고는 "뭐가.. 주... 죽는거야?"라는 생각이 들었다.
서블릿을 통해 요청이 되고 응답이 되어지는 하나의 과정을 생명 주기라고 부른다.
만약 클라이언트가 서블릿에 무언가를 요청한다면 서블릿도 자바 클래스이므로 당연히 초기화 과정과 메모리에 인스턴스를 생성한 뒤 서비스를 수행한 후 다시 소멸되는 과정을 거친다.
이 각각의 과정에서 호출되어 기능을 수행하는 메서드들이 서블릿 생명주기 메서드이다.
즉, 서블릿 생명주기 메서드란 서블릿의 실행 단계마다 호출되어 기능을 수행시키는 콜백 메서드이다.
HttpServlet 클래스의 계층도 안에 이 생명주기에 대한 클래스가 있다.
- HttpServlet 클래스의 계층도
class GenericServlet {}
class HttpServlet extends GenericServlet {}
class LifeCycle extends HttpServlet {}
즉 생명주기라는 클래스를 사용하여 HttpServlet 클래스가 하나의 서블릿을 동작시킨다는 것!
그리고 이것을 사용시키려면 web.xml에 등록을 해야 한다.
이 결과 확인은 life.do 라는 명령어를 통해 실행시킬 예정이다.
(물론 이 과정은 스프링 프레임워크에서 다 간소화되어져있지만 지금은 코드로 다 구현을 한다)
<!-- LifeCycle서블릿(HttpServlet 생명주기) 등록 -->
<servlet>
<servlet-name>son</servlet-name>
<servlet-class>net.control.LifeCycle</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>son</servlet-name>
<url-pattern>/life.do</url-pattern>
</servlet-mapping>
그런데, 여기서 잠깐!
대체 왜?
왜 생명주기를 쓸까?
그냥 서블릿을 실행시키면 안되나?
굳이 구간을 나눠나눠가면서 프로그램을 실행시킬까?
서블릿을 사용하는 이유는 빠른 응답속도 때문이다.
왜냐하면 Servlet은 최초 요청 시 객체가 만들어져 메모리에 로딩되고, 이후 요청시에는 기존의 객체를 재활용하기 때문이다(이것이 생명주기에서 사용되는 메서드).
그렇기에 동작 속도가 빠른 것이다. 만약 다양한 사용자들이 동일한 작업을 여러 번 요청하여 같은 작업을 서블릿을 통해 반복시킬 때 메모리에 존재하는 서블릿을 재사용함으로써 훨씬 빠르고 효율적으로 동작시킬 수 있다.
2. 생명 주기의 주요 메서드!
위에서 설명했듯 생명 주기의 각 분기별로 역할을 하는 주요 메서드들이 있다.
1) init()
서블릿이 생성(초기화)되는 단계.
2) service()
개발자가 구현한 방식으로 서블릿이 일을 하는 단계.
URL을 통해서 요청이 들어오면(새로고침 등) service() 가 요청을 받아 전송방식을 구분(get 또는 post)해서 doGet() 또는 doPost 메서드를 호출한다.
3) doGet() & doPost()
요청에 따라 get 또는 post방식으로 서블릿을 실행.
4) destroy()
서블릿이 일을 마치고 소멸되는 단계.
5) 서블릿 생명주기 예제
package net.control;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LifeCycle extends HttpServlet {
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
super.init();
System.out.println("init() 호출...");
} // init() end
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
super.service(arg0, arg1);
System.out.println("service() 호출...");
} // service() end
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doGet(req, resp);
System.out.println("doGet() 호출...");
} // doGet() end
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
System.out.println("doPost() 호출...");
} // doPost() end
@Override
public void destroy() {
// TODO Auto-generated method stub
super.destroy();
System.out.println("destroy() 호출...");
} // destroy() end
} // class end
위의 코드를 따라서 url에 접속해보았다.
그리고 새로고침을 3번한 뒤 서버를 종료시켰다.
그러자 이클립스 콘솔창에 출력된 결과 화면이 바로 아래와 같다.
'⁂ JSP > : 기본 익히기' 카테고리의 다른 글
[JSP] #12-3 MVC의 디자인 패턴 (0) | 2022.10.27 |
---|---|
[JSP] #12-1 HttpServlet 파헤치기! (0) | 2022.10.27 |
[JSP] #11-5 JSTL 제어문 (0) | 2022.10.26 |
[JSP] #11-4 JSTL(JSP Standard Tag Library, JSP전용태그) (0) | 2022.10.26 |
[JSP] #11-3 EL(Expression Language) - 내장 객체 (0) | 2022.10.26 |