[JSP] 서블릿의 일생과 생명주기

반응형




어제 작성한 MVC 패턴에 이어 오늘은 서블릿의 일생과 생명주기에 관해 포스팅 할까 합니다.
읽기전에 손가락 한번 클릭~ >_<

고마워요 ~ Chu ~ ♥


정말 꼭 몰라도 되는 내용입니다만,
아주 기본적인 것이기에 이해하고 나면 서블릿 & JSP 관련 공부에 많은 도움이 될꺼 같습니다.
( 어디까지나 제 생각 ㅠ )




서블릿의 일생

우선 먼저 알아야 할 점은 서블릿의 가장 중요한 상태는 초기화 상태 라는 것입니다.

무슨말인고 하니...
우선 아래의 시퀀스 다이어그램 비스무리한 그림으로 표시한 이미지를 보세요 ~^^;

그림을 잘 못그려서;;;

어쨋거나 저쨋거나 설명을 좀 덧붙이자면
● 처음으로 컨테이너는 서블릿 클래스를 로딩합니다.

● 그런 다음 서블릿의 생성자를 호출하여 인스턴스화를 하죠.

● 그리고 초기화메소드인 Init() 메소드를 호출합니다.
이 메소드는 서블릿에서
단 한번만 호출됩니다.
또한 꼭 init() 메소드는 service() 메소드 이전에 실행되어야 합니다.
서블릿을 초기화하는 기능을 합니다. 초기화할 코드가 있다면 이 메소드를 재정의 한 후 여기에 작성하면 되겠습니다. (ex : DB 접속 등 )

● 그 다음 service() 메소드를 호출합니다. 이것은 곧 doGet() 또는 doPost() 메소드를 호출하는 것이고, 이 메소드가 호출되면 새로운 스레드를 만들어 작업 처리를 하지요. 최초의 클라이언트 요청을 받으면 컨테이너는 준비하고있던 서블릿에 대한 스레드를 생성하여 service() 메소드를 호출합니다.

스레드 풀 기능(자주 쓰는 스레드를 풀이란 곳에 넣어두고 가져오고 반환하는 방식)도 있지만 여기에선 논외로 하겠습니다.

클라이언트의 HTTP 메소드를 분석하여 doGet() 또는 doPost() 메소드를 호출할지 여기서 결정합니다. service() 메소드는 재정의 하지 않고, doGet() , doPost() 메소드를 재 정의하여 HttpServlet 의 service() 메소드가 이것을 실행하도록 하면 됩니다.
결국, 작업처리 부분은 doGet(), doPost()에 코딩하고, 둘중 하나는 반드시 재정의 해야 합니다.
( 경우에 따라선 둘다 재정의 할 수 있습니다. )

● 작업이 끝나면 destory() 메소드를 호출하여 서블릿을 종료하는 구조입니다. 마찬가지로 이 메소드도 한번만 실행됩니다.


서블릿 클래스 다이어그램

그렇다면 실제 어떤식으로 구성되어 있는지 보겠습니다.
서블릿 API 에 대한 UML 은 보기쉽도록 작성되어 진 것이 없는것 같아,
직접 만들었습니다 -ㅁ-;;


다른 종류의 여러가지 생성자와 메소드들이 많이 있습니다.
여기에선 단지 이 글에서 해당될만한 꼭 필요한 내용만 기재하고
다른 내용들은 과감히 뺏다는점... 알려드려요^^

● Servlet 인터페이스 : init(), service(), destroy() 라는 3개의 생명주기 메소드를 가지고 있습니다.

● GenericServlet 추상클래스 : 필요한 여러개의 메소드가 있으며, Servlet 인터페이스에 정의된 메소드도 가지고 있습니다. init() 메소드가 있는점에 주목해 주세요!

● HttpServlet 추상클래스 : 서블릿의 HTTP 적인 내용을 담고있는 추상클래스입니다. service() 메소드를 재정의 합니다. init() 메소드가 없는점에 주목하세요.

● 마지막으로 사용자가 직접 코딩하는 내 서블릿 클래스는 HttpServlet 추상클래스를 상속받지요 ^^

즉, 컨테이너가 서블릿을 호출하면 init() 를 실행합니다. [ 상위의 이미지 그림을 다시 봐주시길... ]
init() 메소드를 재정의 하지 않았다면 GenericServlet 클래스의 init() 를 실행하게 되겠지요.

그런 다음 service() 메소드를 호출합니다. 이것 또한 재정의하지 않았다면 HttpServlet 클래스의 service() 메소드를 실행할 것입니다.

다음으로 HttpServlet 클래스의 service() 메소드는 내 서블릿 클래스에 재 정의한 doGet() 또는 doPost() 메소드를 실행합니다. HttpServlet 의 doGet() , doPost() 에는 아무런 내용이 없으므로 반드시 둘중 하나 ( 또는 둘다 ) 재 정의 해야하는것. 잊지 않으셧죠?

컨테이너는 이제 새로운 요청이 들어오면 새로운 스레드를 생성합니다.
그런 뒤에 서블릿의 service() 메소드를 호출하지요. service() 메소드는 호출될때마다 doGet() 또는 doPost() 메소드를 호출하고, 이말은 곧 클라이언트가 호출한 횟수만큼 스레드가 생성된다는 의미입니다.

컨테이너에 동시에 실행하는 최대 스레드의 개수는 설정이 가능하며,
요청이 제한수를 넘게되면 다른것이 끝날때까지 기다려야 합니다.



간단한 내용인듯 한데,
포스팅 하다보니 생각보다 길어졌네요 ;;
( 사실 그림 그리는데 거의 대부분의 시간을................어흑! )




반응형

댓글

Designed by JB FACTORY