자바 애플리케이션과 **관계형 데이터베이스(MySQL, PostgreSQL, Oracle, SQLite)**를 연결하여 데이터를 영구 보관하고 관리하는 JDBC(Java Database Connectivity) 기술을 다룹니다.
1. JDBC 연동 용어 사전 (Glossary)
- JDBC (Java Database Connectivity): 자바 언어로 데이터베이스에 접속하여 SQL 쿼리를 실행할 수 있도록 지원하는 표준 API 인터페이스 집합입니다.
- DriverManager: 데이터베이스 드라이버를 로드하고 DB 연결 자원인
Connection객체를 생성해 주는 매니저 클래스입니다. - PreparedStatement: SQL 쿼리를 미리 컴파일하여 파라미터만 교체 실행하는 객체로, SQL Injection 보안 공격을 차단합니다.
- ResultSet:
SELECT쿼리 실행 결과로 반환된 데이터 테이블 행(Row)들을 가리키는 커서 객체입니다.
2. JDBC DB 연결 및 회원 등록/조회 실습
import java.sql.*;
public class JDBCExample {
// DB 접속 정보
private static final String URL = "jdbc:sqlite:davhave.db"; // SQLite 예시
public static void main(String[] args) {
String insertSQL = "INSERT INTO users (name, email) VALUES (?, ?)";
String selectSQL = "SELECT * FROM users";
try (Connection conn = DriverManager.getConnection(URL)) {
System.out.println("데이터베이스 연결 성공!");
// 1. PreparedStatement 데이터 삽입 (CRUD - Create)
try (PreparedStatement pstmt = conn.prepareStatement(insertSQL)) {
pstmt.setString(1, "홍길동");
pstmt.setString(2, "hong@davhave.com");
int rows = pstmt.executeUpdate();
System.out.println(rows + "개 회원 데이터 추가 완료.");
}
// 2. ResultSet 데이터 조회 (CRUD - Read)
try (PreparedStatement pstmt = conn.prepareStatement(selectSQL);
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: " + id + " | 이름: " + name + " | 이메일: " + email);
}
}
} catch (SQLException e) {
System.err.println("DB 작업 오류: " + e.getMessage());
}
}
}
3. 자주 묻는 질문 (Q&A)
Q. Statement 대신 왜 PreparedStatement를 사용해야 하나요?
A. Statement는 SQL 문에 변수를 합칠 때 문자열 연결(+)을 사용하므로 SQL Injection 보안 해킹 위험에 노출되고 매번 쿼리를 재컴파일합니다. 반면 PreparedStatement는 미리 컴파일된 바인딩 변수(?)를 써서 안전하고 실행 속도도 훨씬 빠릅니다.