Java
[Java] JDBC란? Database 연결 과정, JDBC Driver, JDBC API 흐름
cloud-grace
2024. 5. 16. 23:19
JDBC
JDBC는 Java Database Connectivity로 Java에서 데이터베이스와 연결하여 데이터 저장 및 수정, 저장된 데이터를 사용할 수 있게 해주는 Java API이다.
JDBC 표준 인터페이스로 정의한 3가지 기능
- java.sql.Connection : DB 연결
- java.sql.Statement : SQL이 담겨 있는 내용
- java.sql.ResultSet : SQL의 요청에 응답한 내용
Spring Data JPA, Spring Data JDBC 등의 기술이 나타나며 JDBC API를 직접 사용할 일은 줄었지만, 이 기술들이 DB와의 연동을 위해 내부적으로 JDBC를 이용하므로 JDBC 동작 과정을 익혀둘 필요가 있다.
JDBC 동작 과정
Java Application ▶ JDBC API ▶ JDBC Driver ▶ 데이터베이스
JDBC Driver
- 데이터베이스와 통신하는 인터페이스
- MariaDB, MySQL, MS SQL, Oracle 등의 데이터베이스에 각각 알맞은 JDBC 드라이버를 구현하여 제공한다.
- JDBC Driver의 구현체를 통해 특정 벤더 DB에 접근이 가능하다.
JDBC API 동작 과정
JDBC Driver 로딩 ▶ Connection 객체 생성 ▶ Statement 객체 생성 ▶ Query 실행 ▶ ResultSet 객체로부터 데이터 조회 ▶ ResultSet 객체 Close ▶ Statement 객체 Close ▶ Connection 객체 Close
- JDBC Driver 로딩 : 내가 사용할 DB의 JDBC Driver를 로딩하고, Driver는 DriverManager Class를 통해 로딩된다.
- Connection 객체 생성 : JDBC Driver 정상 로딩 후, DriverManager를 통해 데이터베이스와 연결되는 Session인 Connection 객체를 생성한다.
- Statement 객체 생성 : Statement 객체는 SQL 쿼리문을 작성하여 이를 실행하기 위한 객체이며, 정적 SQL 쿼리 문자열을 입력으로 한다.
- Query 실행 : 생성된 Statement 객체를 이용해서 입력된 SQL 쿼리가 실행된다.
- ResultSet 객체로부터 데이터 조회 : SQL 쿼리문 실행 결과 데이터 Set이다.
- ResultSet, Statement, Connection 객체 Close : JDBC API로 사용한 객체는 역순으로 Close한다.
PreparedStatement
PreparedStatement는 SQL 쿼리를 실행하기 전에 미리 컴파일하여 효율적으로 사용할 수 있다.
- 보안 강화 : SQL 쿼리에 사용되는 매개변수를 자동으로 이스케이핑하여 SQL Injection 공격을 방지한다.
- 성능 향상 : DB에 쿼리를 보낼 때 매번 컴파일하지 않고 미리 컴파일되어 있으므로 성능이 향상된다.
- 가독성과 유지보수성 향상 : SQL 쿼리와 매개변수가 분리되어 가독성 및 유지보수성이 향상된다.
import java.sql.*;
public class InsertExample {
public static void main(String[] args) {
System.out.println(insert("기획1팀"));
System.out.println(insert("기획2팀"));
}
public static boolean insert(String deptName) {
boolean result = false;
Connection connection = null;
PreparedStatement pstmt = null;
try {
// 1. JDBC Driver 로딩
Class.forName("org.mariadb.jdbc.Driver");
// 2. 연결하기
String url = "jdbc:mariadb://localhost:3306/database?charset=utf8";
connection = DriverManager.getConnection(url, "아이디", "비밀번호");
// 3. Statement 준비
String sql = "insert into dept values(null, ?)";
pstmt = connection.prepareStatement(sql);
// 4.binding
pstmt.setString(1, deptName);
// 5. SQL 실행
int count = pstmt.executeUpdate();
// 6. 결과 처리
result = count == 1;
} catch (ClassNotFoundException e) {
System.out.println("드라이버 로딩 실패: " + e);
} catch (SQLException e) {
System.out.println("error: " + e);
} finally {
try {
if (pstmt!= null) {
pstmt.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return result;
}
}