Java

[Java] JDBC란? Database 연결 과정, JDBC Driver, JDBC API 흐름

cloud-grace 2024. 5. 16. 23:19

JDBC

JDBC는 Java Database Connectivity로 Java에서 데이터베이스와 연결하여 데이터 저장 및 수정, 저장된 데이터를 사용할 수 있게 해주는 Java API이다.

JDBC 표준 인터페이스로 정의한 3가지 기능

  • java.sql.Connection : DB 연결
  • java.sql.Statement : SQL이 담겨 있는 내용
  • java.sql.ResultSet : SQL의 요청에 응답한 내용

Spring Data JPA, Spring Data JDBC 등의 기술이 나타나며 JDBC API를 직접 사용할 일은 줄었지만, 이 기술들이 DB와의 연동을 위해 내부적으로 JDBC를 이용하므로 JDBC 동작 과정을 익혀둘 필요가 있다.

JDBC 동작 과정

Java Application ▶ JDBC API ▶ JDBC Driver ▶ 데이터베이스

JDBC Driver

  • 데이터베이스와 통신하는 인터페이스
  • MariaDB, MySQL, MS SQL, Oracle 등의 데이터베이스에 각각 알맞은 JDBC 드라이버를 구현하여 제공한다.
  • JDBC Driver의 구현체를 통해 특정 벤더 DB에 접근이 가능하다.

JDBC API 동작 과정

JDBC Driver 로딩 ▶ Connection 객체 생성 ▶ Statement 객체 생성 ▶ Query 실행 ▶ ResultSet 객체로부터 데이터 조회 ▶ ResultSet 객체 Close ▶ Statement 객체 Close ▶ Connection 객체 Close
  • JDBC Driver 로딩 : 내가 사용할 DB의 JDBC Driver를 로딩하고, Driver는 DriverManager Class를 통해 로딩된다.
  • Connection 객체 생성 : JDBC Driver 정상 로딩 후, DriverManager를 통해 데이터베이스와 연결되는 Session인 Connection 객체를 생성한다.
  • Statement 객체 생성 : Statement 객체는 SQL 쿼리문을 작성하여 이를 실행하기 위한 객체이며, 정적 SQL 쿼리 문자열을 입력으로 한다.
  • Query 실행 : 생성된 Statement 객체를 이용해서 입력된 SQL 쿼리가 실행된다.
  • ResultSet 객체로부터 데이터 조회 : SQL 쿼리문 실행 결과 데이터 Set이다.
  • ResultSet, Statement, Connection 객체 Close : JDBC API로 사용한 객체는 역순으로 Close한다.

PreparedStatement

PreparedStatement는 SQL 쿼리를 실행하기 전에 미리 컴파일하여 효율적으로 사용할 수 있다.

  • 보안 강화 : SQL 쿼리에 사용되는 매개변수를 자동으로 이스케이핑하여 SQL Injection 공격을 방지한다.
  • 성능 향상 : DB에 쿼리를 보낼 때 매번 컴파일하지 않고 미리 컴파일되어 있으므로 성능이 향상된다.
  • 가독성과 유지보수성 향상 : SQL 쿼리와 매개변수가 분리되어 가독성 및 유지보수성이 향상된다.
import java.sql.*;

public class InsertExample {
    public static void main(String[] args) {
        System.out.println(insert("기획1팀"));
        System.out.println(insert("기획2팀"));
    }

    public static boolean insert(String deptName) {
        boolean result = false;
        Connection connection = null;
        PreparedStatement pstmt = null;
        try {
            // 1. JDBC Driver 로딩
            Class.forName("org.mariadb.jdbc.Driver");

            // 2. 연결하기
            String url = "jdbc:mariadb://localhost:3306/database?charset=utf8";
            connection = DriverManager.getConnection(url, "아이디", "비밀번호");

            // 3. Statement 준비
            String sql = "insert into dept values(null, ?)";
            pstmt = connection.prepareStatement(sql);

            // 4.binding
            pstmt.setString(1, deptName);

            // 5. SQL 실행
            int count = pstmt.executeUpdate();

            // 6. 결과 처리
            result = count == 1;
        } catch (ClassNotFoundException e) {
            System.out.println("드라이버 로딩 실패: " + e);
        } catch (SQLException e) {
            System.out.println("error: " + e);
        } finally {
            try {
                if (pstmt!= null) {
                    pstmt.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        return result;
    }
}