2020-10-29 TIL
JDBC
JDBC API 와 MariaDB JDBC Driver
- java.sql.* org.mariadb.jdbc.*
- Driver <—– Driver // DbConnection, Driver 정보 준비. new 를 통해 DBConnection을 만든다.
- Connection <—– MariaDBConnection // DBMS 와 연결. create 를 통해 DBStatement와 SidePreparedStatement 를 만든다.
- Statement <—– MaridDBStatement // DBMS 에 sql 전달. DBMS 가 알 수 있도록 가공. create 를 통해 SelectResultSet을 만든다.
- PreparedStatement <—– ServerSidePreparedStetement // DBMS 에 sql 전달. DBMS 가 알 수 있도록 가공. create 를 통해 SelectResultSet을 만든다.
- ResultSet <—– SelectResultSet // DBMS 에서 select 를 실행한 결과를 한개씩 가져온다.
DriverManager 와 Driver
- App 이 Driver 를 직접 생성해서 사용할 수 없다.
- 그러므로 DriverManager 를 통해서 Driver 를 이용한다.
JDBC 드라이버 로딩 방법
- java.sql.Driver 규칙에 따라 정의된 클래스를 로딩한다.
- Driver 구현체는 JDBC에 대한 정보를 제공한다.
- 또한 DBMS에 연결작업을 수행한다.
- Driver 구현체는 DriverManager가 관리한다.
-
따라서 접속할 DBMS의 Driver 구현체를 생성하여 DriverManager에게 등록해야 한다.
- DriverManager
- java.sql.Driver 구현 객체를 관리하는 일을 한다.
- DBMS 연결 요청이 들어오면 해당 DBMS의 Driver 구현체를 찾아 작업을 위임한다.
1: 직접 Driver 구현 객체를 생성하고 직접 등록하기
- java.sql.Driver 구현체를 생성하여 JDBC 드라이버 관리자에 등록한다.
- MariaDB의 JDBC 드라이버에는 org.mariadb.jdbc.Driver 클래스가 이 구현체이다.
- 1) Driver 구현체의 인스턴스를 생성한다.
- 2) Driver 인스턴스를 드라이버 관리자에 등록한다.
2: Driver 구현 객체 생성과 자동 등록
- Driver 객체를 생성하면 자동으로 DriverManager에 등록된다.
- 어떻게?
- Driver 구현체가 로딩될 때 static 블록에서 인스턴스를 만들어 등록하기 때문이다.
- 1) Driver 구현체의 인스턴스를 생성할 필요가 없다.
- 2) Driver 매니저에 등록하지 않아도 자동으로 등록이 된다.
3: Driver 구현 클래스 로딩과 자동 등록
- java.sql.Driver 인터페이스를 구현한 클래스를 로딩하면
- 해당 클래스에서 자신을 자동으로 DriverManager에게 등록할 것이다.
- org.mariadb.jdbc.Driver 클래스의 소스를 확인해 보라!
- static 블록에서 Driver 객체를 만들어 DriverManager에게 등록한다.
- 이 방식의 장점은 소스 코드에 클래스를 지정하는 대신
- 클래스 이름을 지정하기 때문에 실행할 때 다른 클래스로 쉽게 바꿀 수 있다.
- 따라서 특정한 Driver 구현체에 종속되지 않게 만들 수 있다.
4: Driver 구현체 자동 로딩
// => DriverManager를 사용할 때,
// DriverManager 는 다음 절차에 따라 Driver 구현체를 찾아서 자동으로 로딩한다.
//
// 1) jdbc.drivers 시스템 프로퍼티에 지정된 구현체를 찾아 로딩한다.
// => jdbc.drivers=foo.bah.Driver:wombat.sql.Driver:bad.taste.ourDriver
// => 이때 각 Driver 구현체는 'system class loader'를 통해 로딩된다.
// => 시스템 프로퍼티? JVM에 설정된 "key=value" 이다.
// => 시스템 프로퍼티를 꺼내는 방법? 다음과 같다.