View

Servlet

Servlet(서블릿)이란 자바 클래스 종류 중 하나로 요청-응답 프로그래밍 모델을 제공하는 서버(일반적인 경우 web)의 기능을 구현, 확장하기 위한 클래스이다. javax.servlet, javax.servlet.http 패키지에 서블릿 구현을 위한 인터페이스와 클래스들이 있다. 모든 서블릿 구현체들은 서블릿 라이프사이클을 정의한 Servlet 인터페이스를 구현해야 하며 일반적인 서비스를 구현할 경우 GenericServlet를 사용/상속해서 구현할 수 있다. HttpServlet의 경우 HTTP 서비스를 핸들링하기 위한 doGet, doPost 메소드를 제공하고 있다.

Servlet.java

총 5개 실제 서블릿 코드를 보면 총 5개의 미구현 메소드가 있다. 이 메소드들은 서블릿의 라이프 사이클에 따라 호출되는 메소드 들이다.

  1. Serlvet class is loaded : 요청이 발생했을 때 서블릿 클래스가 서블릿 컨테이너에 의해 로딩된다.
  2. Servlet instance is created\ : 서블릿 컨테이너는 서블릿 클래스를 읽어서 인스턴스를 생성하는데 이 인스턴스는 서블릿 라이프사이클에서 고유하다.
  3. init method is invoked : 서블릿 컨테이너가 서블릿의 init() 메소드를 호출한다.
  4. service method is invoked : 요청을 처리하기 위한 service() 메소드를 호출한다.
  5. destroy method is invoked : 서블릿 인스턴스가 삭제되기 전에 deploy() 메소드를 호출한다. 이 메소드를 통해서 스트림을 닫거나 스레드를 정리할 수 있다.

Servlet Container, Servlet Context

앞서 설명했다시피 서블릿은 요청-응답 모델에서 서버가 응답하기 위해 하나의 서블릿이 어떻게 동작해야할지에 대한 스펙이며 개발자는 애플리케이션 서비스를 위해 서블릿 구현체를 구현해야 한다. 이 서블릿 구현체를 구동시켜주는 것이 Servlet Container(서블릿 컨테이너)이다. 서블릿 컨테이너는 일반적으로 HTTP를 처리할 수 있는 웹 서버 형태로 HTTP 요청이 들어오면 해당 요청을 처리할 수 있는 적절한 서블릿을 찾아 앞서 설명했던 라이프사이클에 따라 서비스를 제공하는 역할을 한다.

가장 대중적으로 잘 알려진 웹 서블릿 컨테이너, 웹 컨테이너로는 tomcat이 있다. 톰캣은 web server를 가지고 있으면서 HTTP 요청이 들어오면 서블릿 컨테이너로 요청을 넘기고 서블릿 컨테이너는 적절한 서블릿을 읽어서 구동, 즉 라이프사이클을 한번 돌리는 작업을 한다. 이 때 요청을 처리하기 위한 플로우를 위해 요청 당 하나의 스레드를 할당한다. 요청에 대한 작업이 끝나면 서블릿 컨테이너는 서블릿이 반환하는 결과를 적절한 모양으로 적절한 위치에 반환하는 역할을 하게 되는데 톰캣같은 웹 컨테이너의 경우 http 요청에 대한 결과 값 반환이 그 역할이다.

Servlet Context

서블릿 컨테이너는 서블릿들이 공통적으로 참조할 수 있는 오브젝트를 하나 생성하는데, 이것이 바로 Servlet Context(서블릿 컨텍스트)이다. 개발자가 구현한 서블릿들을 모은 하나의 프로젝트(etc. war)를 웹 서블릿 컨테이너인 톰캣에 배포하면 톰캣은 web.xml 파일을 참고하여 서블릿 컨텍스트를 생성하고 이는 웹 애플리케이션(배포한 프로젝트로 생성되는 하나의 인스턴스) 당 하나가 생성된다. 서블릿 컨텍스트는 다양한 데이터를 저장할 수 있는데, 예를들어 톰캣에서 JSP 페이지를 내려줄 때 모든 페이지(서블릿)에서 공통적으로 사용되는 HTML 타이틀, footer의 기업정보 등 서블릿들이 공통적으로 접근해서 참조할 수 있는 정보들을 저장할 수 있다.

Reference

Share Link
reply