본문 바로가기

Programming/JAVA

서블릿!! 이 녀석을 알아보자!!

 서블릿은 전에도 말했다시피 컨테이너가 관리합니다.

컨테이너가 request와 response 객체를 생성하고, 서블릿의 스레드를 생성합니다.

그런다음 두개의 객체를 스레드에 넘깁니다. 여기서 service() 메소드를 컨테이너가 호출하는데, 이 service() 메소드는 사용자가 정보를 넘기는 방식 즉, Get 이냐 Post냐에 따라 doGet 이나 doPost를 호출합니다. 호출할 때 request와 response 객체를 인자로 넘깁니다.

 

* public void doPost(HttpServletRequest requst, HttpServletResponse response) throws IOException {} <- 이런 식으로 시작되는 코드를 많이 보셨을 텐데요 위의 설명에서 말하는 doPost와 request, response 객체를 단면적으로 보여주는 코드입니다. ㅎㅎ

 

서블릿은 클라이언트에게 응답할 내용을 response에 작성을 하고 이 객체를 컨테이너에게 넘깁니다.

이제 service 메소드가 끝나게 되면 스레드와 각 객체들이 가비지 컬렉션이 일어나게 됩니다.

 

그럼 이제 서블릿의 생애에 대해 좀 더 자세히 알아보겠습니다.

서블릿은 크게 3단계로 그 일생을 구분지을 수 있습니다.

  1. init() 호출 : 컨테이너는 처음에 서블릿 인스턴스를 생성한 다음 이 init()를 호출합니다. 만약 데이터베이스에 대해 접속하는 등의 초기화 코드가 있다면 여기서 재졍의를 해야 합니다. 하지 않는다면 GenericServlet()의 init()가 호출됩니다. 
  2. service() 호출 : 클라이언트 요청을 처음 받았을 때, 컨테이너는 새로운 스레드를 생성하거나 스레드 풀로부터 하나를 가지고 와서 이 service()메소드를 호출합니다. 이 메소드는 클라이언트가 어떤 방식의 메소드를 사용했는지 알 수 있고, 이에 상응하는 doGet()이나 doPost()를 실행합니다. 본래 이 두 메소드는 비어 있기 때문에 반드시 재정의 해 주어야 합니다.  

    service가 완료되는 시점이 바로 스레드가 종료되는 시점입니다.

  3. doGet() or doPost() 호출 : 바로 세번째 단계가 바로 위에서 설명한 doGet()/doPost() 메소드입니다. 보통 개발자가 하는 코딩은 거의 여기서 하면 됩니다. 이곳에서  다른 객체에 있는 메소드를 호출할 수있습니다. 

 

다수의 클라이언트가 하나의 서블릿에 대해 요청하는 경우가 있을 수 있습니다. ^^ 웹페이지 같은 경우는 빈번한 경우라 할 수 있죠. 그럼 컨테이너는 서블릿하나에 대한 다수의 요청을 어떻게 처리를 할까요??

이 처리를 해주는 것이 바로 스레드입니다!! ㅎㅎㅎ 운영체제에서나 보던 프로세스/스레드 개념이 이 서블릿에서도 바로 적용되고 있었던 거죠 ㅎㅎㅎ

 

위의 설명에서 생기는 궁금점!! 그건 바로 위와 같은 단계를 거치면 매번 init()를 호출해야 하느냐죠!! 스레드의 생성은 service()를 호출하면서 컨테이너에 생성되는데 말이죠!!

이 문제는 간단하게 생각하면 금방 해결됩니다. init() 메소드는 일생에 단한번만!!! 호출된다는 것이죠!! ㅎㅎ

 이 말이 무엇을 의미하는 지는 후에 기회가 된다면??? 아님 누가 좀 알려주세욤 ㅜㅜ 저는 모르겠어요 ㅜㅜ

 

이 글은 스프링노트에서 작성되었습니다.