2022. 2. 3. 22:18ㆍ카테고리 없음
1) 사용자 요청이 들어오면 정적파일은 웹서버에서 처리한다. 동적파일이 필요한 경우 웹서버는 WAS 즉, 서블릿 컨테이너로 request를 보낸다. (Servlet Container or Web Container or WAS라고 한다)
2) 요청을 받은 Servlet Container는 HttpServletRequest, HttpServletResponse 두 객체를 생성한다. 그리고 배치 서술자인 web.xml 또는 어노테이션을 통해서 요청한 URL에 맞는 서블릿을 찾는다. (MVC패턴에서 서블릿은 Controller이다)
3) 요청된 서블릿이 이전에 요청된 적이 없다면 해당 서블릿 객체를 생성하고 해당 서블릿의 init() 메소드를 호출하고 메모리에 로드시킨다. 만약, 이전에 생성한 적이 있다면 객체를 다시 생성하지 않고 재사용한다.
4) 요청에 맞는 서블릿 객체를 생성했다면, Servlet Container는 해당 요청을 처리할 Thread를 생성 또는 Thread Pool에서 Thread를 가져온다. (Thread를 관리하는 Thread Pool은 Servlet Container 내부에 위치한다)
5) Thread가 생성되었다면 서블릿 객체의 service() 메소드를 실행한다. service() 메소드에서는 (get 또는 post) 요청에 따라 분기하여 doGet() 또는 doPost() 메소드를 호출한다. 그리고 앞서 생성한 HttspServletRequest, HttpServletResponse 객체를 인자로 전달 받아서 요청을 처리하고 응답 값을 Response 객체에 담는다.
6) 서블릿 컨테이너 즉, WAS에서 처리된 응답 값을 HTTP Response로 바꾸어 WebServer로 전송한다.
7) 이렇게 요청, 응답 처리를 완료하면 request, response 객체를 소멸시키고 Thread를 종료한다.
서블릿 생명주기(Servlet Life Cycle)
서블릿 컨테이너의 서블릿에 대한 최초 요청시 서블릿 객체가 만들어지고 메모리에 로딩되며 쓰레드 처리가 완료 되더라도 제거 되지 않고 메모리에서 대기하다가 재사용된다. 하지만 서버가 종료되는 등 자원 해제시에는 서블릿 객체는 메모리에서 제거된다.
- 서블릿 객체 생성은 최초 1회만 이루어진다.
- init() 또한 서블릿 객체 생성시 최초 1회만 이루어진다.
- 쓰레드에 다라 처리되는 service(), doGet(), doPost()는 사용자의 요청에 의해 계속 이루어진다.
- destroy()는 자원을 해제할 때(서블릿이 수정되 다시 메모리에 로딩해야 하는 경우, 서버가 종료될 때) 이루어진다.
정리
따라서 서블릿 컨테이너는
- WebServer와의 간편한 통신을 지원하고
- 서블릿 객체들의 생명주기를 관리하며
- 멀티 쓰레딩을 관리한다.