[서블릿] load-on-startup 기능 사용하기

hoonak·2023년 8월 18일

서블릿

목록 보기
9/16

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

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

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

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

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

먼저 애너테이션을 이용해 web.xml에서 공통 메뉴를 읽어 오는 실습을 해보겠음.



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;

@WebServlet(name = "loadConfig", urlPatterns = { "/loadConfig" }) //loadOnStartup 속성을 추가하고 우선순위를 1로 설정함.
public class LoadAppConfig extends HttpServlet {
	
	// 변수 context를 멤버 변수로 선언함.
	private ServletContext context;
	
	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("LoadAppConfig의 init 메서드 호출");
		
		// init() 메서드에서 ServletContext 객체를 얻음.
		context = config.getServletContext();
		
		// 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("member_menu", menu_member);
		context.setAttribute("menu_order", menu_order);
		context.setAttribute("menu_goods", menu_goods);
	}


	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();
		
		// doGet()메서드 호출 시 ServletContext 객체를 얻는 부분은 주석 처리함.
		//ServletContext context = getServletContext();
		
		// 브라우저에서 요청 시 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 + "</td></tr>");
		out.print("<tr><td>" + menu_order + "</td></tr>");
		out.print("<tr><td>" + menu_goods + "</td></tr>");
		out.print("</table></body></html>");
		
	}

}

우선순위는 양의 정수로 지정하며 숫자가 작으면 우선순위가 높으므로 먼저 실행함. 톰캣 실행 시 init() 메서드를 호출하면 getInitParameter() 메서드를 이용해 web.xml의 메뉴 정보를 읽어 들인 후 다시 ServletContext 객체에 setAttribute() 메서드로 바인딩함. 브라우저에서 요청하면 web.xml이 아니라 ServletContext 객체에서 메뉴 항목을 가져온 후 출력하기 때문에 파일에서 읽어 들여와출력하는 것보다 빨리 출력할 수 있음.

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

profile
Hello World!

0개의 댓글