Servlet 생명주기

호떡·2022년 9월 4일
0

Servlet 생명주기

서블릿 인스턴스는 서블릿이 포함된 웹컨테이너에 의해 제어된다.
서블릿 인스턴스가 존재하지 않으면 다음과 같은 작업을 수행한다.

1. 서블릿 클래스 로드
2. 서블릿 클래스 인스턴스 생성
3. 서블릿 인스턴스 초기화
4. 웹 컨테이너에 의한 서비스 메서드 호출
5. destroy 메서드를 호출하여 서블릿 종료

서비스 메서드는 요청이 들어올 때마다 호출된다.
즉, Servlet은 최초 요청 시 객체가 만들어져 메모리에 로딩되는데, 그 이후 요청부터는 기존의 객체를 재활용하게 된다. 이것이 Servlet이 응답, 동작 속도가 빠른 이유다.

Servlet 객체 생성 (1회) -> init() 호출 (1회) -> service(), doGet(), doPost() 호출 (요청시 매번) -> destory() 호출 (1회)


실험


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%!
	int global = 1;
	int num1 = 10, num2 = 20;

	public int add(int a, int b){
		return a+b;
	}
%>    
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ADD</title>
</head>
<body>
	<h1>더하기를 해보자.</h1>
	<%
		int local = 1;
	
		out.print(add(num1, num2));
		
		out.print("글로발");
		out.print(global++);
		out.print("로칼");
		out.print(local++);
		
	%>
</body>
</html>

[실행 결과]

새로고침을 하면 (JSP내 선언부에 선언한) global 변수만 값이 증가한다. 이는 변환된 서블릿에서 global 변수가 멤버변수로 선언이 되었기 때문이다. 즉 서블릿 클래스 인스턴스가 한 번 생성되고 계속 재활용하기 때문에 값이 초기화되지 않는다.
반면 (JSP내 스크립트릿으로 선언된) local 변수는 서블릿에서 Service() 메서드 안에 선언이 된다. 즉 지역변수인 local 변수는 요청을 보낼 때마다 호출되어 계속 1로 초기화가 되는 것이다.

(feat. JSP 동작원리)

0개의 댓글