JCF TEAM BLOG

관리자 글쓰기
블로그 »
블로그 »

현재까지 iBatis에서는 JDBC 메타데이터를 가져올 수 있는 API 를 제공하지 않고 있습니다.
문제는 Gauce나 MiPlatform 같은 X인터넷 솔루션을 사용할 경우는 데이타 컬럼 크기를 알아야만 합니다.
이럴 경우 AOP 구현기술인 AspectJ를 활용할 수 있습니다.

가장 중요한 것은 Aspect를 적용해야 하는 소스상의 위치(Pointcut) 찾아내는 것입니다.
손쉬운 방법 중에 하나는 Stacktrace를 이용하는 것입니다.
아래 Stacktrace를 보면 Resutset 객체를 참조할 수 있는 SqlExecutor.handleResults(RequestScope, ResultSet, int, int, RowHandlerCallback) 를 Pointcut으로 해야 함을 알 수 있습니다.

Thread [main] (Suspended (breakpoint at line 28 in DefaultRowHandler))
 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를 만듭니다.

public aspect IBatisJDBCMetadata {
 public pointcut sqlExecutorCall() :
         execution(* SqlExecutor.executeQuery(..)) ;
 public pointcut handleResults() :
           execution(* SqlExecutor.handleResults(..)) ;
 public pointcut executeQueryForList() :
         execution(* com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForList(..)) ;
 before(RequestScope request, ResultSet rs, int skipResults, int maxResults, RowHandlerCallback callback) :
     handleResults() && args(request, rs, skipResults, maxResults, callback) {
 
   SessionScope session = request.getSession();
   // rs를 이용하여 메타데이터 정보가져오기
    session.setAttribute("metadata", 메타정보);
  }
 after(RequestScope request, Transaction trans, Object parameterObject,
   int skipResults, int maxResults) returning(List list):
  executeQueryForList() && args(request, trans, parameterObject, skipResults, maxResults) {
  SessionScope session = request.getSession();
  //메타정보 = session.getAttribute("metadata");
  //메타정보를 조회된 리스트와 함께 반환

 }
}



사용자 삽입 이미지



 
사용자 삽입 이미지

크리에이티브 커먼즈 라이센스
Creative Commons License
Writer profile
그래도 꿈이 있어서 행복하다^^
2008/01/10 16:53 2008/01/10 16:53

(go to top)