[JSP]Servlet life-cycle

DU·2025년 1월 14일
0

JSP

목록 보기
2/5
post-thumbnail

Servlet Life Cycle: 생성부터 종료까지의 흐름 완벽 이해

Servlet은 클라이언트의 요청을 처리하고 서버에서 동적 콘텐츠를 생성하는 Java 기반의 기술입니다. 이번 글에서는 Servlet이 동작하는 생명 주기(Life Cycle)를 단계별로 살펴보고, 각 단계에서 호출되는 메서드의 역할과 중요성을 이해하겠습니다.


Servlet Life Cycle의 주요 단계

Servlet의 생명 주기는 Servlet 컨테이너에 의해 관리되며, 아래와 같은 단계를 거칩니다:

  1. 객체 생성: Servlet 인스턴스가 메모리에 로드됩니다.
  2. 초기화(init): 초기 설정을 수행합니다.
  3. 요청 처리(service): 클라이언트의 요청을 처리하고 응답을 반환합니다.
  4. 종료(destroy): 자원을 정리하고 Servlet을 메모리에서 해제합니다.

Servlet Life Cycle의 실행 흐름

1. Servlet 객체 생성 전후: @PostConstruct

@PostConstruct는 Servlet 객체가 생성된 후, init() 메서드가 호출되기 전에 실행됩니다. 이 어노테이션은 초기화 작업이 필요한 경우에 유용합니다.

@PostConstruct
public void postConstruct() {
    System.out.println(" -- postConstruct() --");
}

주요 포인트

  • Servlet 생성 이후 바로 실행됩니다.
  • 초기화 메서드(init()) 호출 전에 사용자 정의 작업을 수행할 수 있습니다.

2. 초기화: init()

init() 메서드는 Servlet이 처음 초기화될 때 한 번 호출됩니다. 주로 설정 파일 읽기, 리소스 초기화 등의 작업을 수행합니다.

@Override
public void init() throws ServletException {
    System.out.println(" -- init() --");
}

주요 포인트

  • Servlet이 처음 로드될 때 호출됩니다.
  • init() 메서드는 초기화 실패 시 예외를 던질 수 있습니다.

3. 요청 처리: service()와 doGet()/doPost()

service() 메서드는 클라이언트의 HTTP 요청을 처리하며, 요청 방식(GET, POST 등)에 따라 doGet() 또는 doPost() 메서드를 호출합니다.

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println(" -- doGet() --");
}

주요 포인트

  • service()는 HTTP 요청을 분류하며, 기본적으로 재정의하지 않습니다.
  • doGet()은 GET 요청, doPost()는 POST 요청을 처리합니다.

4. 종료 전후: @PreDestroy

@PreDestroy는 Servlet이 제거되기 전에 호출됩니다. 주로 종료 작업을 수행하는 데 사용됩니다.

@PreDestroy
public void preDestroy() {
    System.out.println(" -- preDestroy() --");
}

주요 포인트

  • destroy() 메서드 호출 전 실행됩니다.
  • 외부 리소스 정리 또는 로그 저장 등에 활용됩니다.

5. 종료: destroy()

destroy() 메서드는 Servlet이 메모리에서 해제될 때 호출됩니다. 종료 작업을 수행합니다.

@Override
public void destroy() {
    System.out.println(" -- destroy() --");
}

주요 포인트

  • 메모리 누수를 방지하기 위해 리소스를 해제합니다.
  • 주로 데이터베이스 연결 해제, 파일 스트림 닫기 등을 수행합니다.

Servlet Life Cycle 코드 예제

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LifeCycleServlet extends HttpServlet {

    @PostConstruct
    public void postConstruct() {
        System.out.println(" -- postConstruct() -- ");
    }

    @Override
    public void init() throws ServletException {
        System.out.println(" -- init() -- ");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println(" -- doGet() -- ");
        response.getWriter().println("Hello from doGet()");
    }

    @Override
    public void destroy() {
        System.out.println(" -- destroy() -- ");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println(" -- preDestroy() -- ");
    }
}

Servlet Life Cycle의 흐름 정리

  1. 객체 생성: Servlet 컨테이너가 Servlet 클래스를 메모리에 로드합니다.
  2. 초기화: @PostConstructinit() 실행. 초기 설정 작업 수행.
  3. 요청 처리: service() → 요청 방식에 따라 doGet() 또는 doPost() 호출.
  4. 종료 전후: @PreDestroy → 종료 작업 수행.
  5. 종료: destroy() → 리소스 정리 후 Servlet 객체 메모리 해제.

Servlet Life Cycle을 활용하는 팁

  1. 리소스 효율 관리

    • init()destroy()를 활용해 데이터베이스 연결과 같은 리소스를 효율적으로 관리하세요.
  2. 로그 남기기

    • 각 단계에서 로그를 기록하여 Servlet의 동작 흐름을 추적할 수 있습니다.
  3. 테스트와 디버깅

    • @PostConstruct@PreDestroy를 활용하면 초기화와 종료 작업의 디버깅이 쉬워집니다.

0개의 댓글