안녕하세요. 이번 포스팅에서는 JDBC와 DriverManager에 대해 알아보겠습니다.

JDBC는 Java DataBase Connectivity의 약자로 자바와 데이터베이스를 연결해주는 인터페이스입니다.
JDBC를 사용하기 이전에는 각 DB 벤더사별로 데이터베이스를 연결하는 소스코드를 다르게 작성해야만 했습니다.
이러한 불편함을 해소하기 위해 JDBC가 개발되었고 JDBC를 사용하면 각 DB 벤더사별로 데이터베이스를 연결하는 소스코드를 작성할 필요가 없어지며, 자바에서 만들어놓은 Connection 인터페이스만 구현하면 간단하게 여러 DB를 바꿔가면서 사용할 수 있습니다.

현재는 JDBC를 로우 레벨로 사용하지 않고 Mapper 또는 ORM을 사용하여 더욱 편리하게 자바와 데이터베이스를 연결할 수 있지만, Mapper와 ORM도 내부적으로 JDBC를 사용하고 있습니다.
Connection 인터페이스
자바에서는 데이터베이스와 연결할 수 있는 Connection 인터페이스를 제공합니다.

스프링부트에서 H2 Dependency를 주입하면 External Libraries 디렉토리에 com.h2database:h2:... 라는 디렉토리를 확인할 수 있습니다.
해당 디렉토리 내 /jdbc/JdbcConntection.java 파일을 보면 자바에서 만들어놓은 Connection 인터페이스를 구현한 구현체인 것을 확인할 수 있습니다.

직접 코드를 작성하여 자바와 H2 데이터베이스를 연결해보겠습니다.
우선 H2 데이터베이스 접속에 필요한 정보들을 따로 추상 클래스로 만들어 놓습니다.
public abstract class ConnectionConst {
public static final String URL = "jdbc:h2:tcp://localhost/~/test";
public static final String USERNAME = "sa";
public static final String PASSWORD = "";
}
DriverManager 클래스를 통해 Connection을 반환하는 getConnection 메서드를 만들었습니다.
public class DBConnectionUtil {
public static Connection getConnection() {
try {
Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
log.info("get connection={}, class={}", connection, connection.getClass());
return connection;
} catch (SQLException e) {
throw new IllegalStateException();
}
}
}
H2 데이터베이스에 접속이 잘되는지 확인해 보겠습니다.
public class DBConnectionUtilTest {
@Test
public void h2connectionTest() {
Connection connection = DBConnectionUtil.getConnection();
Assertions.assertThat(connection).isNotNull();
}
}

자바와 H2 데이터베이스가 성공적으로 연결된 것을 확인할 수 있습니다.
DriverManager
DriverManager 클래스의 getConnection 메서드를 사용하여 데이터베이스를 연결했습니다.
DriverManager 클래스의 내부동작은 아래 사진처럼 동작합니다.

JDBC가 제공하는 DriverManager는 라이브러리에 등록된 드라이버 목록을 자동으로 인식합니다.
그리고 getConnection 메서드를 호출할 때 URL, USERNAME, PASSWORD 세 개의 정보를 넘겨 커넥션을 획득할 수 있는지 확인합니다.
위 예시에서는 라이브러리에 등록된 드라이버는 H2 데이터베이스 뿐이지만, 만약 MySQL, Oracle 드라이버도 존재한다면 MySQL, Oracle 드라이버에게도 위 정보들을 넘깁니다.
만약 MySQL 드라이버가 먼저 위 정보들을 받고 연결할 수 있는 정보가 아니라면, 그 다음 목록인 H2 데이터베이스 또는 Oracle 드라이버에게 정보가 전달됩니다.
이렇게 찾은 커넥션 구현체가 클라이언트에게 반환이 됩니다.
해당 내용은 김영한 강사님의 강의를 듣고 정리한 내용입니다.