◆ 잡담
  사수의 휴가로 인해 할일없이 눈치만 보고 있다가, 사수가 휴가때 연락이 와서 해란다. 음... 드디어 삽질의 시작인가... 참고 도서는 jUnit in Action이고, 항상 그렇지만 이론보다는 예제 위주이다. (항상 그래왔다. 이론은 책이나 웹사이트를 부지런히 찾아다니면 얼마든지 많다. 뭐... 예제도 많이 있지만, 한번 해보고 이해하자는 나의 성격상 이론은 일단 해보고 익힌다.)

◆ 개발환경
  + CPU : Pentium 4 3.20GHz
  + RAM : 1GB
  + 운영체제 : Windows XP Service Pack2
  + 언어 : jdk 5 (Tiger)
  + IDE : Eclipse 3.1 (with WEB tool)
  + DB : mysql 4.1
  + WAS : tomcat 5.0.28

◆ 필요한 라이브러리
  + ant : http://ant.apache.org
  + dbunit : http://www.dbunit.org
  + cactus : http://jakarta.apache.org/cactus
  + commons-beanutils : http://jakarta.apache.org/commons/beanutils

◆ 실습
  + 이번에 참고한 책은 junit in Action 이다. ant, db 설치및 설정은 완료된 것으로 간주하며, 단순한 형태로 만들 것이다. 또한 java web application(servlet programming)에 대한 이해도 하고 있다고 간주한다.

  1. 먼저 tomcat의 server.xml에 DBCP를 하나 설정한다. DBCP 설정하는 이전 포스트를 참고해서 만들면 된다.

  2. 디렉토리 구조를 이클립스 프로젝트에서 다음 그림처럼 만들었다. (책의 디렉토리 구조와 거의 비슷하다.)
    + conf : 여러가지 설정 파일을 넣기 위한 디렉토리(여기서는 table 생성을 위한 sql 파일 하나만 들어간다.)
    + src/java : Jdbc로 DB에 연결할 DBCP 생성 및 Query 처리를 담당하기 위한 소스 디렉토리
    + src/test : dbunit과 cactus를 사용하여 unit test할 test 소스 디렉토리
      + data.xml : DB에 데이터를 insert할 data xml 파일
    + 나머지 디렉토리는 일반 Java Web application 구조와 동일하므로 생략한다.

  3. 예상외로 소스 코드는 간단하다.
DataAccessManager.java
package kr.pe.dada;

import java.util.Collection;

public interface DataAccessManager {
    Collection execute(String string) throws Exception;
}

JdbcDataAccessManager.java
package kr.pe.dada;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;

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

import org.apache.commons.beanutils.RowSetDynaClass;

public class JdbcDataAccessManager implements DataAccessManager {
   private DataSource dataSource;

   public JdbcDataAccessManager() throws NamingException {
       this.dataSource = getDataSource();
   }

   protected DataSource getDataSource() throws NamingException {
       InitialContext context = new InitialContext();
       DataSource dataSource = (DataSource) context.lookup("java:comp/env/DefaultDS");

       return dataSource;
   }

   public Collection execute(String sql) throws Exception {
       ResultSet resultSet = null;
       Collection result = null;
       Connection connection = null;

       try {
           connection = getConnection();
           resultSet = connection.createStatement().executeQuery(sql);
          
           RowSetDynaClass rsdc = new RowSetDynaClass(resultSet);
           result = rsdc.getRows();
       } finally {
           if (resultSet != null) {
               resultSet.close();
           }

           if (connection != null) {
               connection.close();
           }
       }
       return result;
   }

   protected Connection getConnection() throws SQLException {
       return this.dataSource.getConnection();
   }
}
   * JdbcDataAccessManager는 Tomcat의 DBCP을 사용한다.
  - context.lookup("java:comp/env/DefaultDS") 부분 - 특별히 하는 일은 없고, Connection을 얻어오고, sql문을 실행하여 그 결과를 return하는 역할을 한다.

TestJdbcDataAccessManagerIC.java
package kr.pe.dada;

import java.util.Collection;
import java.util.Iterator;

import javax.naming.InitialContext;

import kr.pe.dada.JdbcDataAccessManager;

import org.apache.cactus.ServletTestCase;
import org.apache.commons.beanutils.DynaBean;
import org.dbunit.database.DatabaseDataSourceConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;

public class TestJdbcDataAccessManagerIC extends ServletTestCase {
   protected void setUp() throws Exception {
       IDatabaseConnection connection = new DatabaseDataSourceConnection(
               new InitialContext(), "java:comp/env/DefaultDS");

       IDataSet dataSet = new FlatXmlDataSet(this.getClass().getResource(
               "data.xml"));

       try {
           DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
       } finally {
           connection.close();
       }
   }

   public void testExecuteOk() throws Exception {
       JdbcDataAccessManager manager = new JdbcDataAccessManager();

       Collection result = manager.execute("SELECT * FROM CUSTOMER");
       Iterator beans = result.iterator();

       assertTrue(beans.hasNext());
       DynaBean bean1 = (DynaBean) beans.next();

       assertEquals("John", bean1.get("firstname"));
       assertEquals("Doe", bean1.get("lastname"));
       assertTrue(!beans.hasNext());
   }
}
   * Cactus의 Servlet
   data.xml
<dataset>
   <customer firstname="John" lastname="Doe">
   </customer>
</dataset>
Posted by xHuro
,