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을 실행하기까지의 과정:
처리 단계별 설명
- HTTP 요청: 브라우저가 HTTP 요청을 WAS로 전송
- Context Path 확인: 요청 URL에서 어떤 애플리케이션인지 식별 (예:
/shop,/admin) - URL Mapping 확인: Context 내에서 어떤 Servlet이 처리할지 결정 (예:
/hello→ HelloServlet) - Servlet 상태 확인: 해당 Servlet 인스턴스가 존재하는지 확인
- 처음 요청인 경우: 새 인스턴스 생성 → init() 호출
- 이미 존재하는 경우: 기존 인스턴스 재사용
- Thread 할당: Thread Pool에서 요청 처리용 Thread 할당
- 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