본문 바로가기

Java

[Java] JDBC(Java DataBase Connectivity) 알아보기

🔍 JDBC 란?

  • Java DataBase Connectivity 약자로, 자바 프로그램에서 데이터베이스에 접속하고 SQL 문을 실행하기 위한 API(응용 프로그래밍 인터페이스)이다.
  • JDBC를 사용하면 다양한 데이터베이스 관리 시스템(DBMS)에 접속하여 데이터베이스와 상호작용할 수 있습니다. JDBC는 데이터베이스에 대한 연결, SQL 문 실행, 결과 처리 등 다양한 기능을 제공하여 자바 애플리케이션과 데이터베이스 간의 효율적인 통신을 도와준다.

🔍 JDBC의 구조

  • JDBC를 이용해서 DB에 연결하기까지의 흐름은 다음과 같다. 사용자가 자바 애플리케이션에서 JDBC API를 이용해 DB에 접근하고자 한다. 하지만 JDBC API 자체는 인터페이스이므로 실제로 메서드들을 사용하기 위해서는 구현체가 필요하다. 그 구현체를 가져오는 역할은 DriverManager라는 클래스가 맡는다. 이 클래스가 Driver를 가져오면 이제 자바와 데이터베이스를 연결할 준비는 끝난다.

🔍 JDBC 동작 흐름

🔍 JDBC API 동작

💻 예시 코드

/*
JDBC 를 활용해서 데이터 가져오기
*/
import java.sql.*;

public class JdbcExample {
    public static void main(String[] args) {
        // JDBC 연결 정보
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "username";
        String password = "password";

        // JDBC 드라이버 로딩
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        try {
            // 데이터베이스에 연결
            conn = DriverManager.getConnection(url, username, password);

            // SQL 쿼리 실행
            String sql = "SELECT * FROM employees";
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);

            // 결과 처리
            while (rs.next()) {
                int empId = rs.getInt("employee_id");
                String empName = rs.getString("employee_name");
                int empAge = rs.getInt("employee_age");
                System.out.println("사원 ID: " + empId + ", 이름: " + empName + ", 나이: " + empAge);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 자원 해제
            try {
                if (rs != null)
                    rs.close();
                if (stmt != null)
                    stmt.close();
                if (conn != null)
                    conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

📝 코드 설명

  1. JDBC 드라이버 로딩: Class.forName() 메서드를 사용하여 MySQL JDBC 드라이버를 로드한다.
  2. 데이터베이스 연결: DriverManager.getConnection() 메서드를 사용하여 데이터베이스에 연결합니다. URL, 사용자 이름 및 비밀번호를 전달하여 Connection 객체를 생성한다.
  3. SQL 쿼리 실행: Statement 객체를 생성하고, executeQuery() 메서드를 사용하여 SQL 쿼리를 실행한다. 이 예제에서는 "employees" 테이블의 모든 데이터를 조회하는 SELECT 문을 실행한다.
  4. 결과 처리: ResultSet 객체를 사용하여 쿼리 결과를 처리한다. next() 메서드를 호출하여 다음 행으로 이동하고, getInt(), getString() 등의 메서드를 사용하여 각 열의 값을 가져온다.
  5. 자원 해제: 모든 작업이 완료되면 ResultSet, Statement 및 Connection 객체를 닫아서 자원을 해제한다. 이는 메모리 누수를 방지하기 위한 중요한 단계이다. 위의 예제 코드를 실행하면 데이터베이스로부터 가져온 "employees" 테이블의 사원 정보가 출력된다.

단점

  1. 성능 문제: JDBC는 매번 데이터베이스에 연결해야 하므로 많은 연결 및 해제 작업이 필요하다. 이로 인해 오버헤드가 발생할 수 있고, 반복적인 연결 및 해제 작업은 성능 저하를 가져올 수 있다.
  2. 복잡성: SQL 쿼리를 작성하고 실행하고, 결과를 처리하는 등의 작업을 직접 구현해야 한다. 이로 인해 개발 시간이 오래 걸리고, 코드의 복잡성은 높아지고, 가독성이 떨어진다.
  3. 보안 문제: JDBC를 사용할 때 개발자가 직접 SQL 쿼리를 작성하고 실행하기 때문에 보안 취약점이 발생할 수 있다. 잘못된 입력 처리 또는 쿼리 문자열의 동적 생성 등으로 인해 SQL 인젝션과 같은 보안 문제가 발생할 수 있다.
  4. 유지보수의 어려움: JDBC는 데이터베이스와 밀접하게 연결된 코드를 작성해야 한다. 따라서 데이터베이스 스키마 변경이나 쿼리의 수정과 같은 유지보수 작업이 필요한 경우 코드의 많은 부분을 수정해야 할 수 있다.