웹 개발 기초/자바 웹을 다루는 기술

load-on-startup 기능 사용하기

sungw00 2023. 2. 20. 21:12
728x90

서블릿은 브라우저에서 최초 요청 시 init( ) 메서드를 실행한 후 메모리에 로드되어 기능을 수행함.

따라서 최초 요청에 대해서는 실행 시간이 길어질 수밖에 없는데, 이런 단점을 보완하기 위해 load-on-startup이라는 기능이 있음.

 

load-on-startup의 특징

  • 톰캣 컨테이너가 실행되면서 미리 서블릿을 실행함
  • 지정한 숫자가 0보다 크면 톰캣 컨테이너가 실행되면서 서블릿이 초기화 됨
  • 지정한 숫자는 우선순위를 의미, 작은 숫자부터 먼저 초기화 됨

 

load-on-startup 기능을 구현하는 방법으로 애너테이션을 이용하는 방법과 web.xml 에 설정하는 방법이 있음


애너테이션을 이용하는 방법

 

1. LoadAppConfig 클래스 파일 생성

Servlet 선택 후 Next 클릭
Class name 설정 후 Next 클릭
URL mappings를 /loadConfig로 변경 후 Next 클릭
/loadConfig로 변경
Inherited abstract methods, init, doGet 체크 후 Finish 클릭

 

2. LoadAppConfig 클래스 작성(애너테이션으로 설정한 매개변수에 loadOnStartup 속성을 추가한 후 우선순위를 1로 설정)

package sec06.ex02;

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

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class LoadAppConfig
 */
@WebServlet(name = "loadConfig", urlPatterns = { "/loadConfig" }, loadOnStartup = 1) // loadOnStartup 속성을 추가하고 우선순위를 1로 설정
public class LoadAppConfig extends HttpServlet {
	private ServletContext context; // 변수 context를 멤버 변수로 선언
	/**
	 * @see Servlet#init(ServletConfig)
	 */
	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("LoadAppConfig의 init 메서드 호출");
		context = config.getServletContext(); // init() 메서드에서 ServletContext 객체를 얻어옴
        // getInitParameter() 메서드로 web.xml의 메뉴 정보를 읽어들임
		String menu_member = context.getInitParameter("menu_member");
		String menu_order = context.getInitParameter("menu_order");
		String menu_goods = context.getInitParameter("menu_goods");
        // 메뉴 정보를 ServletContext 객체에 바인딩
		context.setAttribute("menu_member", menu_member);
		context.setAttribute("menu_order", menu_order);
		context.setAttribute("menu_goods", menu_goods);
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();
        ServletContext context = getServletContext(); // doGet() 메서드 호출 시 ServletContext 객체를 얻는 부분은 주석처리
        // 브라우저에서 요청 시 ServletContext 객체의 바인딩 된 메뉴 항목을 가져옴
		String menu_member = (String) context.getAttribute("menu_member");
		String menu_order = (String) context.getAttribute("menu_order");
		String menu_goods = (String) context.getAttribute("menu_goods");
		out.print("<html><body>");
		out.print("<table border=1 cellspacing=0><tr>메뉴 이름</tr>");
		out.print("<tr><td>" + menu_member + "</tr></td>");
		out.print("<tr><td>" + menu_order + "</tr></td>");
		out.print("<tr><td>" + menu_goods + "</tr></td>");
		out.print("</body></html>");
	}

}

우선순위는 양의 정수로 지정하며 숫자가 작으면 우선순위가 높으므로 먼저 실행함.

 

톰캣 실행 시 init( ) 메서드를 호출하면 getInitParameter( ) 메서드를 이용해 web.xml의 메뉴 정보를 읽어 들인 후 다시 ServletContext 객체에 setAttribute( ) 메서드로 바인딩함. 브라우저에서 요청하면 web.xml이 아니라 ServletContext 객체에서 메뉴 항목을 가져온 후 출력하기 때문에 파일에서 읽어 들여와 출력하는 것 보다 빠르게 출력이 가능

 

3. 브라우저에서 /loadConfig로 최초 요청 시 기다리지 않고 바로 공통 메뉴를 출력.

또한 톰캣을 실행하면 서블릿의 init( ) 메서드를 호출하므로 아래와 같이 로그에 메시지가 출력됨.

톰캣 실행 시 init( ) 메서드의 메시지 출력
브라우저에서 /loadConfig로 요청한 결과


web.xml에 설정하는 방법

 

애너테이션 방법을 이용하기 전에는 아래와 같이 web.xml에 설정해서 사용했었음.

1. 다음과 같이 web.xml을 작성. <servlet-name> 태그의 값은 반드시 서블릿을 생성할 때 name으로 지정한 값으로 설정.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
	<servlet>
		<servlet-name>loadConfig</servlet-name>
		<servlet-class>sec06.ex02.LoadAppConfig</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>loadConfig</servlet-name>
		<url-pattern>/loadConfig</url-pattern>
	</servlet-mapping>
</web-app>

2. 톰캣 재시작 후 브라우저에서 /loadConfig로 요청. 실행 결과는 애너테이션으로 실행했을 때와 같음.

728x90