📌 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 처리 순서
- JDBC 드라이버 로드
각 DB 벤더가 driver 인터페이스를 구현한 DriverManager 클래스를 제공한다.
이 DriverManager를 통해 사용하고자 하는 JDBC 드라이버를 로딩한다. - DB 연결(Connection 객체 얻기)
제공된 JDBC 드라이버가 데이터베이스와 연결되는 세션인 Connection 객체를 생성한다.
(Connection 객체는 생성 비용이 높기 때문에 미리 생성하는 Connection Pool 이라는 구조가 있다.) - SQL문 실행(Statement/PreparedStatement 객체 사용)
작성된 SQL문을 실행하기 위한 객체인 Statement 객체를 생성한다.
(Statement: 문자열 그대로 SQL 실행 / PreparedStatement: ? 에 값 바인딩하여 실행 (보안 ↑, 성능 ↑) ) - 결과 처리 (ResultSet 사용)
Statement 객체로 쿼리를 실행하고 처리 결과를 ResultSet 객체를 통해 저장한다. - 자원 해제 (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 |