서블릿 생명주기 메서드와 @PostConstruct, @PreDestroy 활용
서블릿(Servlet)은 자바 웹 애플리케이션에서 클라이언트의 HTTP 요청을 처리하고 응답을 생성하는 서버 측 컴포넌트입니다. 서블릿은 그 생명주기(Lifecycle) 동안 다양한 메서드를 호출하며, 이 과정에서 초기화부터 종료까지 여러 단계를 거칩니다. 이번 글에서는 서블릿의 기본 생명주기 메서드인 init()
, service()
, destroy()
에 더해, 추가적으로 @PostConstruct와 @PreDestroy 애너테이션을 활용하여 서블릿 생명주기 전반적으로 알아보겠습니다.
서블릿 생명주기
서블릿의 생명주기는 다음과 같은 단계로 나뉩니다.
- 서블릿 생성 및 초기화: 서블릿이 처음 생성될 때 호출되는
@PostConstruct
와init()
메서드를 통해 초기 설정을 수행합니다. - 요청 처리: 클라이언트가 요청을 보낼 때 서블릿의
service()
메서드가 호출되며, 이 메서드는doGet()
또는doPost()
메서드로 분기되어 요청을 처리합니다. - 서블릿 종료: 서블릿이 더 이상 사용되지 않으면
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
는 서블릿이 제거되기 직전에 호출됩니다.
서블릿 생명주기 메서드의 흐름
서블릿이 실행되면 다음과 같은 순서로 생명주기 메서드가 호출됩니다.
@PostConstruct
: 서블릿이 초기화되기 전에 호출됩니다.init()
: 서블릿의 초기 설정을 담당하며, 서블릿 컨테이너가 서블릿을 처음 로드할 때 한 번만 호출됩니다.service()
: 클라이언트 요청을 받을 때마다 호출되며, 실제로doGet()
이나doPost()
메서드가 실행됩니다.destroy()
: 서블릿이 종료되기 직전에 호출됩니다.@PreDestroy
: 서블릿이 종료되기 전에 마지막으로 호출되는 메서드입니다.
이 흐름을 통해 서블릿의 생명주기를 전체적으로 이해하고, 서블릿의 초기화와 종료 시에 필요한 작업을 정확하게 수행할 수 있습니다.
함께 보면 좋은 이전 게시글
- web.xml과 애너테이션으로 서블릿 매핑 및 GET/POST 요청 처리
- 서블릿에서 @WebServlet 애너테이션으로 여러 URL 패턴 처리하기
- JSP 내장 객체 사용법: request와 response
- JSP에서 세션 관리: 세션 시작, 데이터 저장 및 불러오기, 타임아웃
- JSP/Servlet 웹 애플리케이션에서 web.xml 활용한 에러 페이지 설정
이 글이 도움이 되셨다면 공유 부탁 드립니다.