현재까지 iBatis에서는 JDBC 메타데이터를 가져올 수 있는 API 를 제공하지 않고 있습니다.
문제는 Gauce나 MiPlatform 같은 X인터넷 솔루션을 사용할 경우는 데이타 컬럼 크기를 알아야만 합니다.
이럴 경우 AOP 구현기술인 AspectJ를 활용할 수 있습니다.
가장 중요한 것은 Aspect를 적용해야 하는 소스상의 위치(Pointcut) 찾아내는 것입니다.
손쉬운 방법 중에 하나는 Stacktrace를 이용하는 것입니다.
아래 Stacktrace를 보면 Resutset 객체를 참조할 수 있는 SqlExecutor.handleResults(RequestScope, ResultSet, int, int, RowHandlerCallback) 를 Pointcut으로 해야 함을 알 수 있습니다.
DefaultRowHandler.handleRow(Object) line: 28
RowHandlerCallback.handleResultObject(RequestScope, Object[], ResultSet) line: 76
SqlExecutor.handleResults(RequestScope, ResultSet, int, int, RowHandlerCallback) line: 395
SqlExecutor.executeQuery(RequestScope, Connection, String, Object[], int, int, RowHandlerCallback) line: 185
SelectStatement(GeneralStatement).sqlExecuteQuery(RequestScope, Connection, String, Object[], int, int, RowHandlerCallback) line: 205
SelectStatement(GeneralStatement).executeQueryWithCallback(RequestScope, Connection, Object, Object, RowHandler, int, int) line: 173
SelectStatement(GeneralStatement).executeQueryForList(RequestScope, Transaction, Object, int, int) line: 123
SqlMapExecutorDelegate.queryForList(SessionScope, String, Object, int, int) line: 610
SqlMapExecutorDelegate.queryForList(SessionScope, String, Object) line: 584
SqlMapSessionImpl.queryForList(String, Object) line: 101
SqlMapClientTemplate$3.doInSqlMapClient(SqlMapExecutor) line: 255
SqlMapClientTemplate.execute(SqlMapClientCallback) line: 188
SqlMapClientTemplate.executeWithListResult(SqlMapClientCallback) line: 214
SqlMapClientTemplate.queryForList(String, Object) line: 253
LookupDaoiBatis.getRoles() line: 22
다음 작업으로는 Pointcut에 적용될 Aspect를 만듭니다.
execution(* SqlExecutor.executeQuery(..)) ;
execution(* SqlExecutor.handleResults(..)) ;
execution(* com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForList(..)) ;
handleResults() && args(request, rs, skipResults, maxResults, callback) {
SessionScope session = request.getSession();
// rs를 이용하여 메타데이터 정보가져오기
session.setAttribute("metadata", 메타정보);
}
int skipResults, int maxResults) returning(List list):
executeQueryForList() && args(request, trans, parameterObject, skipResults, maxResults) {
//메타정보 = session.getAttribute("metadata");
//메타정보를 조회된 리스트와 함께 반환
}










2008/01/10 17:43




2008/01/10 16:53
ibatis


1.7로 업그레이드.
Automatically reloading iBATI...
