JDBC란 무엇인가?
JDBC의 탄생 배경
과거에는 애플리케이션에서 DB로 어떻게 접근했고, 무엇이 문제였을까?
과거에는 애플리케이션 서버가 직접 DB로 접근을 했다.
그렇기 때문에 DB 마다 연결, SQL 전달, 응답 방법 등이 모두 달랐다.
문제점은 크게 두 가지가 있었다.
- 데이터베이스를 다른 종류의 데이터베이스로 변경하면 애플리케이션 서버에 개발된 데이터베이스 사용 코드도 변경된다.
- 개발자가 데이터베이스마다 연결, SQL 전달, 응답 방법 등을 모두 학습해야 한다.
JDBC 표준 인터페이스 등장
위와 같은 문제로 JDBC
(Java Database Connectivity)는 바아에서 데이터베이스에 접근할 수 있도록 하는 자바 API
이다.
아래와 같이 인터페이스를 제공하고, 각 데이터베이스 벤더에서 JDBC 인터페이스에 맞게 구현
해서 라이브러리로 제공한다.
이를 JDCB 드라이버
라고 한다.
출처: https://www.inflearn.com/course/스프링-db-1
SQL Mapper의 등장
많이 개선된 것이 JDBC이지만 JDBC를 직접 사용하기는 불편한게 사실이다. 그래서 등장한 것이 SQL Mapper와 ORM이다.
대표적으로 두 가지가 있다.
SQL Mapper
단순히 JDBC를 편리하게 사용하기 위한 것이다.
- JDBC의 반복 코드를 제거한다.
- SQL 응답 결과를 객체로 편리하게 반환 해준다.
하지만 단점이 있다.
- 모든 SQL을 결국은 직접 작성해야 한다. 이는 JPA가 대체하게 된다.
대표적인 기술로는 두 가지가 있다.
- 스프링 Jdbc Template
- MyBatis
JDBC가 드라이버를 이용해 데이터베이스와 커넥션 하는 방법
package hello.jdbc.connection;
import lombok.extern.slf4j.Slf4j;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import static hello.jdbc.connection.ConnectionConst.*;
@Slf4j
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 IllegalArgumentException(e);
}
}
}
-------------------------------
package hello.jdbc.connection;
public class ConnectionConst {
public static final String URL = "jdbc:h2:tcp://localhost/~/test";
public static final String USERNAME = "sa";
public static final String PASSWORD = "";
}
테스트 코드
package hello.jdbc.connection;
import lombok.extern.slf4j.Slf4j;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import java.sql.Connection;
@Slf4j
class DBConnectionUtilTest {
@Test
void connection() {
Connection connection = DBConnectionUtil.getConnection();
Assertions.assertThat(connection).isNotNull();
}
}
DriverManager.getConnection()
이 라이브러리에 등록된 드라이버 목록을 인식한다.URL: "jdbc:h2:tcp://localhost/~/test"
USERNAME, PASSWORD
이 외에도 추가적인 정보가 필요하면 사용된다.
각각의 드라이버
는 URL을 체크해서 본인이 처리할 수 있는 것인지 확인한다.jdbc:h2
로 시작하면h2 데이터베이스에 연결하는 등 규칙
이 있다.만약 본인이 처리할 수 없다면, 처리하지 않고, DriverManager는 다른 드라이버로 연결을 요청한다.
최종적으로 일치하는 드라이버를 DriverManager는 Connection을 반환한다.
별개로 만약 h2 드라이버라면 h2는 아래 클래스로 드라이버를 제공한다. JDBC 인터페이스(java.sql.Connection
)인 Connection
을 구현한다.