참고글


톰캣(서블릿 컨테이너) 시작시 Servlet 초기화 되도록 설정하기
우리가 작성해 놓은 Servlet이 객체화 되어 생성되는 시점은 사용자로부터 최초의 요청이 발생할 때 입니다. 서블릿은 생성과정에서  init()메서드가 실행됩니다. 그런데 사용자의 요청 여부에 관계없이 서블릿 컨테이너(톰캣)가 시작됨과 동시에 서블릿의 생성과 초기화를 진행하고 싶을 수 있습니다.

이경우 web.xml에 초기화를 원하는 서블릿에 대해서 <load-on-startup>태그를 설정해주거나 @WebServlet 어노테이션을 사용하는 경우 loadOnStartUp 속성값을 지정해주면 됩니다.


다음은 web.xml에 <load-on-startup>태그를 사용한 예시입니다. 서블릿 컨테이너가 시작될때 web.xml을 읽게 되고 <load-on-startup>가 0이상의 정수값으로 설정되어 있는 경우 해당 서블릿의 인스턴스를 생성하고 init()을 호출합니다.
     <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>servlet.HelloServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
     </servlet>
cs



우선순위
만약 여러 서블릿들간에 초기화 우선순위가 필요한 경우 <load-on-startup>에 할당한 값이 0에 가까울수록 먼저 초기화가 진행됩니다. 만약 여러 서블릿 사이에 <load-on-startup>값이 동일한 경우 web.xml에 먼저 선언된 서블릿이 먼저 초기화됩니다.
     <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>servlet.HelloServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
     </servlet>
 
     <servlet>
        <servlet-name>HelloServlet2</servlet-name>
        <servlet-class>servlet.HelloServlet2</servlet-class>
        <load-on-startup>0</load-on-startup>
     </servlet>
cs






실습예제
예제 프로젝트는 다음과 같습니다. 서블릿이 톰캣 시작과 동시에 초기화 되도록 web.xml에 설정하도록 하겠습니다. HelloServlet2.javaHelloServlet.java를 복사하여 클래스명만 2를 추가한것입니다.



HelloServlet.java, HelloServlet2.java
init() 메서드(초기화)에서 web.xml에 설정한 초기화 파라미터 greeting값을 출력하도록 하였습니다. HelloServlet2.java 클래스의 내용은 클래스명만 빼고 모두 동일합니다.
package servlet;
 
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
 
//@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
    
    @Override
    public void init(ServletConfig config) throws ServletException {
        String greeting = config.getInitParameter("greeting");
        System.out.println(greeting);
    }
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        out.println("<h1>Hello World</h1>");
    }
 
}
cs


web.xml
두개의 서블릿에 각각 <load-on-startup>태그를 통해 톰캣 시작시 초기화 되도록 하였습니다. HelloServlet2가 HelloServlet보다 먼저 초기화되도록 0으로 지정해 주었습니다.
<?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>HelloServlet</servlet-name>
           <servlet-class>servlet.HelloServlet</servlet-class>
        <init-param>
            <param-name>greeting</param-name>
            <param-value>안녕하세요 11111</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
     </servlet>
    
    <servlet>
        <servlet-name>HelloServlet2</servlet-name>
        <servlet-class>servlet.HelloServlet2</servlet-class>
        <init-param>
            <param-name>greeting</param-name>
            <param-value>안녕하세요 22222</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup>
    </servlet>
     
</web-app>
cs



테스트
톰캣을 시작하고 console을 보게되면 다음과 같이 두개의 서블릿이 지정해준 우선순위에 따라 초기화 된것을 볼 수 있습니다.





@WebServlet 사용시
만약 서블릿 설정시 @WebServlet 어노테이션을 이용한 경우라면 다음과 같이 loadOnStartUp 속성을 사용하면 됩니다.
@WebServlet(
        name="HelloServlet",
        urlPatterns="/hello",
        loadOnStartup = 1)
public class HelloServlet extends HttpServlet {
cs


블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

,