🎯 서블릿 lifecycle

참고 : https://velog.io/@corone_hi/%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%83%9D%EB%AA%85%EC%A3%BC%EA%B8%B0-Servlet-LifeCycle
  1. tomcat 컨테이너가 서블릿의 life cycle 관리 ( 생성 ~ 소멸 )

  2. 생성시 호출 메서드 : init () 메서드 콜백 호출
                                      단 한번만 호출된다.
    요청시 호출 메서드: service()  메서드(doGet, doPost)
                                     요청할 때마다 호출된다.
    삭제시 호출 메서드: destroy() ⇒ 콜백 메서드로 동작됨 (시스템이 특정 상황에서 호출하는 함수)

  3. 서블릿은 단 한번만 생성된다.
    단 하나의 생성된 서블릿을 이용해서 많은 사용자(클라이언트)의 요청을 처리한다.

  4. 주의할 점
  • 인스턴스 변수는 단 한번만 생성된다. 여러 사용자가 공유할 수 있다. ( thread-unsafe )
  • 만약 공유하고 싶지 않으면 반드시 로컬 변수로 작성해야 된다. ( thread-safe )

⇒ 결론은 서블릿 코드 구현은 thread-safe하게 구현해야 된다.



 

📝 실습

서블릿은 단 한번만 생성된다.

 

Override/Implement Methods



첫번째 run as



두번째부터는 doGet만 실행되는 것을 볼 수 있다.

단 하나의 생성된 서블릿을 이용해서 많은 사용자(클라이언트)의 요청을 처리한다.
그 이후는 서비스메서드만 ( doGet ) 실행된다.

 

 


 

서블릿 코드 구현은 thread-safe하게 구현해야 된다.

인스턴스 변수 : 공유 가능 ( thread-unsafe )
로컬 변수 : 나 혼자 사용 가능 ( tnread-safe ) ⭐⭐⭐

 

 

 

package com.servlet;

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;

// 요청 URL: http://localhost:8090/01_servlet/test
@WebServlet("/test2")
public class TestServlet2 extends HttpServlet {
	
	
	//인스턴스 변수 : 공유 가능  ( thread-unsafe )
	int num;
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		
		int num2 = 0;   // 로컬변수 : 나 혼자 사용 가능 ★   ( thread-safe )
		               // 서블릿 코드 구현은 thread-safe하게 구현해야 된다. 
		num++;
		num2++;
		
		System.out.println("thread-unsafe: " + num);
		System.out.println("thread-safe: " + num2);
	
	}

}
xoo | 수진