ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JSP/Servlet] 서블릿 라이프 사이클 - init(), service(), doGet(), destroy()
    IT/Spring-JSP&Servlet 2020. 10. 29. 01:44

     

    출처 : unsplash

     

     

    ■ 들어가기

    - 뇌를 자극하는 JSP&Servlet (김윤명/한빛미디어). 을 공부하며 정리하는 블로그


    ■ 목차

    1. 서블릿 라이프 사이클

    2. 서블릿 라이프 사이클 예제

    3. 서블릿 클래스의 init 메서드와 destroy 메서드

     

    1. 서블릿 라이프 사이클

    - 클라이언트(웹 브라우저)가 서블릿에 요청(request) 시, 서블릿이 바로 호출되지 않음

    - 웹 컨테이너에 해당 서블릿 클래스가 로딩되어 있지 않다면

      init() 메서드 호출 후 service() 메서드 호출 & doGet()/doPost() 호출

    - 로딩 되어 있다면 service() 메서드 호출

    - JSP 페이지도 서블릿 클래스로 변환된 후 똑같은 라이프 사이클 수행

     

    출처 : https://victorydntmd.tistory.com/154

     

    1. 요청이 오면, Servlet 클래스가 로딩되어 요청에 대한 Servlet 객체가 생성됩니다.
    2. 서버는 init() 메소드를 호출해서 Servlet을  초기화 합니다.
    3. service() 메소드를 호출해서 Servlet이 브라우저의 요청을 처리하도록 합니다.
    4. service() 메소드는 특정 HTTP 요청(GET, POST 등)을 처리하는 메서드 (doGet(), doPost() 등)를 호출합니다.
    5. 서버는 destroy() 메소드를 호출하여 Servlet을 제거합니다.

     

    출처 : 뇌를 자극하는 JSP/Servlet

     

    - 일단 최초로 서블릿 클래스 로딩된 이후에는 초기화 작업 없이 바로 호출

     

    2. 서블릿 라이프 사이클 예제 - init(), service(), doGet(), destroy()

    /* LifeCycleServlet.java */
    
    import javax.servlet.http.* ;
    import javax.servlet.* ;
    import java.io.* ;
    
    public class LifeCycleServlet extends HttpServlet {
        private static final long serialVersionUID = 1L ;
        
        public void init(ServletConfig config) throws ServletException {
            System.out.println("init called") ;
            super.init() ;
        }
        
        public void destroy() {
            System.out.println("destroy called") ;
            super.destroy() ;
        }
        
        protected void service(HttpServletRequest request,
                               HttpServletResponse response) throws ServletException, IOException {
            System.out.println("service called") ;
            super.service(request, response) ;
        }
        
        protected void doGet(HttpServletRequest request,
                               HttpServletResponse response) throws ServletException, IOException {
            System.out.println("doGet called") ;
        }
        
        protected void doPost(HttpServletRequest request,
                               HttpServletResponse response) throws ServletException, IOException {
            System.out.println("doPost called") ;
        }
    }

    > 실행 결과

    - 최초 호출 후, 재 호출 시 init() 메서드 없이 service(), doGet()/doPost() 메서드를 호출함

    - 소멸 시 destroy() 메서드 호출

    1) 최초 호출 시..

    2020-10-29 00:28:47 Apache Commons Daemon procrun stdout initialized.
    init called
    service called
    doGet called

    2) 두 번째 호출 시..

    2020-10-29 00:28:47 Apache Commons Daemon procrun stdout initialized.
    init called
    service called
    doGet called
    service called
    doGet called

    3) 톰캣 종료 시..

    2020-10-29 00:28:47 Apache Commons Daemon procrun stdout initialized.
    init called
    service called
    doGet called
    service called
    doGet called
    destroy called

     

    3. 서블릿 클래스의 init 메서드와 destroy 메서드

    - 서블릿 클래스의 init 메서드 : 서블릿 초기화 작업 수행 시 자동으로 호출되는 메서드

    - 서블릿 클래스의 destroy 메서드 : 서블릿 마무리 작업 수행 시 자동으로 호출되는 메서드

     

    3-1. init 메서드 작성 방법

    - init 메서드는 파라미터가 없는 메서드로 선언

    - 리턴 타입은 void로 지정하며, public으로 선언해야 함

    - javax.servlet.ServletException을 메서드 밖으로 던지도록 만들 수 있으며, throws 절 전체 생략 가능

    - init 메서드 실행에 오래 걸리는 경우가 있으며,

      이를 해결하기 위해 web.xml 내 <servlet> 엘리먼트 안에 <load-on-startup/> 라는 서브 엘리먼트를 기재

    - <load-on-startup/> : 웹 컨테이너가 시작될 때 해당 서블릿 클래스가 웹 컨테이너의 메모리로 로드되며, 서블릿 객체 생성/초기화까지 완료됨

    /* init 메서드 골격 */
    public void init() throws ServletException {
         to-do
    }

    [잠깐!] init 메서드는 파라미터가 없는 메서드라면서요?

    왜 2번 예제 코드에서는 ServletConfig 타입의 파라미터를 받나요?

    - 웹 컨테이너가 서블릿을 초기화할 때 호출하는 것은 ServletConfig 파라미터를 받는 init 메서드이지만

    - 그 메서드 안에서 내부적으로 파라미터 없는 init 메서드를 호출합니다.

    - GenericServlet은 일반적인 protocol 사용 가능하며, HttpServlet은 HTTP protocol 만 사용 가능

     

     

    - ServletConfig 파라미터를 받는 init 메서드 작성 시, 반드시 메서드 내에 슈퍼클래스의 init 메서드를 호출하도록 지정 필요!

    /* 작성 예시 */
    public void init (ServletConfig config) throws ServletException {
         super.init(config) ;     /* 슈퍼클래스의 init 메서드를 호출하는 명령문 */
    }

     

    3-2. destroy 메서드 작성 방법

    - destroy 메서드는 파라미터가 없는 메서드로 선언

    - 리턴 타입은 void로 지정하며, public으로 선언해야 함

    - 단, throws 절 사용 불가

    /* destroy 메서드 골격 */
    public void destroy() {
         to-do
    }

     

    3-3. 서블릿의 초기화 파라미터

    - 서블릿의 초기화 작업에 필요한 데이터

    - web.xml 파일에 기재

      <servlet> 엘리먼트 안에 <init-param> 서브 엘리먼트 추가

      <init-param> 엘리먼트 안에 각각 <param-name>, <param-value>의 서브 엘리먼트 작성

    /* 서블릿 초기화 골격 */
    <servlet>
        <servlet-name>agreement-servlet</servlet-name>
        <servlet-class>AgreementServlet</servlet-class>
        <init-param>
            <param-name>FILE_NAME</param-name>
            <param-value>agreement.txt</param-value>
        </init-param>
    </servlet>

     

     

     

    ♣ 참고

    blog.naver.com/ykycome00/222093874542

    victorydntmd.tistory.com/154

    12bme.tistory.com/555

    www.silverwolf.co.kr/java/9906

    rooov.tistory.com/15

    ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EC%84%9C%EB%B8%94%EB%A6%BF

    opentutorials.org/module/516/6222

    limkydev.tistory.com/188

    댓글

Designed by Tistory.