서블릿 생명주기 메서드와 @PostConstruct, @PreDestroy 활용

서블릿 생명주기 메서드와 @PostConstruct, @PreDestroy 활용

서블릿(Servlet)은 자바 웹 애플리케이션에서 클라이언트의 HTTP 요청을 처리하고 응답을 생성하는 서버 측 컴포넌트입니다. 서블릿은 그 생명주기(Lifecycle) 동안 다양한 메서드를 호출하며, 이 과정에서 초기화부터 종료까지 여러 단계를 거칩니다. 이번 글에서는 서블릿의 기본 생명주기 메서드인 init(), service(), destroy()에 더해, 추가적으로 @PostConstruct@PreDestroy 애너테이션을 활용하여 서블릿 생명주기 전반적으로 알아보겠습니다.

서블릿 생명주기

서블릿의 생명주기는 다음과 같은 단계로 나뉩니다.

  1. 서블릿 생성 및 초기화: 서블릿이 처음 생성될 때 호출되는 @PostConstructinit() 메서드를 통해 초기 설정을 수행합니다.
  2. 요청 처리: 클라이언트가 요청을 보낼 때 서블릿의 service() 메서드가 호출되며, 이 메서드는 doGet() 또는 doPost() 메서드로 분기되어 요청을 처리합니다.
  3. 서블릿 종료: 서블릿이 더 이상 사용되지 않으면 destroy() 메서드가 호출되고, 서블릿 종료 직전에 @PreDestroy 애너테이션이 붙은 메서드가 호출됩니다.

@PostConstruct와 @PreDestroy 애너테이션

@PostConstruct는 서블릿이 초기화된 후, init() 메서드가 호출되기 직전에 실행되는 메서드를 지정하는 애너테이션입니다. 반대로 @PreDestroy는 서블릿이 종료될 때, destroy() 메서드가 호출되기 직전에 실행되는 메서드를 지정하는 데 사용됩니다.

예제 코드

package com.bluesharehub;

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;

@WebServlet("/lifecycle") // URL 패턴 설정
public class LifecycleServlet extends HttpServlet {

    // @PostConstruct 애너테이션: 서블릿 초기화 전에 실행
    @PostConstruct
    public void initPostConstruct() {
        System.out.println("서블릿이 생성되고 있습니다 (@PostConstruct 호출됨)");
    }

    // 서블릿 초기화 시 호출
    @Override
    public void init() throws ServletException {
        System.out.println("서블릿 초기화 중 (init() 호출됨)");
    }

    // 클라이언트 요청 처리 시 호출
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {
        System.out.println("서비스 메서드 호출됨 (service() 호출됨)");
        resp.setContentType("text/html;charset=UTF-8");
        resp.getWriter().write("<h1>서비스 메서드에서 요청 처리 중</h1>");
    }

    // @PreDestroy 애너테이션: 서블릿 종료 전에 실행
    @PreDestroy
    public void preDestroy() {
        System.out.println("서블릿이 종료되고 있습니다 (@PreDestroy 호출됨)");
    }

    // 서블릿이 제거되기 직전 호출
    @Override
    public void destroy() {
        System.out.println("서블릿 종료 중 (destroy() 호출됨)");
    }
}

위 코드에서는 서블릿이 생성되거나 종료될 때 실행되는 메서드들에 대한 로그가 콘솔에 출력됩니다. @PostConstruct는 서블릿이 생성된 후 호출되며, @PreDestroy는 서블릿이 제거되기 직전에 호출됩니다.

서블릿 생명주기 메서드의 흐름

서블릿이 실행되면 다음과 같은 순서로 생명주기 메서드가 호출됩니다.

  1. @PostConstruct: 서블릿이 초기화되기 전에 호출됩니다.
  2. init(): 서블릿의 초기 설정을 담당하며, 서블릿 컨테이너가 서블릿을 처음 로드할 때 한 번만 호출됩니다.
  3. service(): 클라이언트 요청을 받을 때마다 호출되며, 실제로 doGet()이나 doPost() 메서드가 실행됩니다.
  4. destroy(): 서블릿이 종료되기 직전에 호출됩니다.
  5. @PreDestroy: 서블릿이 종료되기 전에 마지막으로 호출되는 메서드입니다.

이 흐름을 통해 서블릿의 생명주기를 전체적으로 이해하고, 서블릿의 초기화와 종료 시에 필요한 작업을 정확하게 수행할 수 있습니다.

함께 보면 좋은 이전 게시글

위로 스크롤