2014년 10월 26일 일요일

mybatis 쿼리를 이쁘게 출력하기

mybatis로 개발하다보면 한가지 아쉬운 부분이 있다.

바로 쿼리로그!!



파라미터가 바인드되지 않고 물음표로 나오거나, 개행, 탭문자가 전부 무시되어서 가독성이 극악이기 때문이다.



그래서 많은 사람들이 크게 3가지 방법으로 개선을 시도한다.

1. mybatis 소스 자체를 고치거나

2. mybatis의 인터셉터 기능을 이용해서 로그로 찍힐 쿼리를 수정하거나

3. 별도의 라이브러리를 사용하는 방법이다.


3가지 전부 한계점이 있다.

1번은 메이븐 프로젝트와 같은 경우 수정된 mybatis를 배포하기 어려운점이 있다.
2번은 코드개발에 무척 많은 시간이 걸린다는 점.
3번은 보통 log4sql나 log4jdbc을 사용하는데 파라미터 바인드, 개행 탭무시등 둘중 하나가 제대로 되지 않는다.

나같은 경우 처음에는 log4sql을 사용했는데, log4sql은 메이븐에 배포 되지도 않고, System.out를 사용한다기에, log4jdbc로 교체했다.

그러나 log4jdbc는 개행, 탭문자가 전부 무시되어 불편함이 많았다.



현재 개발중인 프로젝트가 메이븐프로젝트이기 때문에 1번은 넘어가고, 2번 방법으로 시도를 해보았다.

별도로 내가 개발하진 않고, 인터넷이 공개되어 있는 소스를 가져다 사용했는데, 이것또한 한계점이 있었다.



파라미터 변수를 바인드 할때 #{params.param.value} 처럼 2단계로 매핑이 되어 있을 경우 에러가 났다.

이런케이스 까지 커버하려니 무척이나 귀찮았고, 이것말고도 다른 에러가 날수도 있기 때문에 바로 포기.



그 다음 시도한 방법은 log4jdbc를 수정하는 방법이다.(실제로 시도해보니 수정할 필요가 없는, 설정값 변경 방법이다.)

log4jdbc는 mybatis에서 던져준 쿼리를 사용하는게 아니라 jdbc드라이버를 이용해서 쿼리를 캡쳐하기 때문에 개행, 탭문자를 무시하는 부분만 찾아내면 될것 같았다.



Slf4jSpyLogDelegator클래스를 보면 processSql 메소드가 그러한 작업을 수행하는데,
분기 조건중에 DriverSpy.DumpSqlMaxLineLength가 0이하이면 해당 기능을 수행하지 않고, 바로 리턴한다.

그리고 DriverSpy.DumpSqlMaxLineLength값은 System.properties("log4jdbc.dump.sql.maxlinelength")에서 불러온다.

그래서 현재 톰캣을 사용중인 나는 톰캣에 -Dlog4jdbc.dump.sql.maxlinelength=0로 설정값을 주고 사용해 보니 잘 작동된다.

댓글 1개: