[JSP/Servlet] Servlet 생명주기

2019. 1. 28. 19:45JAVA Back-End

서블릿 동작 원리

 WAS인 톰캣이 구동되면 JVM을 거쳐서 자바로 작성된 서블릿을 처리할 수 있는 환경이 제공됩니다.


 Web Browser(클라이언트) --> 웹 서버 (ex. Apache) --> WAS(ex. 톰캣) 

--> Servlet 컨테이너 (서블릿 객체 생성/ 쓰레드 생성) 임무수행 

--> WAS --> 웹 서버 --> Web Browser(다시 사용자에게)

 

서블릿은 스레드를 통해서 해당 서블릿 객체를 생성하고 요청된 작업을 수행합니다. 

서블릿 객체의 작업이 종료되면 기동되면 스레드는 종료하고, 서블릿 수행 결과가 가시 웹서버로 전송하고, 다시 클라이언트로 뿌려주게 됩니다.


서블릿의 생명주기(Life Cycle)


 클라이언트에서 처음 요청하게되면 서버에서 서블릿 클래스를 찾아 메모리에 로딩해 인스턴스를 생성합니다. 이때 생성된 서블릿 인스턴스가 계속 메모리로 잡혀있고 이후에 호출되어도 이미 메모리에 로딩되어있는 서블릿에게서 service만  받기 때문에 수행 속도가 빠르다는 장점이 있습니다


핵심이 되는 HttpServlet3가지 메소드

    • init()
    • service(request, response)
    • destory()


우선, Client가 URL( @WebServlet("/LifecycleServlet") )로 서버한테 요청합니다.

서버에서는 이 URL(/LifecycleServlet)을 받아서 LifeCycle이라는 URL 매핑은 LifecycleServlet이라는 정보를 알아냈을 겁니다.


그럼 HttpServlet을 상속한 LifecycleServlet클래스가 메모리에 존재하는 지 확인합니다.

메모리에 존재하지 않는다면 이 객체를 생성하고 메모리에 올려줘야 합니다.


그렇게 최초로 LifecycleServlet을 호출했기 때문에 서버는 이것이 메모리에 없다고 판단을 했고, LifecycleServlet을 생성합니다.

그래서 생성자에 넣어준 메세지("LifeCycleServlet 생성!!")를 출력하는 것을 확인 할 수 있습니다.


init()

서블릿 객체가 생성되면서 init() 메소드가 단 한번만 호출됩니다.

("init() 호출!!"이 출력됨을 확인할 수 있습니다)


service()

그리고 service()가 호출되었습니다. destroy()는 아직 호출되지 않음을 확인할 수 있습니다.

요청이 들어왔을 때 응답해야할 모든 내용은 service에 구현해줘야합니다.


Servlet은 서버에 서블릿 객체를 여러 개 만들지 않습니다. 요청이 여러 번 들어오면 매번 생성하고 그러는 것이 아니라

실제 이 요청된 객체가 있는 지 없는 지만 체크해서 있다면 service() 메소드만 호출합니다. 그래서 처음에 한 번 호출된 후에는 

service()만 호출되는 것입니다.


destroy() 

서블릿이 수정되면 현재 올라가 있는 서블릿 객체는 더는 사용할 수 없게 됩니다. 

따라서 

- 웹 어플리케이션이 새롭게 갱신

- WAS가 종료

될 경우에만 destroy() 메서드가 호출됩니다. 더 이상 서블릿 객체가 메모리에 존재하지 않게되고 다시 처음부터 서블릿 객체 생성하고 init()을 호출, service()를 호출하는 부분을 확인 할 수 있습니다.


service(request, response) 메소드

 service()는 HttpServlet에 내장, 구현되어 있습니다. hello world를 찍어내는 서블릿 프로그램을 만들어보면 service()를 오버라이드 하지 않아도  HttpServlet 클래스를 상속해서 클라이언트의 요청에 따라서 doGet() 이나 doPost()를 호출합니다. 


java소스

package examples;

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/LifecycleServlet")
public class LifecycleServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public LifecycleServlet() {
    	System.out.println("LifeCycleServlet 생성");
    }

	public void init(ServletConfig config) throws ServletException {
		System.out.println("init() 호출");
	}

	public void destroy() {
		System.out.println("destroy() 호출");
	}

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("service() 호출");
	}

}


[ edwith - 웹프로그래밍 부스트고스 ] 를 개인적으로 공부하고 정리한 공간입니다. 잘못된 부분은 피드백 주시면 감사하겠습니다 :)

'JAVA Back-End' 카테고리의 다른 글

[JSP] JSP 내장객체  (0) 2019.02.25
[JSP] JSP문법  (0) 2019.02.25
[JSP] JSP 라이프 싸이클  (0) 2019.02.25
[JSP] JSP?  (0) 2019.02.22
[JSP/Servlet] Request / Response 객체  (0) 2019.01.30