JDBC
더 많은 작업
JDBC(Java Database Connectivity)는 자바 프로그램이 데이터베이스 종류에 상관없이 같은 API 로 연결을 맺고 SQL 을 실행해 결과를 받도록 정한 자바 표준 API(java.sql, javax.sql 패키지)이다.
JDBC 는 응용 프로그램이 쓰는 인터페이스(Connection, Statement, PreparedStatement, ResultSet 등)와, 데이터베이스 회사가 그 인터페이스를 구현해 제공하는 JDBC 드라이버로 나뉜다. 응용 프로그램은 인터페이스만 보고 코드를 쓰고, 실제로 데이터베이스와 통신하는 일은 드라이버가 맡는다. 그래서 드라이버만 바꾸면 같은 코드로 다른 DBMS 에 붙을 수 있다. 마이크로소프트 계열에서 같은 역할을 하는 것이 ODBC 이다.
데이터 원본과 연결할 때는 보통 DriverManager 클래스나 DataSource 인터페이스를 쓴다. DriverManager 는 데이터베이스 URL 로 지정한 데이터 원본에 응용 프로그램을 연결해 주며, 처음 연결을 시도할 때 클래스 경로에 있는 JDBC 4.0 이상 드라이버를 자동으로 적재한다. 4.0 이전 드라이버는 응용 프로그램이 Class.forName(...) 으로 직접 적재해야 했다.[1]
Connection con = DriverManager.getConnection(url, user, pw); // ① ② ③
PreparedStatement ps = con.prepareStatement(
"SELECT name FROM emp WHERE deptno = ?"); // ④
ps.setInt(1, 10);
ResultSet rs = ps.executeQuery(); // ⑤
while (rs.next()) { System.out.println(rs.getString("name")); } // ⑥
rs.close(); ps.close(); con.close(); // ⑦
- 응용 프로그램이
DriverManager.getConnection()을 호출한다 - DriverManager 가 등록된 드라이버 가운데 그 URL 을 처리할 수 있는 드라이버를 골라 연결을 맡긴다. getConnection 이 불리면 DriverManager 는 초기화 때 적재된 드라이버와 명시적으로 적재된 드라이버 중에서 알맞은 것을 찾는다[2]
- 드라이버가 DBMS 와 네트워크 소켓 연결을 맺고 인증을 거쳐 Connection 객체를 돌려준다
- 연결에서 Statement 나 PreparedStatement 객체를 만든다
- executeQuery·executeUpdate 를 부르면 드라이버가 SQL 을 보내고 DBMS 가 SQL 을 실행한다
- 조회 결과는 ResultSet 으로 받아 한 행씩 읽는다
- 다 쓴 객체는 닫는다(try-with-resources 를 쓰면 자동으로 닫힌다)
연결이 먼저 있어야 Statement 를 만들 수 있고, Statement 가 있어야 SQL 을 실행할 수 있다. 그래서 getConnection 호출 → 드라이버 선택 → 소켓 연결 → Statement 생성 → SQL 실행 순서는 바뀌지 않는다.
| 이름 | 역할 |
|---|---|
| DriverManager | 등록된 드라이버를 관리하고 URL 에 맞는 드라이버로 연결을 만든다 |
| Driver | DBMS 회사가 구현한 드라이버. URL 을 받아 실제 연결을 맺는다 |
| Connection | 데이터베이스와의 세션. 트랜잭션(commit, rollback, setAutoCommit)을 다룬다 |
| Statement | 완성된 SQL 문자열을 실행한다 |
| PreparedStatement | ? 자리표시자를 둔 SQL 을 미리 컴파일하고 값만 바꿔 실행한다. SQL 삽입 공격을 막는다 |
| CallableStatement | 저장 프로시저를 호출한다 |
| ResultSet | 조회 결과 행 집합. next() 로 커서를 옮긴다 |
| DataSource | 연결 정보를 감추고 커넥션 풀을 쓰게 하는 연결 공급자. 서버 환경에서는 DriverManager 보다 권장된다[1] |
| 구분 | Statement | PreparedStatement |
|---|---|---|
| SQL 작성 | 값까지 문자열로 이어 붙임 | ? 자리에 값을 따로 바인딩 |
| 컴파일 | 실행할 때마다 | 한 번 준비해 여러 번 실행 |
| SQL 삽입 | 취약하다 | 값이 데이터로만 전달되어 막힌다 |
- ↑ 1.0 1.1 「Establishing a Connection」, The Java Tutorials, Oracle, https://docs.oracle.com/javase/tutorial/jdbc/basics/connecting.html, 확인일: 2026-11-04.
- ↑ 「Class DriverManager」, Java SE 21 API Specification, Oracle, https://docs.oracle.com/en/java/javase/21/docs/api/java.sql/java/sql/DriverManager.html, 확인일: 2026-11-04.