개요
Spring, Spring Boot 환경에서 개발을 하고계신 개발자 분들은 모두 JDBC라는 것을 들어보셨을 것이며,
JPA와 같은 ORM 기술도 사용하시면서 개발을 하고계실 것이라고 생각합니다 😃
제가 생각하기에 데이터베이스와 함께 협력하는 우리 개발자들은
JDBC라는 개념을 무조건 알고가야 하지 않을까 하고 생각을 해봅니다.
JDBC 등장 이유
애플리케이션을 개발할 때 데이터들은 대부분 데이터베이스에 보관합니다.
클라이언트가 애플리케이션 서버를 통해 데이터를 저장하거나 조회하면, 애플리케이션 서버는 다음과 같은 과정을 통해 데이터베이스를 사용합니다.
1. 커넥션 연결 - 주로 TCP/IP를 사용해 커넥션을 연결한다.
2. SQL 전달 - 애플리케이션 서버는 DB가 이해할 수 있는 SQL을 연결된 커넥션을 통해 DB에 전달합니다.
3. 결과 응답 - DB는 전달된 SQL을 수행하고 그 결과를 응답합니다.
그럼 여기서 이제 문제 상황이 나타나게 됩니다. 각각의 데이터베이스(MySQL, Oracle, PostgreSQL ... )마다 커넥션을 연결하는 방법, SQL 전달방법, 그리고 결과를 응답받는 방법이 모두 다르다는 점입니다.
이 문제를 해결하기 위해서 JDBC라는 자바 표준이 등장하게 되는 것 입니다.
JDBC 표준 인터페이스
JDBC(Java Database Connectivity)는 자바에서 데이터베이스에 접속할 수 있도록 하는 Java API
JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다. - 위키백과
대표적으로 다음 3가지 기능을 표준으로 한 인터페이스로 제공합니다.
- java.sql.Connection: 연결
- java.sql.Statement: SQL 내용
- java.sql.ResultSet: SQL 요청 응답
자바는 이렇게 표준 인터페이스를 정의해두었고 개발자는 이 표준 인터페이스만 사용해서 개발을 하면 됩니다. 👍
자, 그럼 여기서 JDBC 표준 인터페이스를 사용하면 된다는 것은 알았습니다.
그렇지만 표준 인터페이스만 있다고 해서 기능이 동작하지는 않죠? 이제 DB사에서 이 표준 인터페이스를 구현해 라이브러리로 제공해줘야 저희가 그 데이터베이스를 사용해서 행복한 개발을 할 수 있을 것입니다. 이것을 JDBC 드라이버라고 합니다.
MySQL에 접근할 수 있는 것은 MySQL JDBC 드라이버라고 하고, Oracle DB에 접근할 수 있는 것은 Oracle JDBC 드라이버라고 합니다.
자 ~ 그러면 JDBC의 등장을 통해 저희는 2가지의 문제를 해결할 수 있었습니다.
- 데이터베이스를 다른 종류의 데이터베이스로 변경하면 애플리케이션 서버의 데이터베이스 사용 코드도 함께 변경해야하는 문제
- 개발자가 각각의 데이터베이스마다 커넥션 연결, SQL 전달, 결과 응답을 받는 방법을 새로 학습해야하는 문제
JDBC의 등장으로 많은 것들이 편리해졌지만, 각각의 데이터베이스마다 SQL, 데이터타입 등의 일부 사용법이 다릅니다. ANSI SQL 표준이라는 것이 있긴 하지만.. 하지만 일반적인 부분만 공통화했어서 한계가 있죠 ㅠㅠ 대표적으로 실무에서 기본으로 사용하는 페이징 SQL은 각각의 데이터베이스마다 사용법이 달라요..ㅠ 그래서 바로 와장창 무너져내릴 수 있습니다. 데이터베이스를 변경하면 JDBC 코드는 변경하지 않아도 되지만 SQL은 해당 데이터베이스에 맞도록 변경해야하죠
그래서 JPA와 같은 기술을 사용하면 각각의 데이터베이스마다 다른 SQL을 정의해야 하는 문제도 많은 부분을 해결할 수 있습니다. 😃
DriverManager
자 이제, 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 {
// URL = "jdbc:h2:tcp://localhost/~/test";
Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
log.info("get connection={}, class={}", connection, connection.getClass());
return connection;
} catch (SQLException e) {
throw new IllegalStateException(e);
}
}
}
DriverManager라는 클래스를 사용해 데이터베이스 커넥션을 얻을 수 있습니다.
이렇게 연결하는 코드의 과정을 좀 더 자세히 알아보면
Connection 인터페이스는 표준 커넥션 인터페이스를 정의하는데 H2 데이터베이스 드라이버는 JDBC Connection 인터페이스를 구현한 org.h2.jdbc.JdbcConnection을 제공합니다.
다음과 같은 플로우로 커넥션이 진행이 되는데
JDBC가 제공하는 DriverManager는 라이브러리에 등록된 DB 드라이버들을 관리하고, 커넥션을 획득하는 기능을 제공합니다. getConnection()인자로 들어온 URL을 분석하고 등록된 드라이버들에게 순서대로 다음 정보를 넘겨서 커넥션을 획득할 수 있는지 하나하나 확인합니다.
URL 예시) jdbc:h2:tcp://localhost/~/test
jdbc:h2로 시작하면 이것은 h2 데이터베이스에 접근하기 위한 규칙입니다.
총총
이렇게 JDBC와 DriverManager를 알아보았습니다. 개발에만 집중할 수 있도록 고민하신 선조 개발자분들의 고민과 노력이 보입니다.
감사하며 더 나은 개발 인생을 위해서 노력합시다.
'Spring Framework.' 카테고리의 다른 글
[ Spring ] Connection Pool, HikariCP (1) | 2023.10.13 |
---|---|
Spring boot 내장 웹 서버 톰캣 설정, 다른 내장 웹 서버 설정하는 방법 (0) | 2023.10.13 |
백엔드 기술 면접(Spring, Java) 질문 모음 #1 (0) | 2023.08.27 |
📗 Spring WebFlux, Reactive Stream, R2DBC, Mono, Flux 정복하기 (0) | 2023.05.08 |
📗 Spring boot Actuator 스프링 부트 액추에이터 API + Spring Cloud를 사용한 예제 (1) | 2023.05.03 |