0Pricing
Java Academy · 강의

JDBC 기초

연결, 문, 결과 집합을 알아봅니다

JDBC 기초은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

JDBC란 무엇인가?

JDBC(Java 데이터베이스 연결)는 Java에서 관계형 데이터베이스와 통신하기 위한 표준 API입니다.

  • java.sql 패키지에 포함되어 있습니다.
  • 각 데이터베이스는 JDBC 인터페이스를 구현하는 드라이버를 제공합니다.
  • Connection, Statement, ResultSet과 같은 인터페이스를 대상으로 코드를 작성하며, 공급업체의 클래스를 직접 사용하지 않습니다.

이 추상화 덕분에 동일한 코드로 PostgreSQL, MySQL, H2 또는 오라클을 사용할 수 있습니다.

핵심 인터페이스

대부분의 작업은 다음 세 인터페이스가 담당합니다:

  • Connection — 데이터베이스와 연결된 열린 세션입니다.
  • Statement / PreparedStatement — SQL을 전송합니다.
  • ResultSet — 쿼리가 반환한 행을 순회하는 커서입니다.

DriverManager 또는 DataSource에서 Connection을 가져옵니다.

연결 열기

DriverManager.getConnection(url, user, password)는 활성 상태의 Connection을 반환합니다.

JDBC URL은 데이터베이스를 식별합니다. 예를 들어 jdbc:postgresql://localhost:5432/shop과 같습니다. 최신 드라이버는 자동으로 자신을 등록하므로 더 이상 Class.forName(...)을 호출하지 않습니다.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Main {
    public static void main(String[] args) {
        String url = "jdbc:postgresql://localhost:5432/shop";
        try (Connection conn = DriverManager.getConnection(url, "app", "secret")) {
            System.out.println("Connected: " + !conn.isClosed());
        } catch (SQLException e) {
            System.out.println("Connection failed: " + e.getMessage());
        }
    }
}

리소스 자동 관리

Connection, Statement, ResultSet은 모두 AutoCloseable을 구현합니다.

항상 리소스를 자동 관리 블록 안에서 열어 자동으로 닫히게 하십시오. 예외가 발생한 경우에도 닫힙니다. 연결을 누수시키면 데이터베이스의 연결이 빠르게 고갈됩니다.

  • 리소스는 역순으로 닫힙니다.
  • finally 블록이 필요하지 않습니다.

쿼리 실행

간단한 SELECT를 실행하려면 Statement를 만들고 executeQuery를 호출합니다. 그러면 ResultSet이 반환됩니다.

이 예제는 실제 데이터베이스 없이 흐름을 확인할 수 있도록 메모리 내 시뮬레이션을 사용합니다. 운영 환경에서는 SQL이 연결된 데이터베이스에서 실행됩니다.

import java.util.List;

public class Main {
    public static void main(String[] args) {
        // Simulated result of: SELECT name FROM users
        List<String> names = List.of("Ada", "Linus", "Grace");
        System.out.println("Query returned " + names.size() + " rows:");
        for (String name : names) {
            System.out.println(" - " + name);
        }
    }
}

ResultSet 읽기

ResultSet은 첫 번째 행의 앞에서 시작합니다. 반복문에서 rs.next()를 호출하십시오. 더 이상 행이 없으면 false를 반환합니다.

타입이 지정된 가져오기 메서드를 사용하여 열 이름이나 1부터 시작하는 인덱스로 열을 읽습니다:

  • rs.getInt("id")
  • rs.getString("name")
  • rs.getDouble("price")
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Main {
    public static void main(String[] args) {
        String url = "jdbc:postgresql://localhost:5432/shop";
        try (Connection conn = DriverManager.getConnection(url, "app", "secret");
             Statement st = conn.createStatement();
             ResultSet rs = st.executeQuery("SELECT id, name FROM users")) {
            while (rs.next()) {
                System.out.println(rs.getInt("id") + ": " + rs.getString("name"));
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }
}

쓰기 작업에 사용하는 executeUpdate

INSERT, UPDATE, DELETE에는 executeUpdate를 사용합니다. 이 메서드는 영향을 받은 행의 수를 나타내는 int를 반환합니다.

문이 결과 집합을 반환할지 미리 알 수 없는 경우에만 execute를 사용하십시오.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class Main {
    public static void main(String[] args) {
        String url = "jdbc:postgresql://localhost:5432/shop";
        try (Connection conn = DriverManager.getConnection(url, "app", "secret");
             Statement st = conn.createStatement()) {
            int rows = st.executeUpdate("DELETE FROM sessions WHERE expired = true");
            System.out.println("Deleted " + rows + " rows");
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }
}

행을 객체로 매핑하기

대부분의 애플리케이션은 각 행을 도메인 객체로 변환합니다. ResultSet을 반복하면서 인스턴스를 만드십시오.

다음은 독립적으로 실행되도록 시뮬레이션한 패턴입니다. record를 사용하면 매핑을 간결하게 작성할 수 있습니다.

import java.util.ArrayList;
import java.util.List;

public class Main {
    record User(int id, String name) {}

    public static void main(String[] args) {
        // Stand-in for iterating a ResultSet
        String[][] rows = {{"1", "Ada"}, {"2", "Linus"}};
        List<User> users = new ArrayList<>();
        for (String[] row : rows) {
            users.add(new User(Integer.parseInt(row[0]), row[1]));
        }
        users.forEach(System.out::println);
    }
}

SQLException 처리

거의 모든 JDBC 메서드는 확인된 예외인 SQLException을 발생시킵니다.

이 예외에는 유용한 진단 정보가 포함되어 있습니다:

  • getMessage() — 사람이 읽을 수 있는 텍스트입니다.
  • getSQLState() — 표준 5자리 상태 코드입니다.
  • getErrorCode() — 공급업체별 코드입니다.

이 정보를 무시하지 말고 기록하십시오.

import java.sql.SQLException;

public class Main {
    public static void main(String[] args) {
        SQLException e = new SQLException("duplicate key", "23505", 7);
        System.out.println("Message: " + e.getMessage());
        System.out.println("SQLState: " + e.getSQLState());
        System.out.println("ErrorCode: " + e.getErrorCode());
    }
}

DatabaseMetaData

conn.getMetaData()는 데이터베이스 자체를 설명하는 DatabaseMetaData 객체를 반환합니다.

제품 이름과 버전, 지원되는 기능을 확인하고 테이블과 열의 목록까지 가져올 수 있습니다. 스키마 탐색기와 같은 도구가 공급업체별 세부 정보를 하드코딩하지 않고 동작하는 방식입니다.

하나로 연결하기

일반적인 읽기 흐름은 다음과 같습니다:

  • 리소스 자동 관리 블록에서 Connection을 엽니다.
  • Statement를 만듭니다(또는 더 나은 방법으로 PreparedStatement를 사용합니다).
  • executeQuery를 호출하고 rs.next()로 반복합니다.
  • 열을 객체에 매핑합니다.
  • 리소스 자동 관리가 모든 항목을 닫게 합니다.

다음 학습에서는 인젝션에 안전한 쿼리를 만들어 봅니다.

빠른 확인

Statement.executeUpdate는 무엇을 반환할까요?

복습

이제 JDBC의 핵심 흐름을 이해하셨습니다:

  • DriverManager.getConnection이 Connection을 엽니다.
  • Statement가 SQL을 전송합니다. executeQuery는 ResultSet을 반환하고, executeUpdate는 영향을 받은 행의 수를 반환합니다.
  • rs.next()와 타입이 지정된 가져오기 메서드를 사용하여 순회합니다.
  • 항상 리소스 자동 관리를 사용하고, 상태 코드와 오류 코드가 포함된 SQLException을 처리하십시오.

자주 묻는 질문

“JDBC 기초” 강의는 무료인가요?

네 — “JDBC 기초” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“JDBC 기초”에서 뭘 배우나요?

연결, 문, 결과 집합을 알아봅니다 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Java Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“JDBC 기초” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. JDBC 기초
  2. PreparedStatement
  3. 트랜잭션
  4. HikariCP를 사용한 연결 풀링
← Java Academy(으)로 돌아가기