JDBC (Java Database Connectivity)의 개념과 주요 요소 살펴보기

CJI0524·2025년 3월 21일
0

Java

목록 보기
6/7

1. Java의 JDBC (Java Database Connectivity)란?

JDBC (Java Database Connectivity)자바 애플리케이션이 데이터베이스에 연결해서 SQL 쿼리를 실행하고, 결과를 받아올 수 있게 해주는 자바 표준 API이다. JDBC의 특징은 다음과 같다.

1.1. Java JDBC의 특징

  • 직접 제어 : 직접 Connection, Statement, PreparedStatement, ResultSet 등을 사용해서 DB 연결, 쿼리 실행, 결과 처리, 그리고 리소스 관리를 해야한다.
  • 보일러플레이트 코드 : DB 연결 열고 닫기, 예외 처리, 커서 관리 등 반복되는 코드가 많다.

때문에 Java의 JDBC는 여러가지 불편한 점이 많다.

2. Java JDBC의 요소

2.1. PreparedStatement 인터페이스

PreparedStatement는 JDBC에서 SQL을 실행할 때 사용하는 객체 중 하나로 주로 미리 컴파일된 SQL을 여러 번 실행하거나, 파라미터 바인딩을 안전하게 처리할 때 쓰인다.

PreparedStatement의 특징은 다음과 같다.

1. 미리 컴파일

  • SQL 문장을 데이터베이스에 미리 보내서 컴파일.
  • 이후 같은 SQL을 반복 실행할 때 매번 파싱·컴파일 과정을 거치지 않아 성능이 좋음.

2. 파라미터 바인딩

  • SQL 안에 ? 자리표시자(parameter placeholder)를 두고,
  • 실행 시점에 ps.setString(1, value) 같은 메서드로 값을 안전하게 넣어줌.
  • 이 방식은 SQL 인젝션 공격을 방어하는 데에도 효과적.

3. 타입 안전성

  • setInt(), setLong(), setDate() 등 메서드별로 타입을 지정해서 넣음

사용 예시

✍️ 예시 코드 작성

// 1) Connection 얻기
Connection conn = dataSource.getConnection();

// 2) SQL 준비 (파라미터 자리표시자 ? 사용)
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";

// 3) PreparedStatement 생성 (미리 컴파일)
PreparedStatement ps = conn.prepareStatement(sql);

// 4) 파라미터 바인딩
ps.setString(1, "Alice");               // 첫 번째 ? 에 "Alice"
ps.setString(2, "alice@example.com");   // 두 번째 ? 에 이메일

// 5) 실행
int count = ps.executeUpdate();         // INSERT 실행, 영향 받은 행 수 반환

// 6) 자원 해제
ps.close();
conn.close();

PreparedStatement는 미리 컴파일된 SQL과 안전한 파라미터 바인딩을 제공하는 JDBC 핵심 클래스이다.


2.2. ResultSet 인터페이스

ResultSet은 JDBC에서 SQL 쿼리를 실행한 결과를 담는 인터페이스로, JDBC 드라이버가 이 인터페이스의 구현체를 제공해서 실제 DB의 결과를 다룰 수 있게 한다. ResultSet을 활용하면, 각 행 (row)마다 데이터를 읽어올 수 있다.

ResultSet의 특징은 다음과 같다.

  • 표 형태의 데이터 : SQL 쿼리 결과는 여러 행과 열로 구성된 표와 같다. ResultSet은 이 표 전체를 메모리에 담지 않고, 커서를 이용해서 한 행씩 접근할 수 있도록 한다.

  • 커서(Cursor) 사용 : ResultSet에는 현재 위치를 나타내는 커서가 있다. 처음에는 커서가 첫 번째 행 전에 위치하므로, next() 메서드를 호출해 다음 행으로 이동해야 데이터를 읽을 수 있다.

  • 데이터 읽기 메서드 : 각 행의 데이터를 읽기 위해 getString(), getInt(), getLong() 등의 메서드를 사용한다. 이 메서드들은 열 이름이나 인덱스를 인자로 받아 해당 열의 데이터를 반환한다.

사용 예시

✍️ 예시 코드 작성

public class ResultSetExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String user = "username";
        String password = "password";

        try (Connection conn = DriverManager.getConnection(url, user, password);
             Statement stmt = conn.createStatement();
             // ResultSet: SQL 쿼리 실행 결과를 담는 객체, 각 행의 데이터를 순차적으로 읽어올 수 있음
             ResultSet rs = stmt.executeQuery("SELECT id, name, email FROM users")) {

            // while문: rs.next() 호출로 커서를 다음 행으로 이동, 다음 행이 있으면 true 반환
            while (rs.next()) {
                // rs.getInt("id"): 현재 행에서 "id" 컬럼의 정수 값을 가져옴
                int id = rs.getInt("id");
                // rs.getString("name"): 현재 행에서 "name" 컬럼의 문자열 값을 가져옴
                String name = rs.getString("name");
                // rs.getString("email"): 현재 행에서 "email" 컬럼의 문자열 값을 가져옴
                String email = rs.getString("email");

                // 각 행의 데이터를 출력
                System.out.println(id + " - " + name + " - " + email);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3. 이 글을 작성하는데 참고한 글 목록

멋쟁이사자처럼 강의자료

profile
개발돌이

0개의 댓글