본문 바로가기

Java&JSP&Spring/JSP&Servlet

[JAVA/Servlet]Servlet의 생명주기(Line Cycle)

 

[JAVA/Servlet]Servlet의 생명주기(Line Cycle)

안녕하세요 미나라이입니다.

이번에는 서블릿의 생명주기에 대해서 알아보도록 하겠습니다.

프로젝트 환경

OS : Windows 10

IDE : Eclipse 2020-06 (4.16.0)

Java : 8

Jdk Version : 1.8.0_161

WAS : Tomcat 8.5.73

 

생명주기를 왜 알아야 하는가?

Servlet을 이용한 웹 개발을 할 때 조금 더 효율적으로 자원 관리를 할 수 있게 되기 때문에 알아두면 좋습니다.

예를들어 서버상에 딱 한번만 작동해야 하는 처리 등이 있을 경우에 아래 지식을 가지고 있으면 좋죠

Servlet의 생명주기

서블릿은 최초 요청시 서블릿 객체가 만들어지고 메모리에 로딩되고, 이후의 요청시에는 기존의 객체를 재활용하게 됩니다. 그러므로 동작속도가 다른 CGI를 사용하는 언어보다 응답속도가 빠른게 장점입니다.

서블릿의 생명주기에 대해서 아래 이미지를 통해서 알아봅시다.

전체적인 흐름을 직접 확인해보기 위해 이클립스로 실행해 봅시다.

이클립스로 서블릿을 만드는 방법은 아래 링크를 참고 해 주세요

 

[JAVA/JSP/Servlet]Servlet간단하게 만들고 실행해보기

[JAVA/JSP/Servlet]Servlet간단하게 만들고 실행해보기 안녕하세요 미나라이입니다. 이번에는 간단하게 Servlet프로젝트 생성 및 실행을 해보도록 하겠습니다. 프로젝트 환경 OS : Windows 10 IDE : Eclipse 20..

nameybs.tistory.com

 

프로젝트를 만들었습니다.

이클립스에서는 서블릿 파일을 생성할때 아래처럼 디폴트로 생성시켜주는 옵션이 있습니다.

이번에는 init()이랑 destory()를 체크해서 생성해보겠습니다.

프로젝트를 생성하면 아래와 같이 자동으로 생성된 것을 확인 할 수 있습니다.

이클립스를 쓰지 않는다면 직접 작성하셔도 됩니다.

콘솔 출력 로그를 작성해서 콘솔에 어떻게 찍히는지 확인 해 보겠습니다.

package com.test;

import java.io.IOException;
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;

/**
 * Servlet implementation class LifeCycle
 */
@WebServlet("/LifeCycle")
public class LifeCycle extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LifeCycle() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
		System.out.println("Init호출");
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("destory호출");
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("doGet호출");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("doPost호출");
	}

}

POST방식으로 테스틀 해야하기 때문에 JSP파일을 작성해서 한번 직접 날려보도록 하죠

JSP파일 작성 방법은 아래 포스팅을 참고 해 주세요

 

[JAVA/JSP]JSP간단하게 만들고 실행해보기

[JAVA/JSP]JSP간단하게 만들고 실행해보기 안녕하세요 미나라이입니다. 이번에는 간단하게 JSP프로젝트 생성 및 실행을 해보도록 하겠습니다. 프로젝트 환경 OS : Windows 10 IDE : Eclipse 2020-06 (4.16.0) Ja..

nameybs.tistory.com

JSP파일을 만들었습니다.

HttpSendTest.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>LifeCycle Test</title>
</head>
<body>
	<form action="/ServletTest2/LifeCycle" method="get">
		<input type="submit" value="GET" />
	</form>
	<form action="/ServletTest2/LifeCycle" method="post">
		<input type="submit" value="POST" />
	</form>
</body>
</html>

HttpSendTest.jsp파일을 우클릭해서 서버를 실행하면 아래처럼 버튼이 나옵니다.

콘솔에는 아직 아무것도 안 뜬 것을 확인 할 수 있습니다.

여기서 GET버튼을 눌러보겠습니다.

해당 서블릿을 통과했습니다. 딱히 서블릿 안에 써놓은게 없어서 빈꽉으로 나와있네요

그리고 GET방식은 파라미터를 붙히기 때문에 뒤에 ?가 붙어있네요

하지만 파라미터를 넣지 않았기 때문에 물음표 뒤에는 아무것도 정의되지 않았습니다.

콘솔로그를 확인 해 보겠습니다.

init과 doGet이 호출된것을 볼 수 있습니다.

init은 최초 한번 호출된다고 했기 때문에 첫 호출이니 제대로 호출 된 것을 확인 할 수 있습니다.

doGet은 GET방식으로 URL호출을 했기 떄문에 이것 또한 제대로 호출 되었네요.

다시 뒤로가기를 한다음에 이번에는 POST를 눌러보겠습니다.

POST로 서블릿 화면을 넘어간 모습입니다.

POST는 파라미터를 URL에 붙히지 않기 때문에 GET떄와 달리 물음표가 없는것을 확인 할 수 있습니다.

콘솔로그를 확인 해 봅시다.

3줄의 로그가 찍혔는데 위에 2개는 아까 GET호출 할 때 찍힌 로그입니다.

그러므로  doPost만 찍혔다고 볼 수 있네요

init은 아까 GET으로 이미 한번 호출되었기 때문에 이번에는 찍히지 않았네요

doPost는 Post방식으로 전송되었기 때문에 이것도 제대로 찍혀있다고 볼 수 있네요

그래도 모르니 GET을 다시 호출해봅시다.

콘솔로그를 보니 이번에는 GET으로 보내도 init을 호출하지 않는것을 볼 수 있습니다.

이제 destory()를 호출해보기 위해 서버를 종료 해 보겠습니다.

Servlet파일을 수정해서 WAS를 다시 로드하도록 해 봅시다.destory()가 호출되는것을 확인 할 수 있습니다.

destory()가 호출되고 다시 GET버튼을 눌러보니 init이 호출되는것을 확인 할 수 있습니다.

자원이 해제가 한번 되었기 때문에 메모리 영역이 초기화 되었다는 의미입니다.

이렇게 destory()는 자원이 해제될 때 마지막으로 한번 호출된다는 것을 확인 할 수 있었습니다.

 

또한 Init(), destory()를 제외한 선처리(init()전) 후처리(destory()후) 등이 있는데 이러한 유사한 기능도 있으니 검색을 해 보시면 더 자세한 내용이 나오니 찾아보시는것도 추천드립니다.

 

이상으로 간단하게 Servlet의 생명주기에 대해서 알아보았습니다.

 

 

 

 

728x90
반응형