Servlet Container
서블릿을 관리해주는 컨테이너
- 서블릿을 만들었으면 서블릿을 관리해주는 것이 필요하다
- 서블릿이 어떤 역할을 수행하는 정의서라면, 서블릿 컨테이너는 그 정의서를 보고 수행한다고 생각하면 된다
- 클라이언트의 요청을 받아주고 응답을 할 수 있게 웹 서버와 소켓으로 통신한다
- 대표적으로 Tomcat 이 있다
- Tomcat은 웹 서버와 통신하여 JSP와 Servlet이 작동하는 환경을 제공해준다
Servlet Container의 역할
웹 서버와의 통신 지원
- 웹 서버와 통신하려면 소켓을 만들고 listen, accept 등을 해야 한다
- 하지만 서블릿 컨테이너는 이러한 기능을 API로 제공하여 복잡한 과정을 생략할 수 있게 해준다
- 그리하여 개발자가 서블릿에 구현해야 할 비지니스 로직에 대해서만 집중할 수 있도록 도와준다
서블릿 생명주기 관리, Servlet Life Cycle Management
- 서블릿 컨테이너는 서블릿의 탄생과 죽음을 관리한다
- 서블릿 클래스를 로딩하여 인스턴스화 한다
- 초기화 메소드를 호출한다
- 요청이 들어오면 적절한 서블릿 메소드를 호출한다
- 서블릿이 생명을 다한 순간에는 적절하게 GC를 진행하여 편의를 제공한다
멀티 스레드 지원 및 관리
- 서블릿 컨테이너는 요청이 올 때마다 새로운 자바 스레드를 하나 생성한다
- HTTP 서비스 메소드를 실행하고 나면 스레드는 자동으로 죽게 된다
- 원래 스레드를 관리해야 하지만 서버가 다중 스레드를 생성 및 운영해주니 안정성에 대해서 걱정하지 않아도 된다
선언적 보안 관리
- 서블릿 컨테이너를 사용하면 개발자는 보안에 관련된 내용을 서블릿 또는 자바 클래스에 구현하지 않아도 된다
- 보통 보안 관리는 XML 배포 서술자에 기록하므로 보안에 대해 수정할 일이 생겨도 자바 소스 코드를 수정하여 다시 컴파일 하지 않아도 된다
Servlet 생명주기
- service() 의 메소드는 아래의 것들이 있다
- doGet()
- doPost()
- doHead()
- doOptions()
- doTrace
- etc…
- 클라이언트의 요청이 들어오면 컨테이너는 해당 서블릿이 메모리에 있는지 확인한다
- 없을 경우 init() 메소드를 호출하여 적재한다
- init() 메소드는 처음 한 번만 실행되기 때문에 서블릿의 스레드에서 공통적으로 사용해야 하는 것이 있다면 오버라이딩 하여 구현하면 된다
- 실행 중 서블릿이 변경될 경우, 기존 서블릿을 파괴하고 init()을 통해 새로운 내용을 다시 메모리에 적재한다
- 없을 경우 init() 메소드를 호출하여 적재한다
- init()이 호출된 후 클라이언트의 요청에 따라서 service() 메소드를 통해 요청에 대한 응답이 doGet()가 doPost()로 분기된다
- 이때 서블릿 컨테이너가 클라이언트의 요청이 오면 가장 먼저 처리하는 과정으로 생성된 HttpServletRequest, HttpServletResponse에 의해 request와 response가 제공된다
- 컨테이너가 서블릿에 종료 요청을 하면 destroy()메소드가 호출되는데 마찬가지로 한 번만 실행되며 종료 시에 처리해야 하는 작업들은 destroy()에 오버라이딩 하여 구현하면 된다
This post is licensed under CC BY 4.0 by the author.