JAVA

[JAVA] JDBC 정리

tudamoa 2025. 5. 27. 15:46

📌 JDBC(Java Database Connectivity)란?

JDBC는 Java에서 데이터베이스에 연결하고, SQL을 실행하고 조작할 수 있도록 해주는 표준 API다.
MySQL, Oracle, PostgreSQL 등 다양한 DB와 연동 가능한 통신 인터페이스를 제공한다.

✅ 주요 기능

  • 데이터베이스 연결
  • SQL문 실행
  • 실행 결과 처리

 

🧩 JDBC의 주요 구성 요소

구성 요소 설명
DriverManager JDBC 드라이버를 관리하고, DB와 연결(Connection)을 생성
Connection DB와의 연결을 나타냄
Statement / PreparedStatement SQL문을 실행하기 위한 객체
ResultSet SELECT 결과를 담는 객체 (읽기 전용)

 

 

 

🔁 JDBC 처리 순서

  1. JDBC 드라이버 로드
    각 DB 벤더가 driver 인터페이스를 구현한 DriverManager 클래스를 제공한다.
    이 DriverManager를 통해 사용하고자 하는 JDBC 드라이버를 로딩한다.

  2. DB 연결(Connection 객체 얻기)
    제공된 JDBC 드라이버가 데이터베이스와 연결되는 세션인 Connection 객체를 생성한다.

    (Connection 객체는 생성 비용이 높기 때문에 미리 생성하는 Connection Pool 이라는 구조가 있다.)

  3. SQL문 실행(Statement/PreparedStatement 객체 사용)
    작성된 SQL문을 실행하기 위한 객체인 Statement 객체를 생성한다. 

    (Statement: 문자열 그대로 SQL 실행 / PreparedStatement: ? 에 값 바인딩하여 실행 (보안 ↑, 성능 ↑) )

  4. 결과 처리 (ResultSet 사용)
    Statement 객체로 쿼리를 실행하고 처리 결과를 ResultSet 객체를 통해 저장한다.


  5. 자원 해제 (close)
    결과까지 처리가 완료되었다면 생성된 객체들을 생성 순서의 역순으로 소멸(Close)시킨다.

    (ResultSet - Statement - Connection 객체 순으로 Close)

 

예시 코드

import java.sql.*;

public class JdbcExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydb"; // DB URL
        String username = "root";
        String password = "1234";

        try {
            // 1. 드라이버 로드
            Class.forName("com.mysql.cj.jdbc.Driver");
            // JVM에 드라이버 클래스가 로드됨.
            // 이 드라이버 클래스는 static 블록에서 자신을 등록함.

            // 2. 연결 생성
            Connection conn = DriverManager.getConnection(url, username, password);
            // 자신에게 등록된 여러 드라이브들의 connect() 메서드를 호출하며
            //  적절한 드라이버를 찾음.

            // 3. SQL 실행
            String sql = "SELECT * FROM users";
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);

            // 4. 결과 처리
            while (rs.next()) {
                System.out.println(rs.getString("name"));
            }

            // 5. 자원 해제
            rs.close();
            stmt.close();
            conn.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

 


 

⚔️ Statement / PreparedStatement 차이

항목 Statement PreparedStatement
SQL 작성 방식 SQL을 문자열 그대로 실행 파라미터를 ?로 지정하고, 실행 시 값 바인딩
보안 SQL Injection에 취약 SQL Injection에 강함
성능 매번 SQL 재해석 미리 컴파일되어 재사용 가능 (성능 ↑)
코드 가독성 파라미터 값이 문자열에 직접 삽입되어 복잡 setInt(), setString() 등으로 명확하게 지정
예시 SQL "SELECT * FROM users WHERE name = '" + name + "'" "SELECT * FROM users WHERE name = ?" + ps.setString(1, name);

 

실무에서는 거의 무조건 PreparedStatement를 사용한다.

 

 

 

💡 커넥션 풀(Connection Pool)이란?

Connection 객체를 미리 생성하고 재사용하는 기술이다.

  • Connection은 생성 비용이 높아 매번 새로 만들면 비효율적이다.
  • 커넥션 풀은 미리 일정 개수의 연결을 만들어 보관한다.
  • 요청 시 하나를 꺼내 쓰고, 다 쓰면 close() 대신 반납한다.

대표 라이브러리

라이브러리 특징
HikariCP Spring Boot 기본, 가장 빠르고 가볍다.
DBCP Apache 기반, 예전에는 널리 쓰였다.
C3P0 비교적 느리고, 설정이 많다.

 

 

 

⚠️ JDBC의 단점 정리

단점 설명
코드 복잡성 SQL 작성, 파라미터 바인딩, 결과 처리, 예외 처리, 자원 해제 등 모든 과정을 직접 구현해야 한다.
유지보수 어려움 SQL이 하드코딩되어 있어 수정 시 코드 전체에 영향을 줄 수 있고, 재사용과 분리가 어렵다
자원 누수 위험 Connection, Statement, ResultSet을 명시적으로 close() 하지 않으면 메모리 누수 및 커넥션 고갈 위험이발생한다.
SQL Injection 보안 문제 Statement 사용 시 파라미터 직접 삽입으로 인해 보안에 매우 취약하다.
객체 지향과 거리 SQL 위주로 동작하여 객체 모델과 DB 설계가 분리되어있다. 
ORM(Object-Relational Mapping)과 비교했을 때 비효율적이다.
 
 

 

 


 

✅ 마무리 요약

  • JDBC는 Java와 DB를 연결하는 기본 API
  • 핵심 흐름:
    DriverManager → Connection → Statement → ResultSet → Close()
  • 실무에서는 MyBatis, JPA 같은 프레임워크로 추상화해서 사용
  • 하지만 기본 구조와 흐름은 반드시 알고 있어야 함!

 

 

'JAVA' 카테고리의 다른 글

[JAVA] 예외(Exception) 정리  (1) 2025.06.01
[JAVA] ORM 이란?  (0) 2025.05.31
[JAVA] 스레드(Thread) 정리  (0) 2025.03.01
[JAVA] 컬렉션(Collection) 정리 / Map  (0) 2025.02.27
[JAVA] 컬렉션(Collection) 정리 / List, Set, Queue  (0) 2025.02.24