AbstractMethodError: Receiver class net.sf.log4jdbc.sql.jdbcapi.ResultSetSpy does not define or inherit an implementation of the resolved method 'abstract java.lang.Object getObject(java.lang.String, java.lang.Class)' of interface java.sql.ResultSet.
Spring Boot + MyBatis 환경에서 SQL 로깅을 위해 log4jdbc를 사용하던 중,
DTO의 필드에 LocalDate 타입을 추가했더니 아래와 같은 AbstractMethodError가 발생했습니다. 이에 대한 해결 법을 공유합니다.
1
AbstractMethodError: Receiver class net.sf.log4jdbc.sql.jdbcapi.ResultSetSpy does not define or inherit an implementation of the resolved method 'abstract java.lang.Object getObject(java.lang.String, java.lang.Class)' of interface java.sql.ResultSet.
log4jdbc란?
log4jdbc는 JDBC 드라이버의 SQL 실행 로그를 출력해주는 라이브러리입니다. Spring Boot에서 MyBatis, JPA 등과 함께 사용하면 SQL 실행 내역, 바인딩 값, 실행 시간 등을 쉽게 로깅할 수 있습니다.
일반적으로 SQL 실행 로그를 확인하려면 logging.level을 설정하거나 직접 로깅 기능을 구현해야 하지만, log4jdbc를 사용하면 별도의 추가 작업 없이 자동으로 SQL 로그를 출력할 수 있습니다.
해결 방법
해결 방법은 공유하기도 부끄러울 정도로 단순했습니다. 라이브러리 명칭의 잘못된 표기가 문제였는데, 기존에 사용하던 log4jdbc-log4j2-jdbc4 를 log4jdbc-log4j2-jdbc4.1 로 수정하여 해결했습니다. 둘 다 maven repository에 존재하고 version이 동일하여 눈에 잘 띄지 않아 삽질을 좀 했습니다…
AS-IS
1
implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4:1.16'
TO-BE
1
implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'
log4jdbc-log4j2-jdbc4 vs log4jdbc-log4j2-jdbc4.1 차이점
둘 다 log4jdbc 기반의 SQL 로깅 라이브러리이지만, 지원하는 JDBC 버전이 다릅니다.
| 라이브러리 이름 | 지원하는 JDBC 버전 |
|---|---|
log4jdbc-log4j2-jdbc4 | JDBC 4.0 |
log4jdbc-log4j2-jdbc4.1 | JDBC 4.1 |
마치며
Java 7 이상에서는 log4jdbc-log4j2-jdbc4.1 를 사용합시다. 감사합니다.
This post is licensed under CC BY 4.0 by the author.