개발일기/이슈 로그

[이슈 로그] com.mysql.jdbc.Driver와 com.mysql.cj.jdbc.Driver

ignuy 2023. 10. 10.

스프링 서버와 mysql을 연동하기 위해 application.yml에 DB 정보를 다음과 같이 작성하였다.

서버 구동에는 크리티컬한 문제가 없지만 유독 불편하게 빨간색으로 눈에 띄는 한줄이 있다.

Loading class `com.mysql.jdbc.Driver'. This is deprecated.
The new driver class is `com.mysql.cj.jdbc.Driver'.
The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

"com.mysql.jdbc.Driver"가 deprecated 되었다고? "com.mysql.cj.jdbc.Driver"가 최신 버전이라고?

흐으음..?

무슨 차이지?

MySQL jdbc 드라이버는 mysql connector의 버전에 따라 클래스 경로가 달라진다. com.mysql.jdbc.Driver는 Connector/J 5.x 버전까지 사용하던 드라이버 경로이다. Connector/J 8.x버전에서는 해당 클래스가 deprecated 되고 com.mysql.cj.jdbc.Driver가 사용된다.

필자가 사용하는 mysql Connector/J의 버전은 후자에 해당한다. Connector/J 버전에 따라 지원하는 MySQL과 JAVA의 버전이 다르니 나중을 위해 염두에 두자.

Connector/J
version
JRE version JDK Requried for
compilation
JDBC version MySQL Server
version
status
5.x JRE 5 이상 JDK 5.0, 8.0 이상 3.0, 4.0, 4.1, 4.2... 5.6, 5.7, 8.0 General availabilt
8.x JRE 8 이상 JDK 8.0 이상 4.2 이상 5.6, 5.7, 8.0 General availabilty, Recommended version

(참조 : https://dev.mysql.com/doc/connector-j/8.1/en/connector-j-versions.html, https://downloads.mysql.com/docs/connector-j-5.1-en.pdf)

일단, 공식문서 상으로 5.x 버전보다 8.x 버전의 사용이 훨씬 더 권장되고 있는 것 같다. 또한 5.x 버전을 사용한다면 MySQL 서버에 연결할 때 일부 최신 TLS 버전과 암호 제품군을 사용하기 위해선 사용자 정의된 JSSE 제공자가 필요하다는 서술이 함께 있다.

because Oracle's Java 8 releases before 8u261 were shipped with JSSE implementations that support TLS up to version 1.2 only, you need a customized JSSE implementation to use TLSv1.3 on those Java 8 platforms. Oracle Java 8u261 and above do support TLSv1.3, so no customized JSSE implementation is needed.

8u261 이전의 Oracle Java 8 릴리스는 TLS 버전 1.2까지만 지원하는 JSSE 구현과 함께 제공되었으므로 해당 Java 8 플랫폼에서 TLS v1.3을 사용하려면 사용자 정의된 JSSE 구현이 필요합니다. Oracle Java 8u261 이상은 TLSv1.3을 지원하므로 사용자 정의된 JSSE 구현이 필요하지 않습니다.

다행히, 서버 동작이 멈출 정도로 크리티컬한 이슈는 아니다. 이슈 로그를 잘보면 "The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary."라고 서술하고 있다. deprecated 된 클래스는 자동으로 SPI(Service Provider Interface)에 의해 최신 버전으로 로드될 것이다.

이외에도

Driver 클래스 뿐만 아니라 버전 변화의 영향을 받아 패키지 경로가 달라진 클래스, 인터페이스의 경로는 다음과 같다.

기존 변경
com.mysql.jdbc.ExceptionInterceptor com.mysql.cj.exceptions.ExceptionInterceptor
com.mysql.jdbc.StatementInterceptorV2 com.mysql.cj.interceptors.QueryInterceptor
mysql.jdbc.ConnectionLifecycleInterceptor com.mysql.cj.jdbc.interceptors.ConnectionLifecycleInterceptor
com.mysql.jdbc.AuthenticationPlugin com.mysql.cj.protocol.AuthenticationPlugin
com.mysql.jdbc.BalanceStrategy com.mysql.cj.jdbc.ha.BalanceStrategy
com.mysql.jdbc.jdbc2.optional.MysqlDataSource com.mysql.cj.jdbc.MysqlDataSource
com.mysql.jdbc.jdbc2.optional.MysqlDataSourceFactory com.mysql.cj.jdbc.MysqlDataSourceFactory
com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource com.mysql.cj.jdbc.MysqlConnectionPoolDataSource
com.mysql.jdbc.jdbc2.optional.MysqlXADataSource com.mysql.cj.jdbc.MysqlXADataSource
com.mysql.jdbc.jdbc2.optional.MysqlXid com.mysql.cj.jdbc.MysqlXid

댓글