본문 바로가기

프로그래밍/Servlet&JSP

서블릿 라이프사이클

1. 컨테이너가 서블릿 클래스 파일을 찾고 클래스에 로딩한다.

 

※ 컨테이너마다 다른 클래스 로딩방법

  • 컨테이너가 시작될 때
  • 최초 클라이언트 요청 시

2. 서블릿을 인스턴스화해서 메모리에 로드한다.

3. init() 메서드를 호출한다.

4. service() 메서드를 호출한다. 요청이 들어오면 새로운 스레드(또는 스레드 풀의 스레드)에서 실행된다.

5. service()메서드에서 doGet이나 doPost를 실행. (메모리 로드된 채로 요청이 들어올 때마다 4-5번 사이클 반복)

6. 서블릿이 제거될때 destroy() 메서드를 실행한다. (컨테이너의 종료 또는 리로드)

 

 

※ 서블릿 라이프사이클 메서드별 정리

메서드 호출되는시점 목적 재정의 필요
init()

해당 서블릿의 최초 요청시 단 한번만 실행.

서블릿을 초기화. (데이터베이스 등) 따로 초기화할 코드가 있다면 재정의.
service

서블릿이 메모리에 살아있는 동안 클라이언트의 요청마다 실행.

HTTP 메소드를 참조하여 어떤 메서드 (doGet, doPost 등)를 실행시킬지 선택.

재정의 필요없음.
doGet, doPost, ... service() 메서드에서 호출할 때 필요한 비즈니스 로직 작성 무조건 재정의.

 

위에서 정리한 대로 컨테이너는 서블릿을 관리할 때, 인스턴스를 하나만 만들어두고 새로운 요청마다 스레드를 실행시켜서 생성되어 있는 서블릿 인스턴스를 실행시킨다. 그리고 스레드마다 새로운 request, response 객체를 생성한다.

 

단 하나의 인스턴스이기 때문에, 각 요청마다 변화하는 데이터를 서블릿의 멤버 필드로 사용 해서는 안 된다. 동일한 서블릿을 여러 스레드에서 실행시킬때(동일한 요청이 여러개일 때) 서로 값을 덮어써버리는 문제가 발생하게된다.

'프로그래밍 > Servlet&JSP' 카테고리의 다른 글

redirect & dispatch  (0) 2020.05.04
HttpServletRequest 객체의 port 조회 메서드 구분  (0) 2020.04.07
컨테이너(예 : 톰캣)의 역할  (0) 2020.04.05
CGI와 서블릿  (0) 2020.03.27