Mybatis DAO에서 쿼리 추출 및 로그 찍기 (Log 라이브러리 사용안함)

2018. 7. 31. 15:42framework/MyBatis

Mybatis DAO에서 쿼리 추출 및 로그 찍기 (Log 라이브러리 사용안함)

 

Mybatis 를 사용하면서 쿼리를 콘솔에 찍을 일이 생겼다.

 

Log4j, log4sql, log4j-remix 등을 사용하면 쉽게 적용할 수 있다.

 

하지만 이번 포스팅에서는 위 라이브러리들을 활용하지 않고서 Mybatis만을 이용해서 진행하려 한다.

 



 

원리를 간단하게 설명하자면 다음과 같다.

 

1. sqlSession 에서 쿼리를 추출

2. sqlSession 에서 parameter 추출

3. 쿼리의 ? 문자열을 parameter로 치환

4. 출력

 

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class SampleDao{
    
    SqlSession sqlSession = SqlMapClient.getSqlSession();
    
    public List<Object> getList(Map<String, Object> paramMap) {
        String sql = sqlSession.getConfiguration().getMappedStatement("sample.Sample.getList").getBoundSql(paramMap).getSql();
        List<ParameterMapping> parameterMappings = sqlSession.getConfiguration().getMappedStatement("sample.Sample.getList").getBoundSql(paramMap).getParameterMappings();
        
        for (ParameterMapping parameterMapping : parameterMappings) {
            String param = (String) paramMap.get(parameterMapping.getProperty());
            sql = sql.replaceFirst("\\?""'" + param + "'");
        }
 
        System.out.println("sql : " + sql);
        
        return sqlSession.selectList("sample.Sample.getList", paramMap);
    }
}
cs

 

1# : DAO 클래스

3# : SqlSession 객체 생성

5# : 리스트를 조회하는 함수

6# : statement(구문을 찾기 위해 사용될 수 있는 네임스페이스내 유일한 구분자), parameter 를 활용하여

sql를 얻음

7# : statement(구문을 찾기 위해 사용될 수 있는 네임스페이스내 유일한 구분자), parameter 를 활용하여

sql에 활용될 parameterMapping 정보를 얻음

9# : parameterMapping 정보만큼 루프

10# : parameterMapping 에 있는 프로퍼티를 paramMap의 Key로 활용하여 맵핑될 값을 추출

11# : sql에서 ? 기호를 맵핑될 값으로 차례로 치환

14# : 콘솔에 출력

 



 

 

parameter가 map일 경우만 작성된 소스이고 vo이거나 기타 다른 파라미터 일 경우도 고려해서 작성해야 한다.

또한 파라미터에 특수문자들이 있는 경우 오류가 발생할 수 있다.

위 소스는 테스트 용도로만 사용하길 바란다.