[JSP] 서블릿 Life Cycle 이란?

2024. 7. 2. 12:32·JAVA/JSP 프로그래밍
서블릿의 라이프사이클은 서블릿이 생성되고 초기화된 후 요청을 처리하고 종료되기까지의 생명 주기를 의미한다. 서블릿 라이프사이클을 이해하면 서블릿이 웹 애플리케이션에서 어떻게 동작하는지 파악하기 위해 학습해야 한다.

사전 기반 지식

 

서블릿 라이프사이클 단계

💡 서블릿 라이프사이클은 서블릿이 생성되고, 요청을 처리하며, 소멸되는 전체 과정입니다. 서블릿의 생명 주기는 세 가지 주요 메서드인 init(), service(), destroy() 로 구성된다.
  1. 클래스 로딩 (Class Loading)
  2. 인스턴스 생성 (Instantiation)
  3. 초기화 (Initialization)
  4. 요청 처리 (Request Processing)
  5. 종료 (destroy)

1. 클래스 로딩 (Class Loading)

  • 설명: 서블릿 컨테이너는 서블릿 클래스를 메모리에 로드한다. 이 단계는 서블릿이 처음 요청되었을 때 또는 애플리케이션 시작 시 load-on-startup 설정에 따라 수행된다.
  • 역할: 서블릿 클래스의 바이트코드를 JVM으로 로드하여 서블릿을 실행할 준비를 한다.

2. 인스턴스 생성 (Instantiation)

  • 설명: 서블릿 컨테이너는 로드된 서블릿 클래스로부터 인스턴스를 생성한다.
  • 역할: 서블릿 객체를 메모리에 할당하여 이후 단계에서 사용할 수 있도록 준비한다.

3. 초기화 (Initialization)

  • 설명: 서블릿 컨테이너는 init() 메서드를 호출하여 서블릿을 초기화한다. 이 단계에서 서블릿은 초기화 작업을 수행한다.
  • 역할: 서블릿이 요청을 처리하기 전에 필요한 초기 설정을 수행한다.
@Override
public void init() throws ServletException {
    // 초기화 작업 수행
    System.out.println("필요한 객체 또는 데이터가 있다면 여기서 초기화 할 수 있습니다.");
    System.out.println("init() 메서드는 생애주기에서 단 한번만 호출이 됩니다.");
}

4. 요청 처리 (Request Processing)

  • 설명: 클라이언트의 요청이 들어올 때마다 서블릿 컨테이너는 service() 메서드를 호출한다. service() 메서드는 HTTP 요청 메서드(GET, POST 등)에 따라 doGet(), doPost() 등의 메서드를 호출한다.
  • 역할: 클라이언트의 요청을 처리하고 적절한 응답(연산)을 생성한다.
service() 메서드는 여러 클라이언트 요청을 처리할 때 다중 스레드를 사용하여 각 요청을 병렬로 처한다.
service() 메서드는 한 번 호출되면 즉시 요청을 처리하고, 처리 후에는 응답을 클라이언트로 반환하고 종료
된다. 비동기 처리.

5. 종료 (destroy)

  • 설명: 서블릿이 더 이상 필요하지 않게 되면 서블릿 컨테이너는 destroy() 메서드를 호출하여 서블릿을 종료하고 자원을 해제한다.
  • 역할: 서블릿이 사용하던 자원을 정리하고 종료 작업을 수행한다.
@Override
public void destroy() {
    // 종료 직전에 해야될 작업이 있다면 수행 
    System.out.println("Servlet is being destroyed");
}

메서드 호출 순서

생성자() → init() → service() → doGet() / doPost() → destroy()

 

package com.tenco;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;

// http://localhost:8080/hello/my-servlet
public class MyServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

    public MyServlet() {
        super();
        System.out.println("호출 1");
    }
    
    @Override
    public void init() throws ServletException {
    	super.init();
        System.out.println("호출 2");
    }
    
    // 클라이언트가 매번 요청을 하는데 매번 호출이 될까?
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("호출 3");
    	System.out.println("서비스 메서드 호출 확인");
    	response.setContentType("text/html; charset=UTF-8");
    	// 부모 클래스 메서드 호출 
    	super.service(request, response);
    }
    

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("호출 4 - 1");
		System.out.println("doGet 메서드 호출 ");
	}
	

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("호출 4 - 2");
		System.out.println("doPost 메서드 호출 ");
	}
	
	@Override
	public void destroy() {
		System.out.println("destroy() 메서드 호출 ");
		super.destroy();
	}

}

 

 

❗클래스 로딩 시점(서블릿 로딩)

서블릿이 메모리에 로드되고 초기화되는 시점은 다음 두 가지 경우 중 하나이다

 

첫 번째 요청 시 (On First Request)

  • 서블릿 컨테이너는 서블릿에 대한 첫 번째 요청이 들어올 때 서블릿 클래스를 로드하고 인스턴스를 생성하며, init() 메서드를 호출하여 초기화한다.
  • 이 방식은 기본 동작 방식으로, 애플리케이션이 시작될 때 불필요한 서블릿 로드를 피할 수 있다.

애플리케이션 시작 시 (At Application Startup)

  • 서블릿을 애플리케이션이 시작될 때 미리 로드하고 초기화하도록 설정할 수 있다. 이를 통해 초기화 지연을 방지하고, 애플리케이션 시작 시 필요한 작업을 미리 수행할 수 있다.
  • 이 설정은 web.xml 파일의 <load-on-startup> 태그나 @WebServlet 애노테이션의 loadOnStartup 속성을 사용하여 지정할 수 있다.

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="https://jakarta.ee/xml/ns/jakartaee"
	xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
	version="6.0">
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>

	<servlet>
		<description></description>
		<display-name>HelloServlet</display-name>
		<servlet-name>HelloServlet</servlet-name>
		<servlet-class>com.tenco.HelloServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>HelloServlet</servlet-name>
		<url-pattern>/hello-servlet</url-pattern>
	</servlet-mapping>
	
	<display-name>hello_servlet</display-name>
	<servlet>
		<description></description>
		<display-name>MyServlet</display-name>
		<servlet-name>MyServlet</servlet-name>
		<servlet-class>com.tenco.MyServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>MyServlet</servlet-name>
		<url-pattern>/my-servlet</url-pattern>
	</servlet-mapping>

</web-app>
package com.tenco;

import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;


/**
 * HttpServlet 클래스를 상속받아서 내가 정의한 클래스가 선언이 된다.
 * why? HTTP 프로토콜을 통한 request, response 처리를 할 수 있기 때문  
 * 
 * URL 맵핑에 대한 개념을 알자. 
 * 클라이언트가 특정 URL을 요청했을 때 해당 URL에 대응하는 서블릿을 
 * 실행하도록 설정하는 것을 의미 합니다.
 * URL 맵핑 - 2가지 방법 알아 보자.    
 */
@WebServlet(urlPatterns = "/example", loadOnStartup = 1)
public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	
	// 생성자 
    public HelloServlet() {
        super();
        System.out.println("생성자가 호출 됨");
    }
    

    // 해당 서블릿 클래스가 인스턴스화 될 때 단 한번 실행 하는 메서드이다. 
	public void init(ServletConfig config) throws ServletException {
		System.out.println("init() 메서드가 호출 됨");
	}
	
	// 메모리에서 내려가기 직전에 호출 되는 메서드이다. 
	public void destroy() {
		System.out.println("destroy 호출");
	}
	
	// GET 요청으로 들어 올 때 동작 됨
	// 주소 설계 - http://localhost:8080/hello/hello-servlet 
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// MIME TYPE - 인터넷 세상에서 데이터의 유형을 나타내는 표준 방식 
		
		response.setContentType("application/pdf");
		response.setCharacterEncoding("UTF-8");
		// 스트림을 어디에서 뽑아야 될까? 
		response.getWriter().write("<html><body><h1>HELLO</h1><body></html>");
	}

	
	// POST 요청으로 들어 올 때 동작 됨 
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 문제 -> post 요청이 들어오는 것을 확인 하고 
		// 응용해서 데이터 또는 html 형식으로 응답처리 하시오!
	}

}

'JAVA > JSP 프로그래밍' 카테고리의 다른 글

[JSP] Get, Post 요청 방식에 이해  (0) 2024.07.02
[JSP] 서블릿 작성, 배포, web.xml 설정에 이해  (0) 2024.07.02
[JSP] 서블릿이란?  (0) 2024.07.01
[JSP] 아파치 톰캣 시작과 폴더 구조 확인  (0) 2024.06.28
[JSP] WAS와 웹 컨테이너의 역할  (0) 2024.06.28
'JAVA/JSP 프로그래밍' 카테고리의 다른 글
  • [JSP] Get, Post 요청 방식에 이해
  • [JSP] 서블릿 작성, 배포, web.xml 설정에 이해
  • [JSP] 서블릿이란?
  • [JSP] 아파치 톰캣 시작과 폴더 구조 확인
미로910
미로910
개발자를 꿈꾸는 민경이의 기록 블로그
  • 미로910
    개발 note
    미로910
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 설치 메뉴얼
      • HTML
      • JAVA
        • Java 기초
        • Java 응용
        • 자료구조
        • HTTP
        • JSP 프로그래밍
      • MySQL
        • MySQL 기본
        • 1일 1쿼리
      • CSS
      • Spring boot
      • JS
        • 게시판 만들기
      • Git
      • Flutter
        • MVVM 활용
        • 심화 버전
        • 1일 1 Flutter
      • 디자인 패턴의 활용
      • error note
      • My Project
        • [졸작] LLM 기반 특허 유사도 분석 시스템
        • 도서 관리 프로그램 (final project)
        • amigo
        • 친구 매칭 프로그램(FMP)
      • Python
      • 딥러닝
      • 네트워크
      • 공부 노트
        • 연구회
        • 자료구조
      • 기타
  • 블로그 메뉴

    • 홈
    • 전체보기
    • -----------------------
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Flutter
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
미로910
[JSP] 서블릿 Life Cycle 이란?
상단으로

티스토리툴바