들어가며
필자는 새로운 프로젝트의 appication파일을 설정하던 중. 위 사진과 같이 com.mysql.cj.jdbc.driver 와 com.mysql.jdbc.driver 를 만나게 되었다. 이 두개의 차이점을 몰라서 차이점에 대해 알아보기 위해 글을 작성하게 되었다.
JDBC란?(Java DataBase Connectivity)
다들 알것이라고 생각하지만 한번만 더 짚고 넘어가자..! JDBC란 단순히 java에서 DB에 접속할 수 있게 해주는 것이 아닌 JDBC 표준을 통해서 연결, 내용, 요청 응답들을 표준화 하여 JDBC API를 직접적으로 사용하지 않아도 된다는 엄청난 이점을 가져왔다.
JDBC의 동작 흐름
JDBC 드라이버
- DB와의 통신을 담당하는 interface
- Oracle, MS SQL, MySQL 등과 같은 DB에 알맞은 JDBC 드라이버를 구현하여 제공
- 구현체를 통해 특정 DB에 접근 가능
이만 JDBC에 대해서 짚었으니 다시 본론으로 돌아가 cj의 유무에 대해서 알아보자.
각각 class 구현체로 들어가주면
package com.mysql.jdbc;
import java.sql.SQLException;
public class Driver extends com.mysql.cj.jdbc.Driver {
public Driver() throws SQLException {
super();
}
static {
System.err.println("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
package com.mysql.cj.jdbc;
import java.sql.SQLException;
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
public Driver() throws SQLException {
// Required for Class.forName().newInstance().
}
}
com.mysql.cj.jdbc
com.mysql.jdbc를 c, com.mysql.cj.jdbc를 cj라고 우선 명칭하겠습니당
코드를 보면 되게 이상한데 c와 cj의 드라이버들이 c는 cj를 상속받고 있고 cj는 NonRegitsteringDriver과 c를 상속받고 있다. 하지만 c 드라이버를 보면 전역으로 출력문을 작성해놓은 것을 볼 수 있다.
"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 클래스를 로드 중입니다. 이것은 더 이상 사용되지 않는다. 새 드라이버 클래스는 com mysql.cj.jdbc.Driver 이다. 드라이버는 SPI를 통해 자동으로 등록되며 일반적으로 드라이버 클래스를 수동으로 로드할 필요가 없습니다."
결론
com.mysql.jdbc는 예전에 사용하던 드라이버 클래스로 현재는 com.mysql.cj.jdbc를 사용해야 하며 com.mysql.jdbc는 com.mysql.cj.jdbc를 상속받아 사용할 수는 있지만. 권고하지 않으며 cj를 사용해야하는 것 같다.