Web언어/JSP

[ JSP ] Servlet 과 ServletConfig

IT록흐 2021. 6. 20. 09:58
반응형

 

 

 

 

서블릿(Servlet)은

콘솔프로그램에서 동작하는

클래스가 아니다.

 

 

서블릿은

웹환경에서 동작하는

클래스이다.

 

 

단순한 클래스를 서블릿 클래스로 바꾸려면 서블릿활동에 필요한 API를 장착해야한다. 서블릿 클래스의 가장 근본이 되는 API에는 Servlet 인터페이스와 ServletConfig 인터페이스가 있다.

 

Servlet 인터페이스는 서블릿의 생성과 실행 그리고 삭제와 관련된 인터페이스이다. ServletConfig 인터페이스는 서블릿의 초기화와 관련된 인터페이스이다. 톰캣의 lib 폴더에 가면 서블릿을 위한 API가 존재한다.

 

 

 

이클립스를 사용하면 톰캣과 연동하여 접근할 수 있고 cmd 창으로 컴파일 하는 경우, 클래스패스 지정을 통해 접근하여 사용할 수 있다.

 

Servlet 인터페이스

 

Servlet은 생명주기는 생성 및 초기화 => 실행 => 파괴 순으로 진행된다. Servlet의 생명주기를 Servlet 인터페이스가 담고 있다.

 

1. void init(ServletConfig)

 

서블릿에 필요한 초기 설정들을 초기화하는 부분이다.

 

2. void service(ServletRequest, ServletResponse)

 

콘솔 프로그램의 main과 같은 영역이다. 실제로 실행이 되는 영역이다.

 

3. void destroy()

 

생성된 servlet을 파괴하는 메소드로 톰캣 종료시 자동으로 실행된다.

 

 

한번 실행된 서블릿은 서버의 메모리에 계속 상주해 있는다. 그래서 다수의 클라이언트가 해당 서블릿에 반복하여 접근해도 init() -> service() -> destory() 과정을 반복하지 않는다.

 

package com.jspstudy.blog;
import javax.servlet.GenericServlet;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;

@WebServlet("/hello") // 서블릿 매핑
public class JspStudy extends GenericServlet {
	//초기화 부분
	public void init() { 
		System.out.println("서블릿 초기화");
	}
	//실행 부분
	public void service(ServletRequest request, ServletResponse response) {
		System.out.println("서블릿 실행");
	}
	//종료 부분
	public void destroy() {
		System.out.println("서블릿 종료");
	}
}

 

 

< 출력 결과 >

 

 

호출될 때만 초기화가 되고, 새로고침을 통해 반복하여 서블릿에 접근했을 때, service 메소드만 호출되어짐을 알 수 있다. 이를 통해, 서블릿은 한번 호출되면 계속 서버의 메모리에 상주하고 있음을 알 수 있다.

 

 

ServletConfig 인터페이스

 

콘솔 프로그램의 Main은

Main(String[] args)이다.

 

 

args 문자열 배열에는

프로그램 실행 전,

필요한 초기 파라미터를

저장하고 있다.

 

 

(자세한 내용은 아래 포스팅 참고)

 

[ JAVA ] String args[] 존재 이유

public class StringArgs { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(args[0]); System.out.println(args[1]); System.out.println(args[2]); } } Stri..

lordofkangs.tistory.com

 

 

이처럼 서블릿 클래스도 여러 설정에 필요한 초기 파라미터를 저장할 수 있다. 앞에서 알아본 Servlet 인터페이스의 init(ServletConfig) 메소드는 초기 파라미터를 활용하여 원하는 초기화 로직을 짜는 영역이다.

 

초기 파라미터를 설정하는 방법은 두 가지가 있다.

 

1. @ 어노테이션

 

어노테이션이 일반적으로 자주 사용된다. 이클립스를 사용하면 간단히 초기 파라미터를 설정할 수 있다.

 

 

 

서블릿 클래스의 이름을 설정해주고 NEXT 버튼을 누른다.

 

 

 

initialization parameters에 add 버튼을 눌러 저장한다.

 

 

 

그럼 위와 같이 저장이 된다. 그리고 URL mappings 부분에서도 알 수 있듯이 서블릿의 가상경로는 복수 개로 지정 가능하다. Finish 버튼을 눌러 서블릿 클래스를 생성해보자.

 

 

클래스 선언부 위에, 설정한 값들이 어노테이션 안에 명시되어 있다. initParams 안에 저장된 데이터는 ServletConfig 인터페이스를 통해 접근이 가능하다. ServletConfig 인테페이스는 getInitParameter(String name) 추상메소드가 있어, 이를 통해 지정된 name의 value 값을 얻어 낼 수 있다.

 

package com.jspstudy.blog;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// 어노테이션을 통한 매핑 및 초기 파라미터 설정
@WebServlet(
        // 서블릿 매핑
		urlPatterns = { 
				"/StudyServlet", 
				"/SS"
		}, 
        //초기 파라미터 설정
		initParams = { 
				@WebInitParam(name = "ph1", value = "010-5555-6666")
		})
public class StudyServlet extends HttpServlet {
	
	String phoneNumber = null;
	//초기화 부분
    public void init(ServletConfig config) {
    	System.out.println("초기화 시작!");
    	phoneNumber = config.getInitParameter("ph1"); 
       // 서블릿이 호출되면 웹서버가 알아서 실행
       // ServletConfig 인터페이스의 
       // getInitParameter 메소드로 데이터 가지고오기
    	
    }

    //service 실행
    public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    	System.out.println("실행 시작!");
    	System.out.println("철수의 전화 번호는 : " + phoneNumber);
  }
}

 

<출력 결과>

 

 

system.out.println()은 서버의 콘솔에 출력하는 명령어이기에 이렇게 콘솔창에 출력된다. 출력 결과를 보면, 서블릿 클래스를 만들며 설정했던 값이 잘 출력되었음을 알 수 있다.

 

 

2. web.xml

 

web.xml이라는 한 가지 파일 안에 여러 서블릿의 정보가 공동으로 관리된다. 그러다 보니 여러 개발자가 한 가지 파일을 가지고 작업하게 되니 많은 문제가 발생할 수 있다. 그래서 일반적으로는 어노테이션을 web.xml 대신 자주 사용한다.

 

우선 톰캣의 web.xml을 이클립스에 복사한다. web.xml은 Client가 접근하면 안되는 서버 파일이므로 WEB-INF 폴더 안에 들어가 있다. WEB-INF안에 web.xml을 복사한 후, 초기 파라미터를 설정한다.

 

< web.xml >

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  version="3.1"
  metadata-complete="true"> 
 // metadata-complete 속성은 true여야한다.
 // true이면 Servlet deployment tool은 어노테이션을 스캐닝하지 않고 
 // web.xml만 검사한다.
 
 //서블릿 설정
  <servlet>
    //초기 파라미터를 설정할 서블릿 
  	<servlet-name>scs</servlet-name>
  	<servlet-class>com.jspstudy.blog.ServletConfigStudy</servlet-class>
  	//초기 파라미터 설정
     <init-param>
  		<param-name>ph1</param-name> // name 설정
  		<param-value>010-4234-2333</param-value> //value 설
  	</init-param>
  </servlet>
 
 //서블릿 매핑
  <servlet-mapping>
    <servlet-name>scs</servlet-name>
    <url-pattern>/scs</url-pattern>
  </servlet-mapping>

( xml에서 // 는 주석처리 표시가 아닌데,

가독성을 위해 //로 주석처리를 했습니다. )

 

<Servlet 클래스>

package com.jspstudy.blog;

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletConfigStudy extends HttpServlet {
	
	String phoneNumber = null;
	
    public void init(ServletConfig config) {
    	System.out.println("초기화 시작!");
    	phoneNumber = config.getInitParameter("ph1");
    }
    
    public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    	System.out.println("실행 시작!");
    	System.out.println("철수의 전화 번호는 : " + phoneNumber);
    }
    
}

<출력 결과>

 

 

 

 


 

정리

 

 

1. Servlet은 초기화 -> 실행 -> 파괴 순의 라이프 사이클을 갖는다.

2. Servlet이 실행되기 전 미리 알고 있어야 하는 데이터들을 어노테이션과 web.xml로 설정할 수 있다.

3. ServletConfig 인터페이스를 통해 초기 파라미터 값들에 접근할 수 있다.

 

반응형

'Web언어 > JSP' 카테고리의 다른 글

[ JSP ] 인코딩(Encoding)을 하는 이유  (3) 2021.06.21
[ JSP ] HttpServlet이란?  (0) 2021.06.21
[ JSP ] 서블릿(Servlet) 등록 (web.xml 과 어노테이션)  (1) 2021.06.20
[ JSP ] JSP의 역할  (0) 2021.06.20
[ JSP ] Servlet 이란?  (0) 2021.06.20