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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.