본문 바로가기

JSP/- 서블릿 (servlet)

JSP - 서블릿 2. 서블릿 로딩과 초기화(init())

 

 

예) NowServlet 코드

 

public class NowServlet extends HttpServlet {
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
            response.setContentType("text/html; charset=utf-8");
            
            PrintWriter out = response.getWriter();
            ... 코드 생략
            
            out.println("</body></html>");
    }
}

 

앞서 web.xml에서 NowServlet 을 /now 경로에 매핑했다.

 

/now 경로로 접근하면 NowServlet 을 실행하는데,

서블릿 컨테이너는 처음 서블릿을 실행할 때 서블릿 객체를 생성한다.

 

즉, 서블릿을 최초 요청할 때 서블릿 객체를 생성하고,

이후 요청이 오면 앞서 생성한 서블릿 객체를 그대로 사용한다.

 

 

서블릿 로딩 과정

 

서블릿 로딩 과정 : 웹 컨테이너가 서블릿 객체를 생성하고 init() 메소드를 호출하는 과정

 

서블릿은 init() 메소드를 사용해서 필요한 초기화 작업을 수행한다.

 

 

init() 메소드의 기본 구현

 

//GenericServlet 구현
public void init(ServletConfig config) throws ServletException {
    this.config = config;
    this.init();
}

public void init() throws ServletException {
}

 

서블릿 컨테이너는 서블릿을 초기화하기 위해 ServletConfig 파라미터를 갖는 init() 메소드를 실행한다.

 

init(ServletConfig) 메소드는 내부에서 다시 파라미터가 없는 init() 메소드를 호출한다.

 

따라서 초기화가 필요한 서블릿은 파라미터가 없는 init() 메소드를 재정의하면 된다.

(ServletConfig 이 필요하면, ServletConfig를 파라미터로 갖는 init() 메소드를 재정의하면 된다.)

 

 

예) DBCPInit.java 에서 파라미터가 없는 init() 메소드를 재정의함

public class DBCPInit extends HttpServlet {

    @Override
    public void init() throws ServletException {   // 서블릿을 초기화 할 때 사용
        loadJDBCDriver();
        initConnectionPool();
    }
    ...
}

 

보통 초기화 작업은 상대적으로 시간이 오래 걸리기 때문에,

처음 서블릿을 사용하는 시점보다 웹 컨테이너를 처음 구동시키는 시점에 초기화를 진행하는 것이 좋다.

 

이를 위한 설정이 web.xml 의 <load-on-startup> 태그이다.

 

예) web.xml 에서 DBCP 초기화를 위한 설정 (jdbc 패키지의 DBCPInit 서블릿)

 

<servlet>
    <servlet-name>DBCPInit</servlet-name>
    <servlet-class>jdbc.DBCPInit</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

 

<load-on-startup> 태그를 설정하면 웹 어플리케이션을 시작할 때 서블릿을 로딩한다.

 

즉, 톰캣을 구동하는 시점에서 DBCPInit 서블릿 객체를 생성하고, init() 메소드를 실행한다.

 

웹 어플리케이션을 시작하는 시점에서 커넥션 풀을 초기화하므로,

JSP 나 서블릿 코드에서 커넥션 풀을 사용할 수 있게 된다.

 

 

 

<load-on-startup> 태그로 서블릿을 미리 초기화

 

<load-on-startup> 태그의 값은 로딩 순서를 의미한다.

 

값을 기준으로 오름차순으로 서블릿을 로딩한다.

 

예) 값이 적은 Config 서블릿(1) 을 로딩하고, DBCPInit 서블릿(2) 을 로딩한다.

 

<servlet>
    <servlet-name>Config</servlet-name>
    <servlet-class>config.ConfigInit</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet>
    <servlet-name>DBCPInit</servlet-name>
    <servlet-class>jdbc.DBCPInit</servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>

 

만약 @WebServlet 어노테이션을 사용하는 경우에는 loadOnStartup 속성을 이용해서 로딩 값을 지정한다.

 

@WebServlet(urlPatterns = "/hello", loadOnStartup = 1)
public class InitServlety extends HttpServlet {
    . . . 
}

 

 

 

'JSP > - 서블릿 (servlet)' 카테고리의 다른 글

JSP - 서블릿 4. URL 패턴 매핑 규칙  (0) 2020.11.02
JSP - 서블릿 3. 초기화 파라미터  (0) 2020.11.01
JSP - 서블릿 1. 기초  (0) 2020.11.01