본문 바로가기

Web Programing Language/JSP-servlet

서블릿 프로그래밍 #3 - 서블릿 객체의 라이프 사이클


오늘은 서블릿의 라이프 사이클에 대해서 알아보겠습니다.

위의 그림이 서블릿 라이프 사이클의 전부입니다.













이렇게 하면 좀 그렇죠?

맨 위부터 말씀드릴게요 


1. init( ) 메소드

처음에 서블릿이 메모리에 로드(Load) 되면 init() 메소드가 실행됩니다. 서블릿이 서비스 하기 위해서 필요한 초기 작업을 수행하는 것인데요. 이렇게 말을 하니 감이 잘 안잡히지요?

예를 들어 보겠습니다.

서블릿 객체가 실행되는데 파일이 필요하거나, 데이터 베이스에 연결을 하는 작업 들을 미리 해놓는 거지요.

참고로, 위 작업은 파일이나 데이터 베이스를 메모리에 올려놓는 작업인데,,, 로드 된 후에는 계속 메모리에 남아 있으면서, 클라이언트의 요청을 처리합니다.


2. service( ) 메소드

init 에 의해서 초기화가 끝났습니다. 이후에 서블릿은 클라이언트의 요청이 있을 때마다 스레드(Thread)가 생성 되어서 병행적으로 service() 메소드를 수행합니다!

쉽게 풀이해서 클라이언트가 접속 할 때마다 해당 객체가 만들어지는데, 해당 객체는 스레드라는 메모리에 로딩이 되고, init에서 초기화 시킨 데이터를 활용하여 임무를 수행한다.

라고 생각 하시면 됩니다!




그런데 여기서 문제가 생깁니다. 바로 병행성 문제! 라는 건데요.

예를 들어보겠습니다.

play 라는 객체를 만들었는데 그 객체는 데이터 베이스에 연결해서 게임에 접속하는 id를 관리하는 객체라고 합시다.


갑이라는 사람이 을의 아이디를 지웠습니다.

그런데 동시에 을이라는 사람이 자신의 회원 정보를 수정했지요.


여기서 문제가 발생합니다. 동시에 한가지 정보를 다루는 일이 생길 수 있다는 것이지요. init 에서 초기화 시킨 데이터 베이스나 파일은 하나기 때문입니다.


이러한 문제를 해결하는 방법은 두가지인데

하나는 SingleThreadModel 인터페이스를 구현한다. synchronized를 사용해서 함수 혹은 코드의 일부분에 락을 건다.

이 두가지 방법입니다.

여기서 다 설명하기에는 긴 내용이기 때문에 다음에 이 것만 가지고 다시 말씀을 드리도록 하지요.





다시 본론으로 돌아가겠습니다. 원래 내용이 생각이 안나시는 분을 위해서 구분을 해두었습니다.

아무튼 제일 중요한 것은 클라이언트의 요청이 있을때마다 스레드에 올린 객체에서 맨 처음 실행되는 부분이 바로 service( ) 메소드라는 겁니다.

호출 된 service( ) 메소드는 HTTP 의 method 타입에 따라 GET 방식이면 doGet( ) 메소드를, POST 방식이면 doPost( ) 메소드를 호출하는 것입니다.


3. destroy( ) 메소드

destroy 메소드가 실행되는 시점은 다음과 같습니다.

 1.  서블릿이 더 이상 서비스를 하지 않는다.

 2.  메모리가 부족하여 메모리를 다시 찾아야 한다.

하는 경우이지요.

즉, 해당 객체가 이 세상에서 사라질 때, 실행된다는 것입니다.

이 부분은 init( ) 과 반대되는 역할을 한다고 보시는게 편할 겁니다.

 열려있는 데이터 베이스를 닫고, 파일을 unload 시키는 거지요.

참 쉽지요??



끝!