로그인 바로가기 하위 메뉴 바로가기 본문 바로가기
난이도
심화

웹 프로그래밍(풀스택)

임시 이미지 [코스설계] Front-End 윤지수
http://www.boostcourse.org/web316/notice/2505
좋아요 4729 수강생 47512
아래의 글은 BOOSTER 서포터즈로 활동하고 로리(mitty0***)이
작성한 부스트코스 후기입니다.
여러분들의 성원에 더 노력하는 부스트코스가 되겠습니다.
감사합니다.
******************************************
2)작성 날짜: 20/02/19

(본문 내용)

이번 시간에는 Servlet 라이프 싸이클 (생명 주기)과 객체에 대해 알아보도록 하겠습니다. Servlet 라이프 싸이클을 통해 서블릿이 언제 생성되고 어떤 메서드들이 호출되는지 배워봅시다.

이 글은 커넥트재단의 실무형 온라인 교육 프로그램인 부스트코스 웹 프로그래밍 과정을 기반으로 작성되었습니다.


3-2 Servlet 라이프 싸이클

1. Servlet 라이프 싸이클 작성해보기

먼저 LifecycleServlet이라는 클래스를 만들어서 init(), service(request, response), destroy() 메서드들을 오버라이딩해줍니다.

그리고, 아래의 코드 내용처럼 생성자인 LifecycleServlet() 함수에는 "LifecycleServlet 생성!!" 을 작성해줍니다. 마찬가지로 init, destroy, service 함수에 해당하는 내용을 작성해 줍니다.

package examples;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; @WebServlet("/LifecycleServlet")publicclassLifecycleServletextendsHttpServlet{privatestatic final long serialVersionUID =1L;publicLifecycleServlet(){ System.out.println("LifecycleServlet 생성!!");//생성자}publicvoidinit(ServletConfig config) throws ServletException { System.out.println("init 호출!!");}publicvoiddestroy(){ System.out.println("destroy 호출!!");}protectedvoidservice(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub System.out.println("service 호출!!");}}

2. Servlet 라이프 싸이클 과정

코드를 작동시켜서 서블릿이 어떤 라이프 싸이클을 가지는지 확인해봅시다.

처음으로 코드 실행한 경우

1) 해당 URL (예시: http://localhost:8080/exam25/LifecycleServlet) 로 클라이언트가 서버에 요청합니다.

2) 서버는 URL을 받아서 URL 매핑을 통해 LifecycleServlet 정보를 얻습니다.

3) LifecycleServelt 이라는 클래스가 메모리에 존재하는지 확인한 후,

4) 존재하지 않는다면 LifecycleServelt 객체를 생성합니다. 그 결과로 "LifecycleServelt 생성!!"을 출력합니다.

5) 다음으로 init 메서드를 호출합니다. 그 결과로 "init 호출!!" 을 출력합니다.

6) 다음으로 service 메서드를 호출하고, "service 호출!!"을 출력합니다.

7) 만약 새로고침을 누르면 service 메서드만 호출됩니다. 그 결과로 "service 호출!!"을 출력합니다.

페이지 새로 고침 눌렀을 때

8) 만약 코드를 수정하고 저장을 누르면 destroy 메서드가 호출됩니다. 수정한 코드 실행버튼을 누르면 LifecycleServelt 객체가 또다시 새롭게 생성됩니다.

WAS의 Servlet 실행 과정

if (클래스가 메모리에 없음) { 해당 서블릿 클래스를 메모리에 올림 init() 메서드를 실행 } service() 메서드를 실행 was가 종료되거나, 웹 어플리케이션이 새롭게 갱신될 경우 destroy() 메서드가 실행됩니다.

3. service 메서드 알아보기

여기서 궁금한 점은, '왜 service 메서드가 doGet 메서드와 같은 역할을 하는가?' 입니다. servlet을 처음 배웠을 때를 기억해보면, 분명 doGet 메서드만을 써서 html을 로드했었습니다. 그런데 라이프 싸이클 클래스에는 왜 doGet 메서드를 작성하지 않고, service 메서드를 사용한 것일까요?

publicclassLifecycleServletextendsHttpServlet

설명하기에 앞서, 예시 코드에 포함되어 있는 부분을 참고해봅시다. 이 코드에 의하면 LifecycleServlet이라는 클래스는 HttpServlet을 상속받고 있습니다. HttpServlet은 실제로 서블릿을 작성하면 상속받는 클래스입니다. 또 이 HttpServlet 클래스는 genericServlet을 상속받습니다. 즉, 실제로 서블릿이 실행될 때는 GenericServlet의 service 메서드를 오버라이딩한 HttpServlet 클래스의 service 메서드가 호출이 되고, http 요청에 따라서 doGet, doPost 메서드를 오버라이딩하게 됩니다.

만약 만든 클래스에서 service() 라는 메서드를 가지고 있지 않다면 부모클래스의 service() 메서드가 실행되며 서블릿의 부모인 HttpServlet의 service() 메서드가 실행이 되는 것입니다.

정리를 해보자면, HttpServlet의 service() 메서드는 템플릿 메서드 패턴으로 구현됩니다.

클라이언트 요청이 GET이면 자신이 가지고 있는 doGet(request, response) 를 호출합니다.

클라이언트 요청이 POST이면 자신이 가지고 있는 doPost(request, response) 를 호출합니다.

4. service 객체

웹 브라우저에 URL을 입력하고 Enter를 입력하면 웹 브라우저는 도메인과 포트 번호를 이용해서 서버에 접속합니다. 그리고 나서 path 정보, 클라이언트 IP 클라이언트의 다양한 요청 정보를 서버에게 전송하게 됩니다. 클라이언트로부터 요청이 들어오면 WAS는 HttpServletRequest라는 객체와 HttpServletResponse라는 객체를 생성합니다. HttpServletRequest 객체에는 요청할 때 가지고 들어온 다양한 정보들을 포함하고, HttpServletResponse 객체는 클라이언트에게 전송하기 위해서 담을 수 있는 정보를 포함합니다. 그리고 이 두 객체를 서블릿에게 전달하여 service, doGet do Post 같은 메서드에 파라미터로 전달됩니다.


 ******************************************