A2공간 - 도움되는 글을 쓰자

ani2life.egloos.com

포토로그


그냥 잡담

※방명록은 따로 없고 무조건 최신글에 댓글 남기시면 됩니다. ^^

위드블로그



Tomcat 5.5 에서 JNDI Datasource 사용하기 개발/플밍

JSP 프로그래밍에서 쉽게 볼 수 있는 DB를 사용하는 방법대신 왜 DBCP, JNDI Datasource 같은 복잡한 것들을 왜 해야할까요?

DBCP, JNDI에 대한 자세한 정의는 따로 위키등에서 참고하세요.

- DBCP는 데이터베이스 커넥션풀링으로 접속객체를 풀에 넣어두고 필요할때 꺼내서 사용하여 성능을 향상시키기 위함입니다.
- JNDI(Java Naming and Directory Interface)는 분산된 자원을 디렉토리 형태로 이름지어 검색할 수 있게 하는 것입니다.
- 톰캣의 JNDI Datasource 라는 것은 데이터소스를 JNDI를 이용, 찾아서 연결해 사용하자는 것입니다.

JNDI Datasource를 이용하면 웹어플리케이션 자체에 DB접속을 위한 잡다한 코드를 넣지 않아도 되므로 환경변화에 유연합니다.

우선 컨텍스트(Context)에 데이터소스를 적어줘야 합니다.
컨텍스트 파일의 작성에 대해서는 Tomcat 5.5에서의 <Context>를 참고하시기 바랍니다.
컨텍스트에 아래와 같이 Resource를 자신의 환경에 맞게 적어줍니다.
<?xml version="1.0"?>
<Context docBase="yourapp" path="/yourapp">
<Resource description="Test database connection"
name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="yourid" password="yourpw" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mydb?autoReconnect=true"/>
</Context>
위에서 driverClassName은 로드할 드라이버를 설정하는 부분입니다.
driverClassName와 url의 값은 Java에서 일반적인 DB 접속시 많이 쓰던 것임을 알 수 있습니다.
name은 프로그램 코드에서 이 데이터소스를 참조하기 위한 이름입니다.

위에서 com.mysql.jdbc.Driver를 사용하였는데 이런 jdbc 드라이버는 톰캣의 기본 라이브러리가 아니므로 $CATALINA_HOME/common/lib 디렉토리에 mysql-connector-java-버전-bin.jar 파일을 넣어줘야 합니다.
DBCP를 위해 필요한 라이브러리는 톰캣에 기본으로 존재하며 naming-factory-dbcp.jar 입니다.

DB 드라이버를 로드하고 DBCP에 대한 복잡한 설정을 하는 프로그램 코딩 없이 설정파일에 기술하는 것만으로 JNDI Datasource로 DBCP를 이용하는데 필요한 준비는 끝났습니다.

이제 간단한 소스를 실행하여 문제없이 동작하는지 테스트 해보겠습니다.

import javax.naming.InitialContext;
import javax.sql.DataSource;

try {
    InitialContext initContext = new InitialContext();
    Context envContext = (Context)initContext.lookup("java:/comp/env");
    DataSource ds = (DataSource)envContext.lookup("jdbc/TestDB"); //위에서 설정한 데이터소스의 name
   
    Connection conn = ds.getConnection();
    System.out.println(conn);
    conn.close();
} catch(Exception e) {
    e.printStackTrace();
}

위의 코드에 문제가 없다면 org.apache.tomcat.dbcp.dbcp.PoolableConnection@15d4de6 와 같은 결과가 출력됩니다.
이제 Connection 객체를 이용해서 기존과 똑같이 데이터베이스 관련 코딩을 하면 됩니다.

JNDI를 이용하여 DataSource를 가져오는 방법은 톰캣만이 가능한것이 아니라 다른 WAS들도 가능합니다. 참조하는 name을 일치시켜주면 기존 프로그램의 코드수정 없이 WAS의 설정파일만 수정하면 됩니다.

* Name [jdbc/TestDB] is not bound in this Context 에러가 발생하면 jdbc/TestDB(해당이름)를 JNDI가 찾을 수 없다는 것으로써 설정의 name이 틀리지 않았는지 확인해보고 문제가 없다면 컨텍스트 파일을 못읽는 것일 수 있으므로 컨텍스트 파일의 위치와 파일명을 확인합니다.

* web.xml의 <resource-ref> 설정에 대한 자료도 봤는데 설정하지 않더라도 동작에 문제가 없었습니다.