Servlet 생명주기 (Life Cycle)
클라이언트가 요청을 할 때, Servlet은 아래와 같이 객체를 생성하고, 초기화하고, 요청을 처리하는 생명주기를 가지고 있습니다.

1. 클라이언트로부터의 요청이 서버의 서블릿 컨테이너(아파치 톰캣)으로 전달.
2. 컨테이너의 배포 서술자(Deployment Descriptor)에서 매핑된 서블릿 클래스를 탐색.
- 배포 서술자(DD:Deployment Descriptor)는 서블릿 컨테이너와 서블릿 클래스를 매핑하는 xml 파일.

- servlet 3.0부터는 xml 파일이 아닌 어노테이션으로도 지원(
@WebServlet("/")
).
3. 매핑된 Servlet 클래스에 해당하는 객체가 메모리에 로드되어 있지 않는 경우 해당 Servlet 객체를 생성, 메모리에 적재.
4. init() 메소드 호출
public void init(ServletConfig config) throws ServletException;
- 서블릿 컨테이너에서 서블릿 인스턴스 생성 후 단 한번 호출.
- 서블릿 컨텍스트 초기화를 목적으로 호출됨.
- request를 받기 전 반드시 호출되어야 함.
5. service() 메소드 호출
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;
- 서블릿 컨테이너에 의해 호출되며 request에 따른 response를 반환.
- init() 메서드가 완전히 완료된 이후에 호출 가능.
- 일반적으로 멀티 스레드 서블릿 컨테이너에 의해 동시 호출되기 때문에, 개발자는 service() 메소드 내에서 사용하는 리소스의 동시성 이슈를 신경써야함.
- apache 톰캣의 경우, request의 http 메소드(GET, POST, PUT, DELETE 등)에 따라서 doGet(), doPost(), doPut(), doDelete() 등 처리 메서드 실행.
6. 서블릿 컨테이너 서비스 종료시 destroy() 메소드 호출.
public void destroy();
- 서블릿 컨테이너에서 서비스 종료시점에 단 한번 호출.
- 서블릿의 service() 메서드 실행 쓰레드가 모두 종료된 이후에 호출됨.
- 이 메서드 호출 이후엔 service() 메서드는 더이상 호출 불가능.
- 서블릿 내부에서 사용하는 리소스를 정리하기 위한 목적으로 호출됨.

출처