서블릿은 브라우저에서 최초 요청 시 init() 메서드를 실행한 후 메모리에 로드되어 기능을 수행함. 따라서 최초 요청에 대해서는 실행 시간이 길어질 수밖에 없음. 이런 단점을 보완하기 위해 이용하는 기능이 load-on-startup임.
load-on-startup의 특징은 다음과 같음.
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 객체에서 메뉴 항목을 가져온 후 출력하기 때문에 파일에서 읽어 들여와출력하는 것보다 빨리 출력할 수 있음.

