자바가 DB와 통신하는 표준 방식
DB 연동을 한다는 말은 결국 이 뜻이다.
- 자바 프로그램이 네트워크로 DB 서버에 연결한다
- SQL을 전송한다
- DB가 실행한 결과를 다시 받아서 처리한다
이 흐름을 자바 표준 API로 정리한 게 JDBC이다.
즉 JDBC는 “DB 연결과 SQL 실행을 위한 자바 표준 규격”이다.
JDBC로 DB 작업을 할 때 항상 나오는 3가지 객체
JDBC는 결국 아래 세 가지 객체를 중심으로 돌아간다.
- Connection
- PreparedStatement
- ResultSet
이 세 개만 이해하면 JDBC의 큰 흐름은 끝난다.
// ================================
// [JDBC 기본 흐름] (조회: SELECT)
// 1) Connection 얻기
// 2) PreparedStatement 준비
// 3) 파라미터 바인딩(setXXX)
// 4) executeQuery() -> ResultSet
// 5) ResultSet.next()로 행 이동하며 꺼내기(getXXX)
// 6) 자원 close (try-with-resources 추천)
// ================================
public List<TodoVO> findAll(Connection conn) throws SQLException {
String sql = "select tno, title, finished from tbl_todo order by tno desc";
try (PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
List<TodoVO> list = new ArrayList<>();
while (rs.next()) {
long tno = rs.getLong("tno");
String title = rs.getString("title");
boolean finished = rs.getBoolean("finished");
list.add(new TodoVO(tno, title, finished));
}
return list;
}
}
// ================================
// [JDBC 기본 흐름] (변경: INSERT/UPDATE/DELETE)
// - executeUpdate()는 "영향 받은 행 수"를 int로 반환한다
// ================================
public int insert(Connection conn, String title) throws SQLException {
String sql = "insert into tbl_todo(title, finished) values(?, ?)";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setString(1, title);
ps.setBoolean(2, false);
return ps.executeUpdate(); // 보통 1이 나온다(1행 insert)
}
}
1) Connection: DB와의 연결 자체
Connection은 DB와 네트워크 연결을 의미한다.
- 연결이 있어야 SQL을 보낼 수 있다
- 연결이 없으면 아무 것도 못 한다
그리고 JDBC에서 가장 중요한 규칙은 이것이다.
Connection은 반드시 close 해야 한다
DB 서버는 동시에 처리할 수 있는 연결 수가 제한적이다.
close를 안 하면 연결이 쌓여서 결국 신규 연결이 막히는 상황이 생긴다.
2) PreparedStatement: SQL 실행을 담당
PreparedStatement는 SQL을 DB로 보내 실행하는 객체이다.
여기서 중요한 이유는 두 가지이다.
- 파라미터 바인딩을 안전하게 한다
- ? 자리에 값을 setXXX()로 넣는다
- SQL 문자열 결합을 줄여서 실수를 줄인다
- SQL Injection 같은 공격을 줄이는 데 유리하다
- 사용자 입력을 SQL로 직접 붙이지 않기 때문에 상대적으로 안전하다
그래서 JDBC에서는 Statement보다 PreparedStatement를 기본으로 쓴다.
3) ResultSet: SELECT 결과를 읽는 커서(cursor)
SELECT는 “결과 데이터”를 반환한다.
이 결과를 읽는 도구가 ResultSet이다.
ResultSet은 중요한 특징이 하나 있다.
ResultSet은 처음에는 “첫 행”에 서 있지 않다
그래서 반드시 next()로 다음 행으로 이동해야 한다.
while (rs.next()) {
// 현재 행의 컬럼 값을 꺼낸다
}
그리고 값을 꺼낼 때는 컬럼 타입에 맞는 메서드를 쓴다.
- getLong(), getInt(), getString(), getBoolean() …
JDBC는 SELECT와 DML이 처리 방식이 다르다
JDBC를 처음 할 때 자주 헷갈리는 부분이 여기다.
SELECT (조회)
- 결과 데이터가 나온다
- 그래서 executeQuery()를 쓰고 ResultSet을 받는다
DML (INSERT/UPDATE/DELETE)
- 결과 데이터가 아니라 “영향 받은 행 수”가 중요하다
- 그래서 executeUpdate()를 쓰고 int를 받는다
즉,
- 조회 = ResultSet
- 변경 = 영향 행 수(int)
이 차이를 잡아야 JDBC 코드가 자연스럽게 보인다.
자원 정리는 try-with-resources가 기본이다
JDBC는 자원이 많다.
- Connection
- PreparedStatement
- ResultSet
이걸 제대로 닫지 않으면 누수(leak)가 생긴다.
그래서 가장 깔끔한 방식은 try-with-resources이다.
위 예제 코드처럼 작성하면
블록이 끝날 때 자동으로 close가 호출된다.
핵심 정리
- JDBC는 자바가 DB와 통신하기 위한 표준 API이다
- Connection은 연결이고 반드시 close 해야 한다
- PreparedStatement로 SQL을 실행하고 setXXX로 파라미터를 바인딩한다
- SELECT는 executeQuery + ResultSet, DML은 executeUpdate + int이다
- try-with-resources로 자원 정리를 자동화하는 게 기본이다
'Web > Web Basics' 카테고리의 다른 글
| [상태 유지와 공통 처리] 4. MyBatis는 무엇을 해결하는가 (0) | 2026.03.30 |
|---|---|
| [상태 유지와 공통 처리] 3. Connection Pool / DataSource / HikariCP (0) | 2026.03.30 |
| [데이터 처리와 DB연동] 1. DTO / VO(Entity) / DAO / Service는 왜 나누는가? (0) | 2026.03.30 |
| [상태 유지와 공통 처리] 5. 리스너(Listener)란? (0) | 2026.03.30 |
| [상태 유지와 공통 처리] 4. 필터(Filter)란? (0) | 2026.03.30 |