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

Servlet의 생명 주기는 Servlet 컨테이너에 의해 관리되며, 아래와 같은 단계를 거칩니다:
@PostConstruct는 Servlet 객체가 생성된 후, init() 메서드가 호출되기 전에 실행됩니다. 이 어노테이션은 초기화 작업이 필요한 경우에 유용합니다.
@PostConstruct
public void postConstruct() {
System.out.println(" -- postConstruct() --");
}
주요 포인트
init()) 호출 전에 사용자 정의 작업을 수행할 수 있습니다. init() 메서드는 Servlet이 처음 초기화될 때 한 번 호출됩니다. 주로 설정 파일 읽기, 리소스 초기화 등의 작업을 수행합니다.
@Override
public void init() throws ServletException {
System.out.println(" -- init() --");
}
주요 포인트
init() 메서드는 초기화 실패 시 예외를 던질 수 있습니다. 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 요청을 처리합니다. @PreDestroy는 Servlet이 제거되기 전에 호출됩니다. 주로 종료 작업을 수행하는 데 사용됩니다.
@PreDestroy
public void preDestroy() {
System.out.println(" -- preDestroy() --");
}
주요 포인트
destroy() 메서드 호출 전 실행됩니다. destroy() 메서드는 Servlet이 메모리에서 해제될 때 호출됩니다. 종료 작업을 수행합니다.
@Override
public void destroy() {
System.out.println(" -- destroy() --");
}
주요 포인트
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() -- ");
}
}
@PostConstruct → init() 실행. 초기 설정 작업 수행. service() → 요청 방식에 따라 doGet() 또는 doPost() 호출. @PreDestroy → 종료 작업 수행. destroy() → 리소스 정리 후 Servlet 객체 메모리 해제. 리소스 효율 관리
init()과 destroy()를 활용해 데이터베이스 연결과 같은 리소스를 효율적으로 관리하세요. 로그 남기기
테스트와 디버깅
@PostConstruct와 @PreDestroy를 활용하면 초기화와 종료 작업의 디버깅이 쉬워집니다.