본문 바로가기

DEVELOPER/Programming

ServletConfig 와 load-on-startup 기능

반응형

ServletConfig


각 Servlet 객체에 대해 생성

ServletConfig는 javax.servlet 패키지에 인터페이스로 선언되어 있으며, 서블릿에 대한 여러가지 기능을 제공

각 서블릿에서만 접근할 수 있으며 공유는 불가능

ServletConfig는  서블릿과 동일하게 생성되고 서블릿이 소멸되면 같이 소멸

 

ServletConfig 기능


  • ServletContext 객체를 얻는 기능
  • 서블릿에 대한 초기화 작업 기능

 

서블릿을 초기화하는 방법


  1.  @WebServlet 애너테이션
  2.  web.xml에 설정

 

 


① @WebServlet 애너테이션을 이용한 서블릿 설정

 

▲ @WebServlet 구성 요소

  1. urlPatterns : 웹 브라우저에서 서블릿 요청 시 사용하는 매핑 이름
  2. name : 서블릿 이름
  3. loadOnStartup : 컨테이너 실행 시 서블릿이 로드되는 순서 지정
  4. initParams : @WebInitParam 애너테이션 이용해 매개변수를 추가하는 기능
  5. description : 서블릿에 대한 설명
@WebServlet(
	urlPatterns = {
           "/sInit"
           "/sInit2"
         },
         initParams = {
                    @WebInitParam(name = "email", value="ttttt@domain.com"),
                    @WebInitParam(name = "tel", value="010-1111-1111")
         })

위 코드 예시처럼 애너테이션으로 여러개의 매개변수를 설정

- InintParamServlet 클래스

...생략

String email = getInitParameter("email");
String tel = getInitParameter("tel");

...

설정할 때 지정한 name을 인자로 전달하여 각 값을 가져옴.

 


② web.xml을 이용해 매개변수 설정

* 잘 이용하지는 않는 방법
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
   <servlet>
     <servlet-name>sinit</servlet-name>
     <servlet-class>sec.06.ex01.initParamServlet</servlet-class>
     <init-param>
        <param-name>email</param-name>
        <param-value>admin@web.com</param-value>
     </init-param>
      <init-param>
        <param-name>tel</param-name>
        <param-value>010-111-1111</param-value>
     </init-param>
   </servlet>
   <servlet-mapping>
      <servlet-name>sinit</servlet-name>
      <url-pattern>/first</url-pattern>
   </servlet-mapping>
</web-app>


<init-param> 태그 안에 매개변수를 설정

 


 

load-on-startup 


서블릿은 브라우저에서 최초 요청 시, init( ) 메서드를 실행한 후 메모리에 로드되어 기능을 수행

따라서 최초 요청에 대해서는 실행 시간이 길어지게 됨.

이런 단점을 보완하기 위해 load-on-startup을 이용

 

load-on-startup 특징


  • 톰캣 컨테이너가 실행되면서 미리 서블릿을 실행
  • 지정한 숫자가 0보다 크면 톰캣 컨테이너가 실행되면서 서블릿이 초기화 됨.
  • 지정한 숫자는 우선순위를 의미하며 작은 숫자부터 먼저 초기화

 

load-on-startup 기능을 구현하는 방법


  1.  애너테이션을 이용
  2.  web.xml에 설정

 


① 애너테이션을 이용하는 방법

/**
 * load-on-startup 기능 사용
 */
@WebServlet(name = "loadConfig", urlPatterns = { "/pra08loadConfig" }, loadOnStartup = 1)
public class LoadAppConfig extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private ServletContext context; // 변수 context를 멤버변수로 선언
	
	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);
	}


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		String menuMember = (String) context.getAttribute("menu_member");
		String menuOrder = (String) context.getAttribute("menu_order");
		String menuGoods = (String) context.getAttribute("menu_goods");
		
		out.println("<html><body>");
		out.println("<table border=1><tr>메뉴이름</tr>");
		out.println("<tr><td>" + menuMember + "</td></tr>");
		out.println("<tr><td>" + menuOrder + "</td></tr>");
		out.println("<tr><td>" + menuGoods + "</td></tr>");
		out.println("</table></body></html>");
	}

}

위 코드 예시 처럼 애너테이션에 loadOnStartup = 1 이라고 설정

* ServletContext는 멤버 변수로 선언

//지역 변수로 지정시 init에서 사용 못함

  • 우선 순위는 양의 정수로 지정하며 숫자가 작으면 우선순위가 높으므로 먼저 실행
  • 톰캣 실행 시 init( ) 메서드를 호출하면 getInitParameter( ) 메서드를 이용해 web.xml 정보를 읽음
  • 그리고 ServletContext 객체에 setAttribute( ) 메서드로 바인딩
  • 브라우저에서 요청하면 이미 톰캣에서 실행시 저장된 정보를 출력하기 때문에 빠르게 출력이 됨

 

 


② web.xml에 설정하는 방법

<servlet>
   <servlet-name>loadConfig</servlet-name>
   <servlet-class>sec06.ex02.LoadAppConfig</servlet-class>
   <load-on-startup>1</load-on-startup>
</servlet>
  • <servlet-name> 태그의 값은 반드시 서블릿을 생성할 때 name으로 지정한 값으로 설정
반응형