[상태 유지와 공통 처리] 2. JDBC란?

2026. 3. 30. 11:26·Web/Web Basics

자바가 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로 보내 실행하는 객체이다.

여기서 중요한 이유는 두 가지이다.

  1. 파라미터 바인딩을 안전하게 한다
  • ? 자리에 값을 setXXX()로 넣는다
  • SQL 문자열 결합을 줄여서 실수를 줄인다
  1. 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
'Web/Web Basics' 카테고리의 다른 글
  • [상태 유지와 공통 처리] 4. MyBatis는 무엇을 해결하는가
  • [상태 유지와 공통 처리] 3. Connection Pool / DataSource / HikariCP
  • [데이터 처리와 DB연동] 1. DTO / VO(Entity) / DAO / Service는 왜 나누는가?
  • [상태 유지와 공통 처리] 5. 리스너(Listener)란?
sqaxe1
sqaxe1
woojoo-devlog 님의 블로그 입니다.
  • sqaxe1
    Woojoo's Devlog
    sqaxe1
  • 전체
    오늘
    어제
    • 분류 전체보기 (148)
      • Backend (9)
        • Servlet (7)
        • Spring (2)
      • Frontend (1)
      • CS (0)
      • Book (33)
        • 자바 웹 프로그래밍 Next Step (30)
        • 테스트 주도 개발: 고품질 쾌속개발을 위한 TDD.. (1)
        • 성공과 실패를 결정하는 1%의 네트워크 원리 (2)
      • Engineering (0)
        • Testing (0)
      • Infra (6)
        • AWS (6)
      • Java (4)
      • Network (1)
      • 김영한 (28)
        • 자바 입문 (8)
        • 실전 자바 - 기본편 (6)
        • 실전 자바 - 중급편 (10)
        • 실전 자바 - 고급편 (4)
      • Web (39)
        • Web Basics (39)
      • Project (24)
        • NeoSquare (0)
        • Memo Evolution (24)
      • 정보처리기사 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    개발서적
    java
    aws
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
sqaxe1
[상태 유지와 공통 처리] 2. JDBC란?
상단으로

티스토리툴바