- ERROR

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource[...]Caused by: java.lang.RuntimeException: Driver net.sf.log4jdbc.sql.jdbcapi.DriverSpy claims to not accept jdb..

미니언니 2023. 7. 17. 00:14

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource[...]Caused by: java.lang.RuntimeException: Driver net.sf.log4jdbc.sql.jdbcapi.DriverSpy claims to not accept jdbcUrl

 

이런 에러가 보이면,

 

1) JDBC URL 형식 다시 확인

2) 드라이버 호환성 다시 확인

3) log4jdbc 구성 다시 확인

 


내가 겪은 2가지의 경우는,

 

1. 애플리케이션 yml에 있는 JDBC URL을 가지고 DataGrip에서 접속하려고 했는데 Fail

driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
jdbcUrl: jdbc:log4jdbc:oracle:thin:@{DB 주소}

이렇게 설정이 되어있었고, 아무 생각 없이 복붙하다가 Fail이 되었다.

▶ 해결은 ? jdbcUrl에서 log4jdbc을 빼주면 된다. jdbc:oracle:thin:@{DB정보}

 

2. devOps 팀이 stage 서버를 만들고 실행했는데 Exception

driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
jdbcUrl: jdbc:oracle:thin:@{DB 주소}

이렇게 설정이 되어있었고, 잠깐 뭐지 싶었지만 같은 실수는 반복하지 않아야한다.

 

▶ 해결은 ? jdbcUrl에서 log4jdbc을 넣어주면 된다. jdbc:log4jdbc:oracle:thin:@{DB 주소}

 


자, 이제 해결은 했고 이유를 알아야한다.

 

우선 DriverSpy 클래스는 Log4JDBC 라이브러리에서 제공하는 클래스이다.

이 클래스는 실제 JDBC 드라이버를 대신하는 프록시이다.

Proxy란? 한 객체가 다른 객체를 대신해 그 객체의 동작을 제어하거나, 추가적인 기능을 제공하는 디자인 패턴

그래서 driver-class-name 이 실제 JDBC 드라이버가 아닌 것이다.

또한 DriverSpy를  정상적으로 사용하려면, JDBC url에 :log4jdbc 접두사를 추가하여 실제 연결 정보를 DriverSpy에게 전달해야 한다.

 



그럼 해결의 이유가 나왔다.


1번의 경우, DataGrip은 실제 JDBC를 사용해야 하기 때문에 :log4jdbc을 넣으면 안되었던 것이고

2번의 경우, 로깅을 사용하기 위하여 DriverSpy를 사용해야 하기 때문에 :log4jdbc을 넣어줘야 했던 것이다.

 

그런데 여기서 든 생각은 stage에서 SQL로깅을 하는것이 맞나 싶다.

log4jdbc를 넣을게 아니라 ,

driver-class-name 을 실제 드라이버인 oracle.jdbc.OracleDriver로 바꿔줘야 맞는게 아닌가라는 생각이 든다. 

 

이유는 로깅은 시스템 성능상 영향을 줄 수 있기 때문에 production과 가장 유사한 환경인 stage에서 로깅을 하는 게 맞을까 생각이 들었다. 나중에 부하테스트나 속도 테스트를 할 때도 production에서 하진 않을 테니 말이다. 

 

비록 현재는 JDBC Url에 log4jdbc 접두사를 넣는 것으로 되었지만,

stage에 로깅은 나중에 빼도 되는 문제이니, 성능 테스트 할때 그때 말씀 드려서 빼면 될 것 같다~