본문 바로가기

학원/복기

[Servlet] 생명주기(Lifecycle)

서블릿은 클라이언트 요청에 의해 WAS 프로그램에 등록된 서블릿 클래스를 읽어 메모리에 저장하고 서블릿 클래스로 객체를 생성하여 요청 처리 메소드를 호출한다.

→ 클라이언트 요청에 의한 서블릿 객체가 이미 생성되어 있는 경우 새로운 서블릿 객체를 생성하지 않고 기존 서블릿 객체를 사용하여 요청 처리 메소드를 호출한다.

→ WAS 프로그램이 종료되면 WAS 프로그램에 의해 생성되어 관리된 모든 서블릿 객체가 소멸된다. 

→ WAS 프로그램은 서블릿 객체를 관리하는 웹컨테이너(Web Container) 기능을 제공한다.

 

컨테이너(Container)

 

컨테이너는 소프트웨어 환경에서 다른 컴포넌트들을 실행하고 관리하는 역할을 수행하는 실행 환경이다.

컨테이너는 컴포넌트의 생명 주기(Lifecycle)를 관리하며, 컴포넌트의 생성, 초기화, 실행, 소멸 등을 담당한다.

 

서블릿은 컨테이너에 의해 관리되는 컴퍼넌트(Component)이다.

 


LifeCycleServlet 클래스 선언

 

package xyz.itwill.servlet;

import java.io.IOException;
import java.io.PrintWriter;

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("/life.itwill")
public class LifeCycleServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	//필드선언 
	private String name;
	
	//서블릿 클래스로 객체를 생성하기 위한 생성자 
	// => 객체를 생성하면서 실행될 명령을 작성한다.(초기화 처리)
	public LifeCycleServlet() {
		//name="홍길동";
		System.out.println("### LifeCycleServlet 클래스의 생성자 호출 - 객체 생성 ###");
	}
	
	//서블릿 객체가 생성된 후 WAS 프로그램에 의해 자동으로 1번만 호출되는 메소드 
	// => 객체를 생성한 후 실행될 명령을 작성한다.(초기화 처리) 
	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("### LifeCycleServlet 클래스의 init() 메소드 호출 ###");
		//name="홍길동";
        
		//[web.xml] 파일의 context-param 엘리먼트로 제공되는 값 반환
		name=config.getServletContext().getInitParameter("name");
	}
	
	//클라이언트가 요청할 때마다 WAS 프로그램에 의해 반복 호출되는 메소드
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("### LifeCycleServlet 클래스의 service() 메소드 호출 ###");
		
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='UTF-8'>");
		out.println("<title>Servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>서블릿의 생명주기(Life Cycle)</h1>");
		out.println("<hr>");
		out.println("<p>"+name+"님, 안녕하세요.</p>");
		out.println("</body>");
		out.println("</html>");
	}
}

 

 

생성자 대신 init 메소드를 이용하여 초기화 명령을 작성하는 이유는 init() 메소드는 매개변수로 ServletConfig 객체를 제공받아 사용할 수 있기 때문이다.  

 

ServletConfig 객체 : 웹자원을 생성하기 위한 환경 설정 관련 정보를 저장한 객체 
→ [web.xml] 파일에서 제공되는 값을 얻어와 서블릿 클래스에서 사용이 가능하다. 
→ 유지보수의 효율성을 증가시킬 수 있다는 장점이 있다.

 

[web.xml] 파일의 init-param 엘리먼트로 제공되는 값은 ServletConfig 객체의 getInitParameter(String name) 메소드를 호출하여 값을 얻어와 반환한다.

 

ServletConfig.getServletContext() : ServletContext 객체를 반환하는 메소드
ServletContext.getInitParameter(String name) : [web.xml] 파일에서 제공되는 값을 얻어와 반환하는 메소드


서블릿에게 필요한 값은 web.xml이 제공할 수 있다.

 

context-param : 프로젝트에 작성된 모든 웹프로그램에게 필요한 값을 제공하기 위한 엘리먼트

init-param : servlet 엘리먼트의 웹프로그램에게 필요한 값을 제공하기 위한 엘리먼트 

 

param-name : 값을 제공하기 위한 이름을 설정하는 엘리먼트

param-value : 제공될 값을 설정하는 엘리먼트 

 

[web.xml]

<context-param>
	<param-name>name</param-name>
	<param-value>임꺽정</param-value>
</context-param>