데이터베이스에서 `드라이버(driver)`는 애플리케이션과 데이터베이스 간의 통신을 가능하게 하는 소프트웨어 컴포넌트입니다. Java에서는 JDBC(Java Database Connectivity) 드라이버가 애플리케이션에서 데이터베이스로 SQL 쿼리를 전달하고, 결과를 다시 받아오는 역할을 수행합니다. 드라이버는 데이터베이스 벤더가 제공하며, 각 DBMS마다 고유한 드라이버가 필요합니다.
1. JDBC 드라이버의 역할
JDBC 드라이버는 애플리케이션과 데이터베이스 간의 인터페이스 역할을 하며, 주요 역할은 다음과 같습니다:
- 연결(Connection) 제공: 데이터베이스에 연결할 수 있는 Connection 객체를 생성하여 애플리케이션이 DB에 접근할 수 있도록 합니다.
- SQL 문 실행: 애플리케이션에서 SQL 문을 실행하여 데이터 조회, 삽입, 수정 등을 가능하게 합니다.
- 결과(ResultSet) 제공: SQL 실행 결과를 받아 애플리케이션이 사용할 수 있는 형태로 제공합니다.
- 데이터 타입 변환: Java 데이터 타입과 데이터베이스 데이터 타입 간의 변환을 수행하여 호환성을 보장합니다.
2. JDBC 드라이버의 종류
JDBC 드라이버는 연결 방식에 따라 4가지로 나뉩니다:
- Type 1: JDBC-ODBC 브리지 드라이버
- Java의 JDBC 호출을 ODBC(Open Database Connectivity) 호출로 변환하여 데이터베이스에 연결합니다.
- ODBC가 설치된 시스템에서만 동작하며, 성능이 좋지 않아 거의 사용되지 않습니다.
- Type 2: 네이티브 API 드라이버
- Java의 JDBC 호출을 DBMS의 네이티브 API 호출로 변환하여 데이터베이스와 연결합니다.
- 데이터베이스 벤더가 제공하는 네이티브 API가 필요하며, 플랫폼 종속적이라 특정 OS에서만 동작할 수 있습니다.
- Type 3: 네트워크 프로토콜 드라이버
- JDBC 호출을 미들웨어 서버로 전달하고, 미들웨어 서버가 DBMS와 통신하여 데이터를 전달합니다.
- 분산 환경에서 적합하지만, 추가 서버가 필요하기 때문에 관리가 복잡할 수 있습니다.
- Type 4: 순수 Java 드라이버
- Java로 구현된 드라이버로, 네이티브 코드 없이도 데이터베이스에 직접 연결합니다.
- 가장 많이 사용되는 방식이며, 플랫폼 독립적이고 성능이 우수합니다.
3. JDBC DriverManager와 연결 과정
`DriverManager`는 애플리케이션에서 데이터베이스 드라이버를 관리하고, `Connection` 객체를 생성하는 클래스입니다. JDBC를 통해 데이터베이스에 연결하는 과정은 다음과 같습니다
1. JDBC 드라이버 로드
Class.forName("com.mysql.cj.jdbc.Driver"); // 예: MySQL 드라이버 로드
이 명령을 통해 DriverManager에 드라이버가 등록됩니다.
2. Connection 객체 생성
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb", "username", "password");
`DriverManager`는 URL과 일치하는 드라이버를 찾아, 데이터베이스와의 연결을 생성합니다.
3. Statement 객체 생성 및 SQL 실행
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
`Statement` 객체는 SQL 문을 데이터베이스에 전달하고, `executeQuery`를 통해 결과를 받아옵니다.
4. ResultSet 객체 생성
- `executeQuery` 메서드는 결과를 `ResultSet` 객체로 반환합니다.
- `ResultSet` 을 통해 데이터베이스의 조회 결과를 순회하며 필요한 데이터를 읽습니다.
while (rs.next()) {
System.out.println("ID: " + rs.getInt("id"));
System.out.println("Name: " + rs.getString("name"));
}
5. 자원 반환
rs.close();
stmt.close();
conn.close();
4. Connection, Statement, ResultSet 생성 과정의 흐름
1) Connection 생성
`DriverManager.getConnection()` 메서드를 호출하면 DriverManager는 등록된 드라이버 목록에서 URL을 인식하여 적합한 드라이버를 찾아 데이터베이스와 연결합니다. 이때 `Connection` 객체가 반환됩니다.
2) Statement 생성
`Connection.createStatement()` 메서드를 호출하면 `Statement`객체가 생성됩니다. 이 객체는 SQL 문을 데이터베이스에 전달할 수 있게 해주는 인터페이스입니다.
3) SQL 실행 및 ResultSet 생성
`Statement` 객체의 `executeQuery` 메서드를 호출하여 SQL을 실행하면 데이터베이스는 해당 쿼리를 처리하고 결과를 반환합니다. 결과는 `ResultSet` 객체로 반환되며, 이 객체를 통해 데이터베이스의 결과값을 순회하고 필요한 데이터를 추출할 수 있습니다.
전체 흐름
- 드라이버 로드: 애플리케이션이 사용할 데이터베이스 드라이버를 Class.forName을 통해 등록합니다.
- 연결 생성: DriverManager.getConnection을 통해 Connection 객체를 생성하고, 데이터베이스와 연결합니다.
- Statement 생성: SQL을 실행하기 위해 Connection.createStatement를 통해 Statement 객체를 생성합니다.
- SQL 실행 및 결과 수신: Statement.executeQuery로 SQL을 실행하고 ResultSet 객체로 결과를 수신합니다.
- 데이터 처리: ResultSet을 순회하며 필요한 데이터를 추출합니다.
- 자원 해제: 데이터베이스 자원을 반납하여, 연결을 종료하고 메모리를 확보합니다.
이 과정을 통해 JDBC는 데이터베이스와 애플리케이션 간의 안정적이고 효율적인 데이터 처리 및 전송을 수행합니다.
'Spring' 카테고리의 다른 글
Spring - Spring Security (0) | 2024.11.13 |
---|---|
Spring - JDBC Template (1) | 2024.11.10 |
Spring - H2 Database (0) | 2024.11.08 |
Spring - @Transactional (1) | 2024.11.05 |
Spring - REST API 와 RESTful (0) | 2024.10.18 |