자바(Java)/JAVA 2EE

서블릿의 라이프 사이클과 기본 상속 관계

본클라쓰 2010. 12. 5. 17:16

 서블릿은 독자적으로 실행되는 프로그램이 아니다. 웹 컨테이너를 통해 서블릿은 실행되는데 웹 컨테이너는 웹 서버에서 전달받은 클라이언트의 요청에 따라서 요청을 처리할 서블릿 객체 인스턴스가 존재하면 요청을 처리하고, 없다면 서블릿 객체 인스턴스를 생성하여 요청을 처리한다.

 

 따라서 서블릿은 컨테이너에 종속적으로 라이프 사이클을 가지게 된다. 컨테이너는 서블릿 객체를 생성할 때 init() 메소드를 호출하여 서블릿을 초기화하며 서블릿이 수행해야할 모든 작업이 끝나면 destory() 메소드를 호출하여 서블릿 객체의 인스턴스를 해제한다. 서블릿 객체의 생성과 소멸을 컨테이너가 담당하며 소멸시도 컨테이너가 알아서 필요한 경우 수행하게 된다.

 

 그럼 서블릿 컨테이너는 해당 요청을 수행할 서블릿을 어떻게 확인하는가? 그것은 서블릿 컨테이너의 배포서술자(DD)를 확인하여 요청과 매핑 시킬 서블릿을 확인한다. 대표적인 배포서술자는 web.xml 파일이다. web.xml 설정에 요청과 해당 요청을 수행할 서블릿을 매핑시켜 요청을 수행하게 된다.

 

 또한, 서블릿을 작성할 때는 미리 작성되어 있는 해당 프로토콜에 해당하는 서블릿 클래스를 상속받아 작성해야 하는 규칙이 있다. 따라서 미리 작성되어 있는 서블릿 클래스의 특징을 알 필요가 있다.

 

 

 

서블릿 프로그래밍을 위한 기본 상속 관계

 

서블릿은 GenericServlet 클래스를 상속받아 구현된 클래스를 말한다. GenericServlet 클래스는 Servelt 인터페이스와 ServletConfig 인터페이스를 구현한 클래스로 두 인터페이스에서 정의한 메소드 대부분을 구현하고 service() 메소드만 추상 클래스로 남겨둔 클래스이다. 다음의 계층도를 보자.

 

[사진출처] http://www.java-school.net/jsp/04.php

 

 Servlet 인터페이스와 SerlvetConfig 인터페이스를 구현한 GenericSerlvet클래스는 service() 메소드만 추상으로 남겨두었다. 이 service() 메소드는 개발자가 직접 요청을 수행할 내용을 작성하는 부분이다. 우선 Servlet 인터페이스와 ServletConfig 인터페이스에서 정의한 메소드를 확인해 보자.

 

 

Servlet 인터페이스 메소드

 

메소드

설명

void init()

컨테이너가 서블릿 인스턴스를 생성할 때 맨 먼저 호출하는 메소드

void destory()

컨테이너가 서블릿 인스턴스를 소멸시킬 때 호출하는 메소드

ServletConfig getServletConfig()

ServletConfig 객체를 반환

String getServletInfo()

작성자, 버전, 판권 등의 서블릿 정보를 반환

abstract void service(ServletRequest req, ServetResponse res)

실제 개발자가 구현해야 할 부분으로 서블릿 컨테이너가 해당 요청을 수행할 때 호출하는 메소드

 

 

ServletConfig 인터페이스 메소드

 

메소드

설명

String getInitParameter(String name)

name으로 지정된 초기화 파라미터의 값을 문자열로 반환

Enumeration getInitParameterNames()

서블릿의 초기화 파라미터의 이름을 문자열 객체의 Enumeration으로 반환

ServletContext getServletContext()

ServletContext 객체를 반환

String getServletName()

서블릿 이름을 반환

 

 GenericServlet 클래스는 Servlet 인터페이스와 ServletConfig 인터페이스를 구현했으며 추가적으로 다음의 메소드를 작성해 놓았다.

 

메소드

설명

void log(String msg)

지정한 메시지를 서블릿 이름 앞에 두고 서블릿 로그 파일 작성

void log(String msg, Throwable t)

예외 그 상세를 설명하는 메시지와 스택의 트레이스를 서블릿 이름앞에 두고 로그 파일 작성

 

 일반적인 서블릿 프로그램을 작성한다는 것은 GenericServlet 클래스를 상속받아 추상 메소드인 service() 메소드를 구현하는 것을 말한다. 서블릿 컨테이너는 클라이언트로부터 요청을 받은 경우 해당 요청을 ServletRequest 객체로 변환하고 ServletRespone객체와 함께 서블릿에 전달한다. 이 때 해당 서블릿의 service() 메소드를 호출하여 수행하며 결과를 서블릿 컨테이너가 클라이언트에게 반환하는 것이다.