자바 애플리케이션이 데이터베이스와 통신하기 위한 표준 인터페이스인 JDBC(Java Database Connectivity)의 활용법을 정리한다.
안전한 자원 관리와 SQL 인젝션 방지를 위한 구현 패턴을 분석한다.
데이터베이스 연결 설정
JDBC를 사용하기 위해서는 DB 드라이버 로드와 연결 정보 설정이 선행되어야 한다.
import java.sql.*;
public class DatabaseManager {
private static final String URL = "jdbc:mysql://localhost:3306/mydb";
private static final String USER = "admin";
private static final String PASSWORD = "password123";
public Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USER, PASSWORD);
}
}
데이터 조회 (SELECT)
PreparedStatement와 ResultSet을 사용하여 데이터를 안전하게 조회한다.
try-with-resources 구문을 사용하여 자원 해제를 자동화한다.
public void selectUsers() {
String sql = "SELECT id, name, email FROM users WHERE status = ?";
try (Connection conn = getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, "ACTIVE"); // 파라미터 바인딩
try (ResultSet rs = pstmt.executeQuery()) {
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
System.out.println(id + " | " + name + " | " + email);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
데이터 삽입 및 수정 (INSERT/UPDATE)
executeUpdate() 메서드를 사용하여 데이터를 변경한다.
public void insertUser(String name, String email) {
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
try (Connection conn = getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, name);
pstmt.setString(2, email);
int affectedRows = pstmt.executeUpdate();
System.out.println("Inserted rows: " + affectedRows);
} catch (SQLException e) {
e.printStackTrace();
}
}
트랜잭션 제어
여러 작업을 하나의 단위로 묶기 위해 setAutoCommit(false)를 활용한다.
public void transferMoney(int fromId, int toId, int amount) {
Connection conn = null;
try {
conn = getConnection();
conn.setAutoCommit(false); // 트랜잭션 시작
// 1. 출금
// 2. 입금
conn.commit(); // 성공 시 확정
} catch (SQLException e) {
if (conn != null) {
try { conn.rollback(); } catch (SQLException ex) { ex.printStackTrace(); }
}
} finally {
if (conn != null) {
try { conn.close(); } catch (SQLException e) { e.printStackTrace(); }
}
}
}
P.S
JDBC 프로그래밍의 핵심은 PreparedStatement를 통한 보안 확보와 try-with-resources를 통한 자원 누수 방지다.
대규모 시스템에서는 커넥션 풀(Connection Pool) 라이브러리를 사용하여 성능을 최적화하는 것 같다.