Servlet


Servlet 은 웹 서버 내에서 웹 페이지를 동적으로 생성하는 Java 기반의 웹 애플리케이션 프로그램이다.

Servlet 은 웹 클라이언트로부터 요청을 받고 특정 로직을 수행한 뒤 응답을 보낸다.

Java 에서 Servlet 은 인터페이스로 제공되는데, 프로토콜에 독립적인 GenericServlet 이나 HTTP 요청을 처리할 수 있는 HttpServlet 을 사용할 수 있다.

Servlet 의 생명주기


init(ServletConfig config)

init() 메서드는 Servlet 이 서비스에 배치되고 있음을 Servlet 에게 알리기 위해 톰캣과 같은 ServletContainer 에 의해 호출된다.

ServletContainerServlet 을 인스턴스화한 후 init() 메서드를 최초에 한 번 호출한다. Servlet 이 요청을 수신하기 위해선 init() 메서드가 성공적으로 완료되어야 한다.

service(ServletRequest req, ServletResponse res)

Servlet 이 요청을 처리할 수 있도록 ServletContainer 에 의해 호출된다.

service() 메서드는 init() 메서드가 정상적으로 완료되었을 경우에만 호출된다.

Servlet 은 일반적으로 여러 요청을 동시에 처리할 수 있는 멀티 스레드 ServletContainer 에서 처리된다. 때문에, Servlet 을 구현할 때 파일, 네트워크 커넥션, 서블릿의 클래스 및 인스턴스 변수과 같은 공유 리소스에 대한 접근을 동기화해주어야 한다.

destroy()

destroy() 메서드는 Servlet 이 서비스에서 제거되고 있음을 Servlet 에게 알리기 위해 ServletContainer 에 의해 호출된다. 이 메서드는 Servlet 내의 모든 스레드가 종료되거나 timeout 기간이 지난 후에만 호출된다. ServletContainer 가 이 메서드를 호출한 후에는 해당 Servletservice() 메서드를 호출하지 않는다.

이 메서드는 Servlet 이 보유한 메모리, 스레드 등의 리소스를 정리할 기회를 제공하고 모든 영속 상태를 메모리에 있는 Servlet 의 현재 상태와 동기화 되도록 한다.

Servlet Container


ServletContainer 는 클라이언트의 요청을 받고 응답할 수 있도록 소켓으로 통신하고 요청에 맞는 Servlet 을 찾아 요청을 처리하는 등 전반적인 Servlet 의 관리를 담당한다.

대표적인 ServletContainerTomcat 이 있다.

Servlet Container 의 역할


웹 서버와 통신 지원

ServletContainerServlet 과 웹 서버가 통신할 수 있도록 도와준다. 이러한 통신 과정을 생략할 수 있도록 해주기 때문에 개발자는 Servletservice() 메서드에서 비즈니스 로직을 구현하는데 집중할 수 있다.

Servlet 의 생명주기 관리

ServletContainerServlet 을 인스터스화하고 init() 를 호출해 Servlet 을 초기화한다.

요청이 들어오면 service() 메서드를 통해 요청을 처리하고 Servlet 의 역할이 종료되면 destroy() 를 호출하여 GC 대상이 되도록 한다.

멀티스레드 지원 및 관리

ServletContainer 는 요청이 들어올 때 마다 요청을 처리할 Java 스레드를 새로 생성한다. 다중 스레드 생성 및 운영을 통해 동시 요청을 처리할 수 있다.