본문 바로가기
교재 실습/자바 웹 개발 워크북

31. 컨텍스트 초기화 매개변수

by Jint 2022. 1. 28.

서블릿 초기화 매개변수는 그 매개변수가 선언된 서블릿에서만 사용될 수 있고 다른 서블릿은 참조할 수 없다. 따라서 JDBC 드라이버와 데이터베이스 연결 정보에 대한 초기화 매개변수를 각 서블릿마다 별도로 설정해야 해서 매우 번거롭고 낭비적이다. 이런 경우 컨텍스트 초기화 매개변수(같은 웹 애플리케이션에 소속된 서블릿들이 공유하는 매개변수)를 사용한다.

 

web.xml에 컨텍스트 초기화 매개변수를 선언한다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xmlns="http://xmlns.jcp.org/xml/ns/javaee"
		 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
		 id="WebApp_ID"
		 version="3.1">
  <display-name>web04</display-name>
  
  	<!-- 컨텍스트 초기화 파라미터 -->
	<context-param>
		<param-name>driver</param-name>
		<param-value>com.mysql.jdbc.Driver</param-value>
	</context-param>
	<context-param>
		<param-name>url</param-name>
		<param-value>jdbc:mysql://localhost/studydb</param-value>
	</context-param>
	<context-param>
		<param-name>username</param-name>
		<param-value>study</param-value>
	</context-param>
	<context-param>
		<param-name>password</param-name>
		<param-value>study</param-value>
	</context-param>
    
    ...
    
 </web-app>

 

MemberUpdateServlet 클래스의 doGet()에서 서블릿 초기화 매개변수를 사용하는 코드를 컨텍스트 초기화 매개변수를 사용하는 코드로 변경한다.

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
    ...
    
    try {
		//HttpServlet 클래스로부터 상속받은 getServletContext()를 호출하여 ServletContext 객체 준비
		ServletContext sc = this.getServletContext();
			
		//getInitParameter()를 호출하면 web.xml에 선언된 컨텍스트 초기화 매개변수 값을 얻음
		Class.forName(sc.getInitParameter("driver"));
		conn = DriverManager.getConnection(
			sc.getInitParameter("url"),
			sc.getInitParameter("username"),
			sc.getInitParameter("password"));
	
    	...
    
    } catch (Exception e) {
		throw new ServletException(e);
			
    } finally {
		try {if (rs != null) rs.close();} catch(Exception e) {}
		try {if (stmt != null) stmt.close();} catch(Exception e) {}
		try {if (conn != null) conn.close();} catch(Exception e) {}
    }
    
}

 

MemberUpdateServlet 클래스의 doPost()에서도 컨텍스트 초기화 매개변수를 사용하는 코드로 변경한다.

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
    ...
    
    try {
    
		//JDBC 드라이버를 로딩하고 데이터베이스 연결 시 컨텍스트 초기화 매개변수에서 해당 정보 가져와 처리.
		ServletContext sc = this.getServletContext();
		Class.forName(sc.getInitParameter("driver"));
		conn = DriverManager.getConnection(
					sc.getInitParameter("url"),
					sc.getInitParameter("username"),
					sc.getInitParameter("password"));
        
        ...
        
        } catch (Exception e) {
			throw new ServletException(e);
			
		} finally {
			try {if (stmt != null) stmt.close();} catch(Exception e) {}
			try {if (conn != null) conn.close();} catch(Exception e) {}
		}
        
}

톰캣 서버를 재시작 후 회원정보를 등록하면 이전과 똑같이 정상적으로 수행된다. 이렇게 여러 서블릿에서 공통으로 참고하는 값이 있을 경우 컨텍스트 매개변수로 정의하면 web.xml 파일을 좀 더 간결하게 유지할 수 있다. 또한 변경 사항이 발생하더라도 한 번만 변경하면 되기 때문에 유지보수에 편리하다.

 

MemberListServlet 클래스와 MemberAddServlet 클래스도 컨텍스트 초기화 매개변수를 사용하도록 수정하였고, MemberListServlet 클래스의 슈퍼 클래스를 GenericServlet 클래스에서 HttpServlet 클래스로 교체한 뒤 service()대신 doGet()을 오버라이딩했다. 이후 회원 정보를 삭제하는 서블릿인 MemberDeleteServlet 클래스를 만들었다.

@WebServlet("/member/delete")
public class MemberDeleteServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Connection conn = null;
		Statement stmt = null;

		try {
			//JDBC 드라이버를 로딩하고 데이터베이스 연결 시 컨텍스트 초기화 매개변수에서 해당 정보 가져와 처리.
			ServletContext sc = this.getServletContext();
			Class.forName(sc.getInitParameter("driver"));
			conn = DriverManager.getConnection(
						sc.getInitParameter("url"),
						sc.getInitParameter("username"),
						sc.getInitParameter("password")); 
			
			stmt = conn.createStatement();
			stmt.executeUpdate(
					"DELETE FROM MEMBERS WHERE MNO=" + 
					request.getParameter("no"));
			
			response.sendRedirect("list");
			
		} catch (Exception e) {
			throw new ServletException(e);
			
		} finally {
			try {if (stmt != null) stmt.close();} catch(Exception e) {}
			try {if (conn != null) conn.close();} catch(Exception e) {}
		}

	}
}

 

MemberListServlet 클래스에서 출력되는 각 항목의 끝에 삭제링크를 추가한 뒤, MemberUpdateServlet 클래스에도 삭제 버튼을 추가하였다.

그림 1 (회원 목록 페이지)

 

삭제버튼을 클릭하면 해당 회원 정보가 정상적으로 삭제된다.

 

그림 2 (회원 상세 정보 페이지)

회원 상세 정보 페이지에서도 삭제버튼을 클릭하면 해당 회원 정보가 정상적으로 삭제된다.

그림 3 (회원 목록 페이지)

2개의 데이터가 삭제된 모습이다.

 

참고도서 : https://freelec.co.kr/book/1674/

 

[열혈강의] 자바 웹 개발 워크북

[열혈강의] 자바 웹 개발 워크북

freelec.co.kr

'교재 실습 > 자바 웹 개발 워크북' 카테고리의 다른 글

33. 필터 사용하기 (2)  (0) 2022.01.30
32. 필터 사용하기 (1)  (0) 2022.01.29
30. 서블릿 초기화 매개변수 (2)  (0) 2022.01.26
29. 서블릿 초기화 매개변수 (1)  (0) 2022.01.25
28. 리다이렉트  (0) 2022.01.24

댓글