Sh개발일기

Servlet Life Cycle 본문

BoostCourse

Servlet Life Cycle

Sh4869 2020. 2. 4. 01:16

학습 목표

  1. 서블릿의 생명주기를 이해합니다.

핵심 개념

  • init
  • service
  • destroy

Servlet Life Cycle (라이프 싸이클)

Servlet의 생성 시기와 메소드들이 언제 어떻게 호출 되는지 알아본다. 개념적인 내용을 알아보기 전, 실습을 통해 Servlet이 어떻게 동작되는지 확인하려고 한다. LifecycleServlet이라는 이름의 Servlet을 만들고 다음과 같이 코드를 작성해보았다.

우선 코드의 맨 위 어노테이션 (@WebServlet("/LifecycleServlet"))에 주목하자. Client가 Server에 url을 이용하여 요청하게 되면, Sever는 어노테이션을 통해 어떤 Servlet을 요청하는지 알 수 있다.

 

위의 Servlet을 실행하면 다음과 같은 결과가 나온다.

결과에서 나오는 것 처럼 먼저 LifecycleServlet 생성자가 실행된 뒤, init()메소드와 service()메소드가 순서대로 호출 되는 것을 볼 수 있다. 서블릿이 요청되게 되면 WAS는 요청된 서블릿이 메모리상에 존재 하는지 확인하고 존재하지 않으면 객체를 생성한 뒤 자동으로 init(), service() 메소드를 호출하게 된다.

 

이렇게 호출한 뒤 웹에서 새로고침을 눌러보면 아래와 같이 service 메소드만 한번 더 호출 되는 것을 볼 수 있다.

이를 통해 서블릿은 요청이 올 때 마다 새로 만들어 지는게 아니라 메모리상에 존재하는지 확인하고 존재한다면 service 메소드 만을 호출 한다는 사실을 알 수 있다.

 

이후 init 메소드의 내용을 다음과 같이 수정하여 저장해보자. 수정 사항을 저장하는 순간 destroy()메소드가 호출 되는 것을 볼 수 있다.

init 메소드 내용 수정
destroy()메소드 호출

init 메소드의 내용을 수정하여 저장하게 되면, 현재 메모리상에 존재하는 서블릿 객체와 서블릿 클래스 상의 내용이 일치하지 않게 된다. WAS는 이러한 상황을 자동으로 감지하여 서블릿의 destroy 메소드를 호출하게 된다.

 

이렇게 수정한 뒤 브라우저를 새로고침하면 새로운 객체가 다시 생성되는 것을 볼 수 있다.

수정 후 새로고침을 누른 결과

서블릿 라이프 싸이클 구조

실습에서 본 내용을 정리 해보면 서블릿 라이프 싸이클은 다음과 같은 구조를 가지고 있다.

Servlet life cycle

이러한 라이프 싸이클의 내용이 바로 이번 포스팅의 핵심적인 내용이다. 이 내용 이외에 위 구조를 보고 "요청이 오면 응답 해야할 모든 내용을 service() 메소드에 구현해야 하는구나!" 정도의 생각을 한다면 베스트이다.

 

그리고 이러한 생각은 한 가지 의문점에 도달하게 된다. 이전 실습에서 우리는 service메소드 없이 doGet메소드 만으로 Servlet을 잘 실행하였다. 어떻게 된 것일까? 이는 service 메소드가 가진 특이한 동작 구조 때문이다.

Service(request, response) 메소드

우리가 만든 Servlet은 HttpServlet 클래스를 상속하여 만들어진다. 따라서 별도의 오버라이드를 하지 않는다면 우리의 Servlet클래스 안의 Service 메소드는 부모 클래스의 내용과 같은 구조를 가지게 될 것이다. 그렇다면 HttpServlet 클래스의 Service 메소드는 어떤 구조를 가지고 있을까?

 

  • HttpServlet의 service 메소드는 템플릿 메소드 패턴으로 구현된다.
  • Client의 요청이 GET일 경우, 자신이 가지고 있는 doGet(request, response) 메소드 호출
  • Client의 요청이 POST일 경우, 자신이 가지고 있는 doPost(request, response) 메소드 호출

WAS는 매번 Service 메소드 만을 호출한다. 따라서 위와 같은 구조로 Client의 요청 형태에 따라 service 메소드는 서로 다르게 실행 될 것이다.

 

실제로 Client가 url만으로 서블릿을 실행하면 서블릿의 service 메소드는 doGet메소드를 호출하며, Client가 POST방식의 요청을 하게되면 service 메소드는 doPost메소드를 호출하게 된다. 실습에서 구현한 클래스의 service 메소드 오버라이딩을 지우고, doGet, doPost 메소드를 오버라이딩하여 실행해보면 위와 같은 사실을 직접 볼 수 있을 것이다.

 

 

 

'BoostCourse' 카테고리의 다른 글

window객체와 DOM  (0) 2020.02.10
Request, Response 객체 이해하기  (0) 2020.02.04
Java Web Application과 Servlet  (0) 2020.02.03
웹 서버와 WAS  (0) 2020.02.02
browser의 역할과 동작 원리  (0) 2020.01.23