finerss's world!

service() +1

언제 서블릿 클래스를 로딩하는가?
서블릿의 생성자는 언제 호출되는가?
얼마나 올랫동안 서블릿은 살아있는가?
서블릿은 언제 자원을 초기화하는가?
또 사용한 자원은 언제 꺠끗이 청소 하는가?

서블릿의 인생은 사실 매우 간단하다.
왜냐하면 서블릿은 오직 하나의 중요한 상태를 가지기 떄문인데, 바로 초기화(initialized)를 말한다.
서블릿이 초기화 되지 않았다는 말은, 초기화되는중(생성자를 실행하거나 init()메소드를실행하거나)이거나
아니면 소멸되는 중(destroy() 메소드를 실행)이거나, 그것도 아니면 존재하지 않음 (does not exist) 중 하나이다.

(위 그림에서보면 처음 init()으로 서블릿을 생성하고나면 다음 이서블릿을 호출할때는 생성하는것이아니라 스레드를 만들어 계속 service() 한다.) 


당신이 작성한 서블릿은 생명주기 메서드를 상속 받아야하는데
서블릿 API를 살펴보면


Servlet 인터페이스에선 service(), init(), destroy() 이 세개가 생명주기(라이프사이클) 메소드이다.
GenericServlet 클래스는 추상클래스이다. 필요한 대부분의 서블릿 메소드를 구현하였으며, 여기에는 Servlet 인터페이스에 정의된 것도있다. 이클래스를 상속받아 클래스를 생성할 일은 거의 없지만 대부분 서블릿의 '서블릿 행위' 라고하는 것들은 바로 이클래스로부터 나왔다는 것을 기억하자.
HttpServlet 클래스 역시 추상클래스이다. HTTP적인 측면을 반영하기 위해 service()메소드를 재정이한것이다. 즉 service() 메소드는 오로지 HTTP request와 HTTP response만 받아들이고 다른 어떤 서블릿 Request 와 response는 받지않는다.


서블릿 일생에 있어 3번의 중요한 순간들

1. init()

 컨테이너는 서블릿 인스턴스를 생성한 다음 init() 메소드를 호출한다. 이메소드는 service()메소드전에 실행되어야 한다.
클라이언트의 요청을 처리하기전에 서블릿을 초기화할 기회를 주는것이다.
초기화할 코드가 있다면 init()메소드를 재정의할수있다( 데이터베이스에대한 접속, 다른객체에 서블릿을 등록하는 등)


2. service()

 최초 클라이언트의 요청을 받았을때, 컨테이너는 새로운 스레드를 생성하거나 스레드풀로부터 서블릿을 가져와서 서블릿의 service() 메소드를 호출한다
클라이언트의 HTTP 메소드(GET, POST 등)를 참조하여 doGet() / doPost() 혹은 다른 메소드를 호출할지 판단한다.
재정의는 하지않으며 doGet()/ doPost() 를 재정의하여 HttpServlet의 service()가 이를 실행하도록 한다.


3.doGet()혹은 doPost()

 service() 메소드가 클라이언트의 HTTP 메소드(GET, POST등) 를 참조하여 doGet()/ doPost()를 호출한다.
여기서 doGet()/ doPost() 만 언급하는이유는 이것말고 나머지메소드는 사용할 경우가 거의없기떄문이다
이 메도드안에서 코딩작업을 하면된다.
doGet()/ doPost() 둘중 하나는 반드시 재정의해야한다.



서블릿초기화 : 객체가 서블릿이 되는 순간

서블릿의 일생은 컨테이너가 서블릿 파일을 찾아서 로딩할 떄부터 이다.(생성하는게아니다)
이작업은 컨테이너가 시작할때(예로 톰캣이 실행될때) 이루어지는데 컨테이너는 배포된 웹 애플리케이션이 어떤것이
있는지 체크하고 관련 서블릿 클래스 파일들을 검색한다.

첫번째 단계가 클래스를 찾는것인 셈이다.

클래스를 로딩하는것은 두번째 단계이다. 이작업은 컨테이너가 시작될떄 로딩되기도하고, 최초 클라이언트가 접슨시 로딩되기도 한다. 서블릿이 일찍 로딩하든 아니면 실행시 로딩하든 상관없이, service() 메소드는
서블릿 초기화가(서블릿 생성자 -> init()) 완전히 완료된다음 실행 된다.

생성자의 실행은 서블릿이 '존재하지 않음(dose not exist)' 상태에서 '초기화됨' 상태로 옮겨감을 의미한다
이는 클라이언트의 요청에 서비스할 준비가 되었다는 말이다. 하지만 생성자는 단지 객체를 만드는것이지 서블릿을 만드는 것이 아니다. 서블릿이 되기 위해서는 서블릿적인(servletness)을 내려 받아야 한다.

객체가 서블릿이 된다는 것은 서블릿에 고유한 권한을 가진다는것을 의미하는데 예를 들어 ServletContext를 가지고
컨테이너로부터 정보를 읽어올 수있는 능력 같은 것이다.(이는 뒤에 설명)

'공부 > Sevlets&JSP' 카테고리의 다른 글

ServletConfig 와 ServletContext  (0) 2011.06.27
Request, Response  (0) 2011.06.27
MVC 패턴  (0) 2011.06.24
서블릿 매핑, 배포 서술자(DD, Deployment Descriptor)  (0) 2011.06.23
서블릿 컨테이너(Servlet Container)  (1) 2011.06.22