Skip to Content
공부백엔드Servlet과 웹 서버2. Servlet 생명주기

Servlet Life Cycle

핵심 개념

Servlet의 생명주기는 IoC (Inversion of Control) 패턴의 대표적인 예다. 개발자는 Servlet 클래스를 작성하지만, 객체의 생성과 소멸은 Container가 제어한다.

왜 Container가 관리하는가?

  • 효율성: 하나의 Servlet 인스턴스로 모든 요청 처리 (싱글톤 패턴)
  • 자원 관리: DB 연결, 스레드 풀 등의 자원을 Container가 효율적으로 관리
  • 표준화: 모든 Servlet이 동일한 생명주기 패턴을 따름

Servlet Life Cycle 흐름

HTTP 요청 → WAS가 받음 → 처음 요청을 받는 경우? → YES: 객체를 생성 (new) → init() → service() 호출 → NO: 객체 생성하지 않음 → service() 호출 → 애플리케이션 종료 or redeploy 등 → destroy() 호출

Servlet 요청 처리 순서

WAS가 HTTP 요청을 받아서 Servlet을 실행하기까지의 과정:

처리 단계별 설명

  1. HTTP 요청: 브라우저가 HTTP 요청을 WAS로 전송
  2. Context Path 확인: 요청 URL에서 어떤 애플리케이션인지 식별 (예: /shop, /admin)
  3. URL Mapping 확인: Context 내에서 어떤 Servlet이 처리할지 결정 (예: /hello → HelloServlet)
  4. Servlet 상태 확인: 해당 Servlet 인스턴스가 존재하는지 확인
    • 처음 요청인 경우: 새 인스턴스 생성 → init() 호출
    • 이미 존재하는 경우: 기존 인스턴스 재사용
  5. Thread 할당: Thread Pool에서 요청 처리용 Thread 할당
  6. Servlet 실행: service() 메서드 호출하여 요청 처리

관련 메서드 상세 설명

init() 메서드

  • 호출 시점: Servlet 인스턴스 생성 직후 (단 1번)
  • 목적: 필요한 자원 초기화
  • 예시: DB 연결 풀 생성, 설정 파일 읽기, 캐시 초기화
  • 실패 시: ServletException 발생하면 해당 Servlet은 사용 불가

service() 메서드

  • 호출 시점: 모든 HTTP 요청마다
  • 동작 방식: HTTP 메서드를 확인하여 적절한 doXXX() 메서드 호출
    • GET 요청 → doGet()
    • POST 요청 → doPost()
    • PUT 요청 → doPut()
    • DELETE 요청 → doDelete()
  • 일반적으로 service()는 오버라이드하지 않음

destroy() 메서드

  • 호출 시점: 애플리케이션 종료, 재배포, Servlet 언로드 시
  • 목적: init()에서 생성한 자원 정리
  • 예시: DB 연결 종료, 파일 핸들 닫기, 스레드 풀 종료

실제 코드 예시

HelloServlet.java
@WebServlet("/hello") public class HelloServlet extends HttpServlet { public void init() { System.out.println("자원 초기화"); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.getWriter().append("Served at: ").append(request.getContextPath()); System.out.println("doGet 메서드 호출됨"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { response.getWriter().append("Served at: ").append(request.getContextPath()); System.out.println("doPost 메서드 호출됨"); } public void destroy() { System.out.println("자원 해제"); } }

실행 로그 예시

자원 초기화 doGet 메서드 호출됨 doGet 메서드 호출됨 doGet 메서드 호출됨 doGet 메서드 호출됨 doGet 메서드 호출됨 자원 해제
  • 처음 요청 시 한 번만 init() 호출
  • 매 요청마다 doGet/doPost 호출
  • 서버 종료 시 destroy() 호출

정리

  • Servlet은 Container가 생명주기를 관리한다
  • 하나의 Servlet 객체만 생성하며 멀티스레딩을 지원하여 동시 요청 처리
  • init() → service()/doXXX() → destroy() 순서로 진행
  • 개발자는 각 단계에서 필요한 로직만 구현하면 된다
Last updated on