프로그래밍 언어/자바 웹

load-on-startup 기능 사용하기

· 코딩마이데이

서블릿은 브라우저에서 최초 요청 시 init() 메서드를 실행한 후 메모리에 로드되어 기능을 수행합니다.  따라서 최초 요청에 대해서는 실행 시간이 길어질 수밖에 없습니다. 이런 단점을 보완하기 위해 이용하는 기능이 load-on-startup입니다.

load-on-startup의 특징은 다음과 같습니다.

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

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

1. sec06.ex02 패키지를 생성하고 마우스 오른쪽 버튼을 클릭한 후 New > Servlet을 선택합니다.

New > Servlet 선택

 

2. 클래스 이름으로 LoadAppConfig을 입력하고 Next를 클릭합니다.

클래스 이름으로 LoadAppConfig 입력 후 Finsh 클릭 후

 

3. Name과 URL mapping을 loadConfig로 변경하고 Next를 클릭합니다.

Name과 URL mappings 입력 후 Next 클릭

 

4. inherited abstract methods, init, doGet 옵션 체크박스에 체크한 후 Finish를 클릭합니다.

inherited abstract methods, init, doGet 항목 체크 후 Finish 클릭

 

5. LoadAppConfig 클래스를 다음과 같이 작성합니다. 애너테이션으로 설정한 매개변수에 loadOnStartup 속성을 추가한 후 우선순위를 1로 설정합니다.

package sec06.ex02;

import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "loadAppConfig", urlPatterns = { "/loadAppConfig" }, loadOnStartup = 1)
public class LoadAppConfig extends HttpServlet {
	private ServletContext context;

	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("LoadAppConfig의 init 메서드 호출");
		context = config.getServletContext();
		String menu_member = context.getInitParameter("menu_member");
		String menu_order = context.getInitParameter("menu_order");
		String menu_goods = context.getInitParameter("menu_goods");
		
		context.setAttribute("menu_member", menu_member);
		context.setAttribute("menu_order", menu_order);
		context.setAttribute("menu_goods", menu_goods);
	}

	@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();
		
		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 + "</td></tr>");
		out.print("<tr><td>" + menu_order + "</td></tr>");
		out.print("<tr><td>" + menu_goods + "</td></tr>");
		out.print("</tr></table></body></html>");
	}
}

 

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

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

 

6. 브라우저에서 /loadConfig로 최초 요청 시 기다리지 않고 바로 공통 메뉴를 출력합니다. 또한 톰캣을 실행하면 서블릿의 init() 메서드를 호출하므로 로그에 메시지가 출력됩니다.

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

 

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로 요청합니다. 실행 결과는 애너테이션으로 실행했을 때와 같습니다.