사람이 생을 시작하여 마감하는 것처럼 Servlet도 태어나 생을 마감하는 Cycle이 있습니다.
그럼 .... Servlet의 생애를 알아볼까요?
API Documentation 확인해 보시면 좋아요!
https://docs.oracle.com/javaee/7/api/toc.htm
Servlet 생명 주기
클라이언트가 Servlet에 요청하면, Servlet은 바로 호출되지 않습니다.
Servlet은 객체를 생성하고 초기화 작업을 거친 후, 요청을 처리하는 생명주기를 가지고 있습니다.
1. Server에 Request 를 보내면 요청과 Servlet 로딩이 되었는지 확인하고 안되었으면 Servlet 객체 생성합니다.
2. 서버는 init()메소드를 호출해서 Servlet을 초기화 합니다.
3. service 메소드를 호출해서 브라우저의 요청을 처리하도록 하고, doGet이나 doPost 등 메소드를 호출합니다.
4. 서버는 destroy() 메소드를 호출하여 Servlet을 제거합니다.
init( )
web container로 부터 ServletConfig 객체를 할당 받고
현 서블릿의 초기화 작업을 담당 현 서블릿의 초기화 작업을 담당합니다.
처음 서블릿 실행 시 단 한번 호출되어 실행됩니다.
service( )
web container로 부터 request, response를 전달받아 실행 client 요청 시마다 매번 호출되어 실행됩니다.
공용 서비스 메서드에서 표준 HTTP 요청을 수신하여 이 클래스에 정의된 doXXX 메서드로 전송합니다.
=> GET, POST 등의 메소드를 확인해서 각자에 맞는 do 메소드로 전송해줍니다.
destroy( )
web container로 부터 해당 Servlet이 해제 or 소멸 직전에 단 한번 호출되어 실행됩니다.
Tomcat 의 Servlet 관리
- Servlet 객체를 생성하고 초기화하는 작업은 비용이 많은 작업이므로, 다음에 또 요청이 올 때를 대비하여 이미 생성된 Servlet 객체는 메모리에 남겨둡니다.
- 또 톰캣이 종료되기 전이나 reload 전에 모든 Servlet을 제거하게 됩니다.
- 이렇게 톰캣은 자원을 아끼면서 Servlet을 사용하고 있습니다.
생명주기 확인 테스트
@WebServlet("/test")
public class LifeCycleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void init(ServletConfig config) throws ServletException {
System.out.println("init called");
super.init();
}
public void destroy() {
System.out.println("destroy called");
super.destroy();
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("service called");
super.service(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet called");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost called");
}
}
자신이 이 파일을 저장한 패키지를 잘 확인하고 진행하면 됩니다.
testjava 라는 폴더에 저장했다면,
localhost:3001/testjava/test 를 요청하면
init() -> service() -> doGet() 순으로 메소드가 실행됩니다.
브라우저를 새로고침하면 어떻게 될까요?
Servlet 객체가 생성되었기 때문에, Servlet 객체는 메모리에 저장되어 있습니다.
그래서 service() -> doGet() 만 실행되었습니다.
Servlet을 죽이지 않으면 초기화하지 않아도 됩니다. 만약... reload하거나 죽인다면, 다시 태어나게 초기화를 해줘야합니다.
QUIZ
클라이언트가 검색을 위해 FindProductServlet 에 접속해 서비스를 제공받는 상황입니다.
100명의 클라이언트가 접속해 서비스 받았다고 가정해 봅시다.
Q1. WAS에 생성된 FindProductServlet의 객체수는 몇 개인가요?
Q2. service() -> doGet() or doPost() 의 실행 횟수는 몇 번인가요?
Q3. destroy()의 실행 횟수는 몇 번인가요?
정답은 소감 밑에 작성할게요.
소감
자원을 효율적으로 관리해야하는 것을 알게되었지만, 사실 아직 제대로 된 프로그램을 만들어보지 못하여 어떻게 하면 더 좋은 자원 관리가 되는지 알지 못합니다. 더 많은 것을 배워 시니어 개발자에 준하는 실력을 가지고 싶습니다.
A1. 1개 A2. 100번 A3. 모른다 / WAS 종료 직전에 1번 실행
출처
'코딩 개발 > Java' 카테고리의 다른 글
Servlet - ServletConfig, ServletContext (0) | 2023.05.20 |
---|---|
Java - Servlet 연동 (HTML <form>, <a> tag) (4) | 2023.05.19 |
Java & ORACLE - TRANSACTION (0) | 2023.05.06 |
Java - DB연결을 위한 Cloud Service (feat. AWS EC2, ORACLE) (4) | 2023.04.30 |
Java - Network 응용 심화편(장코드 주의) (0) | 2023.04.26 |