load-on-startup 기능 사용하기
서블릿은 브라우저에서 최초 요청 시 init() 메서드를 실행한 후 메모리에 로드되어 기능을 수행합니다. 따라서 최초 요청에 대해서는 실행 시간이 길어질 수밖에 없습니다. 이런 단점을 보완하기 위해 이용하는 기능이 load-on-startup입니다.
load-on-startup의 특징은 다음과 같습니다.
- 톰캣 컨테이너가 실행되면서 미리 서블릿을 실행합니다.
- 지정한 숫자가 0보다 크면 톰캣 컨테이너가 실행되면서 서블릿이 초가화됩니다.
- 지정한 숫자는 우선순위를 의미하며 작은 숫자부터 먼저 초기회됩니다.
애너테이션을 이용하는 방법
1. sec06.ex02 패키지를 생성하고 마우스 오른쪽 버튼을 클릭한 후 New > Servlet을 선택합니다.

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

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

4. 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() 메서드를 호출하므로 로그에 메시지가 출력됩니다.


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로 요청합니다. 실행 결과는 애너테이션으로 실행했을 때와 같습니다.
'프로그래밍 언어 > 자바 웹' 카테고리의 다른 글
| <hidden> 태그를 이용한 세션 트래킹 실습 (3) | 2025.07.13 |
|---|---|
| 웹 페이지 연결 기능 (0) | 2025.07.08 |
| @WebServlet 에니테이션을 이용한 서블릿 설정 (1) | 2025.07.02 |
| ServletConfig (0) | 2025.06.29 |
| ServletContext의 파일 입출력 기능 (1) | 2025.06.24 |