[출처] 남시언님 블로그
우선 먼저 알아야 할 점은 서블릿의 가장 중요한 상태는 초기화 상태 라는 것입니다.
무슨말인고 하니...
우선 아래의 시퀀스 다이어그램 비스무리한 그림으로 표시한 이미지를 보세요 ~^^;
그림을 잘 못그려서;;;
어쨋거나 저쨋거나 설명을 좀 덧붙이자면
● 그런 다음 서블릿의 생성자를 호출하여 인스턴스화를 하죠.
● 그리고 초기화메소드인 Init() 메소드를 호출합니다.
이 메소드는 서블릿에서 단 한번만 호출됩니다.
또한 꼭 init() 메소드는 service() 메소드 이전에 실행되어야 합니다.
서블릿을 초기화하는 기능을 합니다. 초기화할 코드가 있다면 이 메소드를 재정의 한 후 여기에 작성하면 되겠습니다. (ex : DB 접속 등 )
● 그 다음 service() 메소드를 호출합니다. 이것은 곧 doGet() 또는 doPost() 메소드를 호출하는 것이고, 이 메소드가 호출되면 새로운 스레드를 만들어 작업 처리를 하지요. 최초의 클라이언트 요청을 받으면 컨테이너는 준비하고있던 서블릿에 대한 스레드를 생성하여 service() 메소드를 호출합니다.
스레드 풀 기능(자주 쓰는 스레드를 풀이란 곳에 넣어두고 가져오고 반환하는 방식)도 있지만 여기에선 논외로 하겠습니다.
클라이언트의 HTTP 메소드를 분석하여 doGet() 또는 doPost() 메소드를 호출할지 여기서 결정합니다. service() 메소드는 재정의 하지 않고, doGet() , doPost() 메소드를 재 정의하여 HttpServlet 의 service() 메소드가 이것을 실행하도록 하면 됩니다.
결국, 작업처리 부분은 doGet(), doPost()에 코딩하고, 둘중 하나는 반드시 재정의 해야 합니다.
( 경우에 따라선 둘다 재정의 할 수 있습니다. )
● 작업이 끝나면 destory() 메소드를 호출하여 서블릿을 종료하는 구조입니다. 마찬가지로 이 메소드도 한번만 실행됩니다.
그렇다면 실제 어떤식으로 구성되어 있는지 보겠습니다.
서블릿 API 에 대한 UML 은 보기쉽도록 작성되어 진 것이 없는것 같아,
직접 만들었습니다 -ㅁ-;;
다른 종류의 여러가지 생성자와 메소드들이 많이 있습니다.
여기에선 단지 이 글에서 해당될만한 꼭 필요한 내용만 기재하고
다른 내용들은 과감히 뺏다는점... 알려드려요^^
● 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() 메소드를 호출하고, 이말은 곧 클라이언트가 호출한 횟수만큼 스레드가 생성된다는 의미입니다.
컨테이너에 동시에 실행하는 최대 스레드의 개수는 설정이 가능하며,
요청이 제한수를 넘게되면 다른것이 끝날때까지 기다려야 합니다.