2020-10-29 TIL

1 minute read

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" 이다.
// => 시스템 프로퍼티를 꺼내는 방법? 다음과 같다.

Categories:

Updated: