본문 바로가기
개발~/JSP

[JSP]DBCPInit2.java

by 보배곰 2017. 3. 8.

참고한 책: 최범균의 JSP 2.3 웹 프로그래밍 기초부터 중급까지 

chap 17 서블릿 기초 509p


앞에서 쓴 DBCPInit 클래스는 JDBC URL, DB 사용자 정보가 코드에 있기 때문에 DB를 변경하거나 user를 변경해야할 시 코드를 직접 수정해야하는 단점이 있다. 

서블릿은 코드를 직접 변경하지 않고 사용할 값을 변경할 수 있는 방법을 제공하는데, 그 방법은 초기화 파라미터를 사용하는 것이다. web.xml의 <init-param> 태그를 이용해서 초기화 파라미터를 전달할 수 있다.


 ▶web.xml

 <servlet>

    <servlet-name>DBCPInit2</servlet-name>

    <servlet-class>jdbc.DBCPInit2</servlet-class>

    <init-param>

      <param-name>jdbcDriver</param-name>

      <param-value>com.mysql.jdbc.Driver</param-value>

    </init-param>

    <init-param>

      <param-name>poolName</param-name>

      <param-value>guestbook</param-value>

    </init-param>

    <load-on-startup>1</load-on-startup>

  </servlet>


web.xml 전체소스

  • <param-name> 태그 : 초기화 파라미터의 이름을 지정한다.
  • <param-value> 태그 : 초기화 파라미터의 값을 지정한다. 
서블릿 클래스에서 초기화 파라미터에 접근하려면 getInitParameter() 메서드를 사용하면 된다.

 ▶DBCPInit2.java 

package jdbc;


import java.sql.DriverManager;


import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;


import org.apache.commons.dbcp2.ConnectionFactory;

import org.apache.commons.dbcp2.DriverManagerConnectionFactory;

import org.apache.commons.dbcp2.PoolableConnection;

import org.apache.commons.dbcp2.PoolableConnectionFactory;

import org.apache.commons.dbcp2.PoolingDriver;

import org.apache.commons.pool2.impl.GenericObjectPool;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;



public class DBCPInit2 extends HttpServlet {

private static final long serialVersionUID = 1L;

       

    public DBCPInit2() {

        super();

    }

    

    @Override

    public void init() throws ServletException {

    loadJDBCDriver();

    initConnectionPool();

    }


    //JDBC Driver load

    private void loadJDBCDriver() {

    String driverClass = getInitParameter("jdbcDriver");

try {

Class.forName(driverClass).newInstance();

} catch (Exception e) {

e.printStackTrace();

}


System.out.println("after connection.....");

    }


    private void initConnectionPool() {

try {

String jdbcUrl = getInitParameter("jdbcUrl");

String username = getInitParameter("username");

String password = getInitParameter("password");

//ConnectionFactory 생성

ConnectionFactory connFactory = new DriverManagerConnectionFactory(jdbcUrl, username, password);

//PoolableConnection을 생성하는 Factory 생성

PoolableConnectionFactory poolableConnFactory = new PoolableConnectionFactory(connFactory, null);

poolableConnFactory.setValidationQuery("select 1");

//커넥션 풀의 설정 정보

GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();

poolConfig.setTimeBetweenEvictionRunsMillis(1000L * 60L * 5L);

poolConfig.setTestWhileIdle(true);

poolConfig.setMinIdle(4);

poolConfig.setMaxTotal(50);

//커넥션 풀 생성 및 연결

GenericObjectPool<PoolableConnection> connectionPool = new GenericObjectPool<>(poolableConnFactory, poolConfig);

poolableConnFactory.setPool(connectionPool);

//커넥션 풀을 제공하는 JDBC 드라이버를 등록

Class.forName("org.apache.commons.dbcp2.PoolingDriver");

//커넥션 풀 드라이버에 생성한 커넥션 풀을 등록

PoolingDriver driver = (PoolingDriver)DriverManager.getDriver("jdbc:apache:commons:dbcp:");

String poolName = getInitParameter("poolName");

driver.registerPool(poolName, connectionPool);

} catch(Exception e) {

System.out.println(e.getMessage());

}

}

}



JDBC URL이나 다른 설정을 바꾸려면 서블릿을 변경할 필요 없이 web.xml 파일의 초기화 파라미터 값을 변경하면 된다. 

getInitParameter() 메서드는 지정한 초기화 파라미터가 존재하면 해당 값을 리턴하며, 존재하지 않으면 null을 리턴한다. 따라서 null인 경우 기본값을 사용하고 싶거나 다른 예외 처리를 하고 싶다면 초기화 파라미터 값이 null인지 여부를 확인해서 알맞게 처리해야 한다.

 //초기화 파라미터가 없으면 null을 리턴한다.

 String poolName = getInitParameter("poolName");

 if(poolName == null)

poolName = "pool";