자바 서블릿(Servlet, 이하 서블릿)
은 동적 웹 페이지를 구현하기 위한 자바 클래스입니다.
서블릿
은 서버측에서 실행되다가 클라이언트측에서 요청이 발생하면 해당 요청에 대한 작업을 수행한 결과를 다시 클라이언트(웹 브라우저)에 전송하는 기능을 수행합니다.
서블릿
은 다음과 같은 과정을 거치며 동작합니다.
클라이언트가 웹 서버에 요청을 하면 웹 서버는 요청을 웹 애플리케이션 서버(WAS)로 위임합니다. 위임받은 WAS는 요청에 맞는 서블릿을 실행하여 결과를 얻습니다. 이렇게 나온 결과를 다시 WAS, 웹 서버로 보면 웹 서버는 응답을 클라이언트에 보내게 되어 클라이언트에서 결과를 얻게 됩니다.
웹 서버
는 정적 웹 콘텐츠를 제공하거나 동적 컨텐츠 제공을 위한 요청을 WAS, 처리 결과를 클라이언트로 전달하는 역할을 합니다.
웹 애플리케이션 서버
는 클라이언트 요청에 따른 동적 컨텐츠를 제공하는 서버 또는 프로그램을 의미합니다.기능 분리로 부터 오는 보안성이나 안정성 등을 위해 두 서버의 개념을 분리해서 사용하고 있습니다.
서블릿
은 다음과 같은 특징들이 있습니다.
서블릿
은 계층 구조를 가지고 구성되어 있습니다.Servlet, ServletConfig 인터페이스
를 GenericServlet 추상 클래스
가 추상 메소드로 구현합니다. 그리고 이 추상 클래스를 HttpServlet 클래스
가 상속받은 형태로 구성되어 있습니다.
서블릿을 구성하는 각 구성원들의 기능은 다음과 같습니다.
Servlet: 서블릿 관련 추상 메소드들이 선언되어 있습니다. init(), service(), destroy(), getServletInfo(), getServletConfig()
ServletConifg: 서블릿 기능 관련 추상 메소드들이 선언되어있습니다. getInitParameter(), getInitParameterNames(), getServletContext(), getServletName()
GenericServlet: Servlet, ServletConfig 인터페이스
를 구현하여 일반적인 서블릿 기능을 구현하고 있습니다. 이 클래스를 상속받아서 구현하는 사용자 서블릿
은 service()
를 오버라이딩해서 구현합니다.
HttpServlet: GenericServlet 클래스
를 상속받아 HTTP를 사용하는 웹 브라우저에서 서블릿 기능을 수행합니다. 주로 웹 브라우저 기반 서비스를 제공하는 서블릿을 작성할 때 상속받아서 사용합니다.
요청시 service()
호출 과정에서 doGet(), doPost()
가 차례대로 호출됩니다.
이 중 HttpServlet
은 HTTP 통신에 적합한 클래스이기에 서블릿을 이용한다면 자주 사용되게 됩니다. 그래서 HttpServlet
의 주요한 메소드들 몇 가지만 알아보고 넘어가려고 합니다.
메소드 | 설명 |
---|---|
public service(ServletRequest req, ServletResponse resp) | 클라이언트의 요청을 protected service() 로 전달합니다. |
protected service(ServletRequest req, ServletResponse resp) | 요청을 public service() 에서 전달받아 doXxxxx() 메소드를 호출합니다. |
protected doGet(HttpServletRequest req, HttpServletResponse resp) | GET 요청을 수행합니다. |
protected doPost(HttpServletRequest req, HttpServletResponse resp) | POST 요청을 수행합니다. |
protected doDelete(HttpServletRequest req, HttpServletResponse resp) | DELETE 요청을 수행합니다. |
protected doHead(HttpServletRequest req, HttpServletResponse resp) | HEAD 요청을 수행합니다. |
각 HTTP 요청 방식에 대한 내용은 이 포스트를 참조해주세요.
나머지 HttpServlet의 메소드는 문서에서 확인하실 수 있습니다.
서블릿도 자바 클래스이기 때문에 서블릿을 실행하면 초기화, 인스턴스화, 기능 수행, 소멸 과정을 거칩니다.
이 과정을 서블릿 생명주기(Servlet Lifecycle)
이라고 부르며 생명주기 각 단계에서 호출되는 메소드들을 서블릿 생명주기 메소드
라고 부릅니다.
생명주기 메소드 | 설명 |
---|---|
init() | 서블릿을 처음 메모리에 등록할 때 처음 한 번만 호출 서블릿 생성시 초기화 작업 수행 |
service() -> doXxxxx() | 요청마다 매번 호출 HTTP요청에 맞는 doXxxxx()를 호출하여 doXxxxx()는 실제 요청에 대한 작업을 수행 |
destroy() | 서블릿 종료 요청(메모리 소멸)이 오면 호출 서블릿 마무리 작업 수행 |
생명주기 메소드 중 init(), destroy()
는 초기화와 마무리 작업을 담당하고 있기에 해당 작업이 별도로 필요하지 않다면 작성하지 않아도 됩니다.
그러나 doXxxxx()
는 요청에 대한 실제 작업을 수행하는 메소드이기 때문에 반드시 구현해주어야합니다.