7.5 KiB
JDBC (Java Database Connectivity) 쉽게 배우기
1. JDBC란?
JDBC는 자바에서 데이터베이스와 연결하여 SQL을 실행하고 결과를 처리하는 API이다. MySQL, PostgreSQL, Oracle 등 다양한 DBMS에서 공통적으로 사용할 수 있음.
✔ 주요 기능
- 데이터베이스 연결 (
Connection) - SQL 실행 (
Statement,PreparedStatement) - 결과 가져오기 (
ResultSet) - 트랜잭션 처리
2. 주요 클래스 및 메서드 정리
📌 JDBC 연결 관련 클래스
| 클래스 | 설명 |
|---|---|
DriverManager |
데이터베이스 연결을 관리하는 클래스 |
Connection |
데이터베이스와의 연결을 나타내는 객체 |
| 메서드 | 설명 |
|---|---|
DriverManager.getConnection(url, user, password) |
DB 연결 생성 |
Connection.close() |
DB 연결 종료 |
Connection.setAutoCommit(boolean autoCommit) |
자동 커밋 설정 |
Connection.commit() |
트랜잭션 커밋 |
Connection.rollback() |
트랜잭션 롤백 |
📌 SQL 실행 관련 클래스
| 클래스 | 설명 |
|---|---|
Statement |
SQL 쿼리를 실행하는 객체 (단순 SQL 실행) |
PreparedStatement |
SQL 쿼리를 실행하는 객체 (파라미터 지원) |
CallableStatement |
저장 프로시저(Stored Procedure) 호출 객체 |
| 메서드 | 설명 |
|---|---|
Statement.executeQuery(String sql) |
SELECT 실행 후 ResultSet 반환 |
Statement.executeUpdate(String sql) |
INSERT, UPDATE, DELETE 실행 |
PreparedStatement.setXXX(int index, value) |
SQL의 ?에 값 바인딩 |
PreparedStatement.executeQuery() |
SELECT 실행 후 ResultSet 반환 |
PreparedStatement.executeUpdate() |
INSERT, UPDATE, DELETE 실행 |
Statement.close() |
Statement 종료 |
📌 결과 조회 관련 클래스
| 클래스 | 설명 |
|---|---|
ResultSet |
SQL 실행 결과를 저장하는 객체 |
| 메서드 | 설명 |
|---|---|
ResultSet.next() |
다음 행으로 이동 |
ResultSet.getString("column") |
문자열 값 가져오기 |
ResultSet.getInt("column") |
정수 값 가져오기 |
ResultSet.close() |
결과 집합 종료 |
3. JDBC 기본 사용 예제
✔ 데이터베이스 연결 및 SELECT 예제
아래 코드는 JDBC를 이용하여 MySQL에 연결하고, 데이터를 조회하는 예제이다.
import java.sql.*;
public class JdbcExample {
public static void main(String[] args) {
// 1. DB 연결 정보 설정
String url = "jdbc:mysql://localhost:3306/mydb";
String user = "root";
String password = "1234";
// 2. JDBC를 이용한 DB 연결 및 데이터 조회
try {
// 3. 데이터베이스 연결
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println("DB 연결 성공!");
// 4. SQL 실행
String sql = "SELECT id, name, age FROM users";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
// 5. 결과 출력
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println("ID: " + id + ", 이름: " + name + ", 나이: " + age);
}
// 6. 리소스 해제
rs.close();
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
🔹 실행 결과
DB 연결 성공!
ID: 1, 이름: 홍길동, 나이: 30
ID: 2, 이름: 이몽룡, 나이: 25
✅ DriverManager.getConnection(url, user, password)을 이용해 DB 연결
✅ Statement.executeQuery(sql)을 이용해 SELECT 실행
✅ ResultSet.getInt(), getString()을 이용해 결과 가져오기
4. PreparedStatement 사용 (SQL Injection 방지)
PreparedStatement는 SQL에 ?를 사용하여 값을 안전하게 전달할 수 있음.
SQL Injection을 방지하고 반복 실행 시 성능 최적화 가능.
import java.sql.*;
public class PreparedStatementExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydb";
String user = "root";
String password = "1234";
try {
Connection conn = DriverManager.getConnection(url, user, password);
// SQL에 ?를 사용하여 값 바인딩
String sql = "INSERT INTO users (name, age) VALUES (?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "김철수"); // 첫 번째 ?에 값 설정
pstmt.setInt(2, 28); // 두 번째 ?에 값 설정
int rows = pstmt.executeUpdate();
System.out.println(rows + "개의 행이 삽입됨!");
pstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
🔹 실행 결과
1개의 행이 삽입됨!
✅ PreparedStatement.setString(1, "김철수")로 안전한 데이터 전달
✅ executeUpdate()를 사용하여 INSERT 실행
5. 트랜잭션 처리 예제
기본적으로 JDBC는 자동 커밋 모드이므로, 수동으로 커밋하려면 setAutoCommit(false)를 설정해야 함.
import java.sql.*;
public class TransactionExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydb";
String user = "root";
String password = "1234";
try {
Connection conn = DriverManager.getConnection(url, user, password);
conn.setAutoCommit(false); // 자동 커밋 해제
// 1. 첫 번째 INSERT 실행
PreparedStatement pstmt1 = conn.prepareStatement("INSERT INTO users (name, age) VALUES (?, ?)");
pstmt1.setString(1, "박영희");
pstmt1.setInt(2, 27);
pstmt1.executeUpdate();
// 2. 일부러 오류 발생시키기 (age 컬럼에 문자 입력)
PreparedStatement pstmt2 = conn.prepareStatement("INSERT INTO users (name, age) VALUES (?, ?)");
pstmt2.setString(1, "오류발생");
pstmt2.setString(2, "문자"); // 오류 발생
pstmt2.executeUpdate();
conn.commit(); // 커밋 (이 코드까지 실행되면 모든 변경이 적용됨)
} catch (SQLException e) {
e.printStackTrace();
try {
System.out.println("롤백 실행");
conn.rollback(); // 오류 발생 시 롤백
} catch (SQLException rollbackEx) {
rollbackEx.printStackTrace();
}
}
}
}
🔹 실행 결과
롤백 실행
✅ setAutoCommit(false)를 설정하여 수동 커밋 모드로 변경
✅ commit()이 실행되기 전에 오류가 발생하면 rollback()으로 변경 사항 취소
6. 정리
✔ JDBC는 자바에서 DB와 상호작용하는 API
✔ DriverManager.getConnection()을 사용하여 DB 연결
✔ Statement와 PreparedStatement를 사용하여 SQL 실행
✔ ResultSet을 사용하여 데이터 조회
✔ 트랜잭션 관리 (commit(), rollback())를 활용하여 데이터 정합성 유지
✅ SQL 실행이 많다면 PreparedStatement를 사용하자!
✅ 트랜잭션 처리를 위해 setAutoCommit(false)를 활용하자!