2005년 2월 17일 목요일

TDD

프로젝트 공통 PageUtil 클래스를 만들었다.
테스트 클래스 만들고 기반 메소드에서 문제가 될듯한 부분을 전부 테스트 했다.같이 일하고 있는 동료에게 사용해 보라고 했는데.(사용법은 테스트 클래스를 보면 알꺼라고..)3일 동안 딴일을 하느라 소스를 점검하지 못했었는데..
어제 저녁 test 리포트 에서 PageUtil관련 테스트 항목이 없어져 있는 것이 아닌가...
테스트 클래스는 삭제 되었고 ,PageUtil클래스는 이상한 방향으로 흘러 가고 있다..(물론 고쳐서 사용해 달라고 했지만..테스트 클래스는 반드시 갱신해 달라고 했는데..)
어쩌면 좋을까...

2005년 2월 16일 수요일

eclipsecolorer.sourceforge.net

이클립스 3.0x + jboss4.x에서 동작 확인 완료.
http://eclipsecolorer.sourceforge.net
http://eclipsecolorer.sourceforge.net/index_profiler.html
0.5.33 [show only this release]

2005년 2월 4일 금요일

本番環境Deploy

작년 7월부터 작업하던 프로젝트가 1차 릴리스 운용을 시작 하게 되었다.(록봉기 프로젝트와는 다른 프로젝트)
30분 후에 Deploy가 시작 된다.
오늘은 일찍 퇴근 할수 있을려나.

2005년 2월 3일 목요일

六本木生活三日目

가끔 내 블로그를 보는 일본인 동료들 때문에 일본어로 글을 올리는건 조심해야 겠다.
힘들다.
전부 CMP로 만들어 지고 있는 부분에 대해 수정이 필요하다고 말했다.오늘 그 회의 가 있었다.
검색 결과가 만건 가까이 되는걸 (그것도 CMR로 조인)CMP로 만들고 있다.뒤에서 보다가 안되는 건 아니지만 서버가 괜챤겠냐고
예기 한번 했더니 무슨 말이에요?그런다....
쩝...어찌하면 좋을까..

오늘 만든 DBUnit BaseClass

package xxx.framework.test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;

import org.dbunit.Assertion;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.database.QueryDataSet;
import org.dbunit.dataset.CompositeTable;
import org.dbunit.dataset.FilteredTableMetaData;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ITable;
import org.dbunit.dataset.filter.DefaultColumnFilter;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;

import junit.framework.TestCase;
public class DBTestCase extends TestCase {

private DBinfo info = DBinfo.getInstance();

/**
* コンストラクタ。
*
*/
public DBTestCase() {
super();

}


/**
* 指定したテーブルのデータでXMLFileを作成します。
* @param arrayTables 対象テーブル名
* @param sFileName xmlファイル名
*/
protected void exportOp(String[] arrayTables, String sFileName)throws Exception {
info.init();
exportTable(arrayTables,new File(info.sExportDir_, sFileName));
}

/**
* XMLFileをDBに書き込みます。
* @param sFileName xmlファイル名
*/
protected void importOp(String sFileName)throws Exception {
info.init();
importTable(new File(info.sExportDir_, sFileName));
}

/**
* 指定したテーブルの現在データとXMLFileを比較します。
* @param arrayTables 対象テーブル名
* @param sFileName xmlファイル名
*/
protected void compareOp(String[] arrayTables, String sFileName) throws Exception{
info.init();
compareTable(arrayTables,new File(info.sExportDir_,sFileName),null);
}
/**
* 指定したテーブルの現在データとXMLFileを比較します。
* @param arrayTables 対象テーブル名
* @param sFileName xmlファイル名
* @param columns 比較対象外とするカラム名
*/
protected void compareOp(String[] arrayTables, String sFileName,String[] columns) throws Exception{
info.init();
compareTable(arrayTables,new File(info.sExportDir_,sFileName),columns);
}

private void compareTable(String[] arrayTables, File file,String[] columns) throws Exception {
IDatabaseConnection connection = null;

try {
connection = getConnection();
QueryDataSet partialDataSet = new QueryDataSet(connection);

for (int i = 0; i < arrayTables.length; i++) {
IDataSet databaseDataSet = getConnection().createDataSet();
ITable actualTable = databaseDataSet.getTable(arrayTables[i]);
IDataSet expectedDataSet = new FlatXmlDataSet(file);
ITable expectedTable = expectedDataSet.getTable(arrayTables[i]);
if(columns == null){
Assertion.assertEquals(actualTable, expectedTable);
}else{
DefaultColumnFilter columnFilter = new DefaultColumnFilter();
for(int x = 0; x < columns.length; x++) {
columnFilter.excludeColumn(columns[x]);
}
FilteredTableMetaData metaData = new FilteredTableMetaData(actualTable.getTableMetaData(), columnFilter);
ITable filteredTable = new CompositeTable(metaData, actualTable);
Assertion.assertEquals(filteredTable, expectedTable);
}
}
}finally {
if (connection != null) {
connection.close();
}
}
}


private void importTable(File file) throws Exception {

IDatabaseConnection connection = null;
try {
connection = getConnection();
FlatXmlDataSet dataSet = new FlatXmlDataSet(file);
DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
} finally {
if (connection != null) {
connection.close();
}
}
}

private void exportTable(String[] arrayTables,File file) throws Exception{
IDatabaseConnection connection = null;
try {
connection = getConnection();
QueryDataSet partialDataSet = new QueryDataSet(connection);
for (int i = 0; i < arrayTables.length; i++) {
partialDataSet.addTable(arrayTables[i]);
}
FlatXmlDataSet.write(partialDataSet, new FileOutputStream(file));
} finally {
if (connection != null) {
connection.close();
}
}
}

private IDatabaseConnection getConnection()throws Exception {
Class driverClass =
Class.forName(info.sDriver_);

Connection jdbcConnection =
DriverManager.getConnection(
info.sUrl_, info.sUser_, info.sPassword_);

return new DatabaseConnection(jdbcConnection);
}

private void operation(DatabaseOperation operation,IDataSet dataSet)throws Exception {
IDatabaseConnection connection = null;
try {
connection = getConnection();
operation.execute(connection, dataSet);
} finally {
if (connection != null) {
connection.close();
}
}
}

private static class DBinfo{
private static final DBinfo INSTANCE = new DBinfo();
private boolean initialrized;
private Properties prop;
public String sDriver_;
public String sUrl_;
public String sUser_;
public String sPassword_;
public String sSchema_;
public String sExportDir_;


public void init() throws IOException, ClassNotFoundException {
if (initialrized) {
return;
}
synchronized (this) {
prop = new Properties();
InputStream resourceStream =
ClassLoader.getSystemResourceAsStream("dbunit.properties");

if (resourceStream == null) {
System.err.println("クラスパスにdbunit.propertiesがありません!!");
}
prop.load(resourceStream);
sDriver_ = prop.getProperty("driver");
sUrl_ = prop.getProperty("url");
sUser_ = prop.getProperty("user");
sPassword_ = prop.getProperty("password");
sSchema_ = prop.getProperty("schema");
sExportDir_ = prop.getProperty("exportDir");
Class.forName(sDriver_);
initialrized = true;
}
}

public static DBinfo getInstance() {
return INSTANCE;
}

}
}

2005년 2월 2일 수요일

코더 10명

코더라는 단어를 별로 좋아 하지는 않지만
이번 프로젝트에 참가 한 내 포지션이 PG..
이제까지는 아키텍쳐..(그게 그건가?하지만 선행 개발자 라고 해 두자.)

이번 프로젝트
개발 머신은 *HP*P4-540
모니터가 19인치라 눈이 아프다..어제까지 Thinkpad12인치 노트북 만 보다가 환경이 바뀌니 적응이 잘않된다..
ㅋㅋㅋ
개발 내용은 VOD관리 시스템..
사용자가 요건정의 가 명확히 되지 않은 상태에서 프로토타입 제작이 시작됬다.
개발 관련 툴들도 전부 오픈소스(JBOSS,LINUX,POSTGRES)라
운영인력 교육 같은 부분도 많이 필요 할듯한데..
어찌 하면 좋을까..
버그트레이싱 을 위해서 벽에다 버그 분류 시트를 붇이는데 까지는 성공했다..
일부분 코더 들에게 문제 발생 부분에대한 postit을 붇이는 작업도 요청해 6장을 붙였다.그중에 PM모니터에 2장 내모니터에 1장 나머지 3장은 벽에 붇어있다.
방금도 한장이 늘었다..일본 개발자들은 참 말하기를 싫어 한다..
한국 개발자 들도 그럴까?..

六本木生活二日目

六本木39皆で二日目。。
ちょっと不便なビルだ。
카치도키 보다 10분 정도 전차를 타는 시간은 줄었지만,
역에서 걸어오는 시간이 꽤 걸린다.(익숙해 지지 않아서 그런가.)
불편해도 경치는 죽인다.동경 시내가 한눈에 들어 오는
사진 찍어서 올려야 겠다..