서블릿은 브라우저에서 최초 요청 시 init( ) 메서드를 실행한 후 메모리에 로드되어 기능을 수행함.
따라서 최초 요청에 대해서는 실행 시간이 길어질 수밖에 없는데, 이런 단점을 보완하기 위해 load-on-startup이라는 기능이 있음.
load-on-startup의 특징
- 톰캣 컨테이너가 실행되면서 미리 서블릿을 실행함
- 지정한 숫자가 0보다 크면 톰캣 컨테이너가 실행되면서 서블릿이 초기화 됨
- 지정한 숫자는 우선순위를 의미, 작은 숫자부터 먼저 초기화 됨
load-on-startup 기능을 구현하는 방법으로 애너테이션을 이용하는 방법과 web.xml 에 설정하는 방법이 있음
애너테이션을 이용하는 방법
1. LoadAppConfig 클래스 파일 생성
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( ) 메서드를 호출하므로 아래와 같이 로그에 메시지가 출력됨.
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로 요청. 실행 결과는 애너테이션으로 실행했을 때와 같음.
'웹 개발 기초 > 자바 웹을 다루는 기술' 카테고리의 다른 글
<hidden> 태그와 URL Rewriting 이용해 웹 페이지 연동하기 (0) | 2023.02.22 |
---|---|
웹 페이지 연결 기능 (0) | 2023.02.22 |
@WebServlet 애너테이션과 web.xml을 이용한 서블릿 설정 (0) | 2023.02.20 |
ServletConfig 서블릿 확장 API (0) | 2023.02.20 |
ServletContext의 파일 입출력 기능 (0) | 2023.02.20 |