서블릿

자바로 만든 CGI 프로그램을 '서블릿(Servlet)'이라고 부른다. 자바 서블릿이 CGI 프로그램과 다른 점은, 웹 서버와 직접 데이터를 주고받지 않으며, 전문 프로그램에 의해 관리된다는 것이다.

서블릿 컨테이너

서블릿의 생성과 실행, 소멸 등 생명주기를 관리하는 프로그램을 '서블릿 컨테이너(Servlet Container)'라 한다. 서블릿 컨테이너가 서블릿을 대신하여 CGI 규칙에 따라 웹 서버와 데이터를 주고받는다.

서블릿 만들기

서블릿 작성

src/servlets/HelloWorld.java

package servlets;

import javax.servlet.*;
import java.io.IOException;

public class HelloWorld implements Servlet {

    ServletConfig config;

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init() 호출됨");
        this.config = config;
    }

    @Override
    public ServletConfig getServletConfig() {
        System.out.println("getServletConfig() 호출됨");
        return this.config;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse)
            throws ServletException, IOException {
        System.out.println("service() 호출됨");
    }

    @Override
    public String getServletInfo() {
        System.out.println("getServletInfo() 호출됨");
        return "version=1.0;author=eunji;copyright=eunji 2019";
    }

    @Override
    public void destroy() {
        System.out.println("destory() 호출됨");
    }
}

javax.servlet.Servlet 인터페이스

서블릿 클래스는 반드시 javax.servlet.Servlet 인터페이스를 구현해야 한다. 서블릿 컨테이너가 서블릿에 대해 호출할 메서드를 정의한 것이 Servlet 인터페이스이다.

서블릿의 생명주기와 관련된 메서드: init(), service(), destroy()

  • init(): 서블릿 컨테이너가 서블릿을 생성한 후 초기화 작업을 수행하기 위해 호출하는 메서드
  • service(): 클라이언트가 요청할 때 마다 호출되는 메서드로 서비스 작업을 수행하는 메서드. 이 곳에 서블릿이 해야 할 일을 작성하면 된다.
  • destroy(): 서블릿 컨테이너가 종료될 때 호출되는 메서드

Servlet 인터페이스 기타 메서드: getServletConfig(), getServletInfo()

서블릿 정보를 추출할 필요가 있을 때 호출하는 메서드이다.

  • getServletConfig(): 서블릿 설정 정보를 다루는 ServletConfig 객체를 반환한다. 이 객체를 통해 서블릿 이름과 서블릿 초기 매개변수 값, 서블릿 환경정보를 얻을 수 있다.

  • getServletInfo(): 서블릿을 작성한 사람에 대한 정보라든가 서블릿 버전, 권리 등을 담은 문자열을 반환

서블릿 배치 정보 작성

배치 설명서 파일(web.xml)을 열고 다음과 같이 HelloWorld 서블릿 배치 정보를 추가한다.

web.xml 파일을 배치 기술서(Deployment Descriptor) 또는 약어로 'DD파일' 이라고 부른다. 웹 애플리케이션의 배치 정보를 담고 있는 파일이다. 따라서 서블릿을 만들었으면 DD 파일에 배치 정보를 등록해야 한다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!-- 서블릿 선언-->
    <servlet>
        <servlet-name>Hello</servlet-name>
        <servlet-class>servlets.HelloWorld</servlet-class>
    </servlet>

    <!-- 서블릿을 URL과 연결 -->
    <servlet-mapping>
        <servlet-name>Hello</servlet-name>
        <url-pattern>/Hello</url-pattern>
    </servlet-mapping>

서블릿 구동 절차

Chapter03(1)-1

  1. 클라이언트의 요청이 들어오면 서블릿 컨테이너는 서블릿을 찾는다.
  2. 만약 서블릿이 없다면, 서블릿 클래스를 로딩하고 인스턴스를 준비한 후 생성자를 호출한다. 그리고 서블릿 초기화 메서드인 init()를 호출한다.
  3. 클라이언트의 요청을 처리하는 service() 메서드를 호출한다.
  4. service() 메서드에서 만든 결과를 HTTP 프로토콜에 맞추어 클라이언트에 응답하는 것으로 요청처리를 완료한다.
  5. 만약 시스템 운영자가 서블릿 컨테이너를 종료하거나, 웹 어플리케이션을 종료 한다면,
  6. 서블릿 컨테이너는 종료되기 전에 서블릿이 마무리 작업을 수행할 수 있도록 생성된 모든 서블릿에 대해 destroy() 메서드를 호출한다.

톰캣 서버의 콘솔창을 통한 구동 절차 확인

다음 그림과 같이 콘솔창 결과를 보면 init()가 먼저 호출된 후 service()가 호출된 것을 알 수 있다.

Chapter03(1)-2

웹 브라우저에서 '새로 고침' 버튼을 여러 번 클릭하면 출력 결과는 다음과 같다.

Chapter03(1)-3

destroy()가 호출되는 경우를 확인하는 방법은 톰캣 서버를 종료하는 것이다.

Chapter03(1)-4