웹 프로그래밍/Servlet & JSP

서블릿 설정(web.xml)과 ServletConfig

kgvovc 2021. 3. 11. 18:04
반응형

서블릿 환경설정

서블릿은 웹에서 클라이언트로부터 요청받아서 실행되는 자바 프로그램으로서, 주로 서비스 처리를 위한 데이터 준비 작업과 메소드 호출 역할을 합니다. 이러한 작업을 하려면 서블릿 페이지 내에서가 아니라 서버에서 설정해야 하는 부분이 있는데요. 이번 절에서는 서블릿이 작업하는 데 필요한 내용을 설정하는 방법서블릿에서 설정한 내용을 추출하여 사용하는 방법에 대해 살펴보겠습니다.

 

web.xml

서버에서 서블릿 실행에 관한 정보를 설정할 때는 web.xml에 <servlet> 태그로 설정합니다. web.xml 파일은 서버가 시작할 때 웹서버가 사용하는 환경설정 파일입니다. 웹 애플리케이션 서비스 실행에 관한 전반적인 내용을 정의하는 환경설정 파일입니다. 서블릿 또한 웹 애플리케이션 서비스를 실행하기 위해 존재하는 파일이므로 web.xml에 정의합니다.

 

web.xml 파일에 서블릿을 정의하려면 다음과 같이 <servlet> 태그를 추가합니다.

~생략~
<servlet>
	<servlet-name>initParam</servlet-name>
 	<servlet-class>com.edu.test.InitParamServlet</servlet-class>
 	<init-param>
 		<param-name>id</param-name>
 		<param-value>guest</param-value>
 	</init-param>
 	
 	<init-param>
  		<param-name>password</param-name>
  		<param-value>1004</param-value>
  	</init-param>
  	<load-on-startup>1</load-on-startup>
</servlet>
  
<servlet-mapping>
	<servlet-name>initParam</servlet-name>
  	<url-pattern>/initParamTest</url-pattern>
</servlet-mapping>
~생략~

 

(1) <servlet> 태그

<servlet> 태그는 설정하려는 서블릿을 등록합니다. <servlet> 태그를 사용하면 반드시 하위 태그로 <servlet-name>과 <servlet-class>가 나와야 합니다. 그렇지 않으면 web.xml 오류가 발생하고 해당 웹 애플리케이션은 웹서버에 서비스 준비가 완료되지 않아서 클라이언트에 서비스되지 않습니다.

 

<servlet-name>initParam</servlet-name>

 

<servlet-name>은 <servlet> 태그를 사용할 때 반드시 설정해야 하는 태그로서 서블릿의 이름을 지정합니다. 여기에 지정한 이름은 이후 해당 서블릿을 참조할 때 사용합니다.

 

<servlet-class>com.edu.test.InitParamServlet</servlet-class>

 

<servlet-class> 태그에는 서블릿의 클래스 이름을 지정합니다. <servlet-class> 또한 <servlet> 태그 사용 시 반드시 설정해야 하며, 클래스 이름을 패키지명과 함께 대소문자를 구분하여 정확하게 입력해야 합니다.

 

여기까지 보면 위 예의 경우 com.edu.test.InitParamServlet 클래스를 "initParam"이라는 이름의 서블릿으로 등록합니다.

 

 

(2) <init-param> 태그

<init-param> 태그는 서블릿에 변수를 전달할 때 사용합니다. <servlet>의 하위 태그로서 필요할 때 선택해서 사용할 수 있습니다. 서블릿을 실행하면서 필요한 값을 외부에서 전달받아 실행할 수 있는데요. 서블릿 소스에서 직접 값을 지정해서 사용해도 되지만, 실행환경에 맞게 동적으로 값을 할당하고자 할 때 외부에서 값을 전달할 수 있습니다. <init-param> 태그는 반드시 <param-name>과 <param-value> 태그로 구성해야 합니다.

 

<param-name>password</param-name>

 

<param-name>은 <init-param> 태그 사용 시 반드시 설정해야 하는 태그로서 변수의 이름을 지정합니다. 서블릿 측에서는 <param-name>에 지정한 값을 이용하여 변수의 값을 추출합니다. 이때 변수의 이름은 대소문자, 철자를 구분하여 <param-name>에서 정확히 일치하는 변수의 이름을 찾아서 값을 추출합니다.

 

<param-value>1004</param-value>

 

<param-value>는 매핑되는 <param-name>에 저장되는 변수의 값을 지정하는 태그입니다.

 

 

(3) <load-on-startup> 태그

<load-on-startup> 태그를 사용하면 웹 서비스가 시작될 때 서블릿 객체를 생성할 수 있습니다. 서블릿 객체가 메모리에 생성되는 시점은 클라이언트로부터 최초의 요청이 있을 때입니다. 서버에 서블릿 클래스 파일이 존재하더라도 클라이언트로부터 실행 요청이 없으면 객체가 메모리에 생성되지 않습니다.

 

그런데 어떤 서블릿은 요청부터 응답까지 서비스 처리에 전반적으로 관여하기도 합니다. 또는 클라이언트로부터 요청이 들어오기 전에 어떤 기능을 미리 준비하는 서블릿도 있습니다. 이처럼 미리 준비되어 있다가 서비스 처리에 관여하는 서블릿은 클라이언트의 요청과 상관없이 웹 서비스가 시작될 때 객체를 생성하여 대기하고 있어야 합니다. 이럴 때 사용하는 태그가 <load-on-startup>입니다.

 

<load-on-startup> 태그의 값으로 숫자를 지정하는데요. 이 숫자는 객체가 생성되는 우선순위를 의미합니다. 서버가 시작될 때 생성해야 하는 서블릿 객체가 여러 개일 때 <load-on-startup> 태그의 값으로 우선순위를 정합니다. 숫자값이 낮을수록 우선순위가 높습니다.

 

 

ServletConfig

web.xml 파일에 <servlet> 태그로 서블릿에 관한 환경설정을 하였습니다. <servlet> 태그 안에 서블릿의 이름, 초기 파라미터, 객체 생성 여부 등의 서블릿에 관한 속성들을 설정할 수 있었습니다. 만일 서블릿 속성 중에서 <init-param> 속성이 지정되었다면, web.xml에서 서블릿으로 파라미터를 전달한 것이므로 서블릿 페이지 내에서 <init-param>의 변수를 추출해서 사용해야 합니다.

 

이처럼 web.xml의 <servlet> 태그에 설정한 정보를 서블릿 페이지 내에서 추출할 때는 ServletConfig 객체에서 제공하는 메소드를 사용합니다. ServletConfig 객체는 서블릿이 실행될 때 자동으로 생성됩니다.

 

다음은 서블릿 실행 시 ServletConfig 객체가 생성되는 시점을 그림으로 표현했습니다.

 

사진 출처: https://tmxhsk99.tistory.com/134

 

web.xml에 설정한 서블릿에 대한 정보를 추출하고자 할 때는 init() 메소드의 인자로 넘어오는 ServletConfig를 사용합니다. 5, 6 번은 서블릿의 요청이 최초 요청이든지 두 번째 이후의 요청이든지 상관없이 매번 실행되는 부분입니다. ServletConfig 객체는 서블릿이 최초로 요청이 들어왔을 때 한 번만 생성됩니다. 따라서 서블릿 페이지당 하나씩 존재하며 서블릿에 대한 정보를 처리하는 기능을 합니다.

 

 

다음 소스는 init() 메소드를 재정의하여 ServletConfig 객체를 init() 메소드의 인자로 받아서 web.xml 파일에 <servlet> 태그로 설정한 서블릿 정보를 추출하여 확인하는 예제입니다.

//InitParamServlet.java
package com.edu.test;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;


public class InitParamServlet extends HttpServlet {
	
	String id, password;
	
	@Override
	public void init(ServletConfig config) throws ServletException {
		id = config.getInitParameter("id");
		password = config.getInitParameter("password");
	}

	protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws ServletException, IOException {
		rsp.setContentType("text/html;charset=UTF-8");
		PrintWriter out = rsp.getWriter();
		out.print("<h2>서블릿 초기 추출 변수</h2>");
		out.print("<h3>ID : " + id + "</h3>");
		out.print("<h3>PASSWORD : " + password + " </h3>");
		out.close();
	}
}

 

getInitParameter()는 ServletConfig가 가지고 있는 메소드로서 web.xml 파일의 <servlet> 속성 중에서 <init-param>으로 지정한 변수의 값을 추출할 때 사용합니다. getInitParameter()의 인자값으로 <param-name> 태그에 지정한 값을 넣어주면 그에 대응되는 <param-value>의 값을 String 형태로 반환합니다.

 

 

[실행 결과]

 

 

 

ServletConfig 또 다른 사용방법

ServletConfig 객체를 사용하는 또 다른 방법은 HttpServlet 객체를 이용하는 방법입니다. HttpServlet의 부모 객체인 GenericServlet 객체가 상속하고 있는 인터페이스를 보면 ServletConfig가 있습니다. 따라서 우리가 만드는 서블릿 페이지에서 init() 메소드를 재정의하지 않고도 ServletConfig 객체의 메소드를 바로 사용할 수 있습니다.

 

package com.edu.test;

import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;


public class ServletConfigTestServlet extends HttpServlet{
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=UTF-8");
		PrintWriter out = resp.getWriter();
		String env = this.getInitParameter("charset");
		req.setCharacterEncoding(env);
		out.print("<h3> 이름: " +req.getParameter("name"));
		out.close();
	}
}
반응형