기본 콘텐츠로 건너뛰기

방송대 Java프로그래밍 14강: JDBC 연결과 SQL 실행 흐름

Java프로그래밍 14강 - JDBC 프로그래밍

방송대 Java프로그래밍 14강: JDBC 연결과 SQL 실행 흐름

데이터베이스 접속에 성공해도 SQL의 종류에 맞지 않는 메서드를 고르거나, ResultSet의 커서를 옮기지 않거나, PreparedStatement의 첫 매개변수를 0번으로 생각하면 원하는 결과를 얻을 수 없다. JDBC 코드는 연결·실행·결과 처리·해제라는 공통 흐름을 가지지만, 각 단계에서는 결과가 행 집합인지 영향받은 행의 개수인지, 데이터 값이 고정인지 반복해서 바뀌는지에 따라 선택이 달라진다. 이 글은 JDBC 객체를 이름이 아니라 판단 질문으로 선택하고, 한 행이 Java 값으로 바뀌는 과정까지 추적하도록 돕는다.

JDBC 문제는 네 가지 판단 질문으로 시작한다

JDBC(Java DataBase Connectivity)는 Java 프로그램이 관계형 DBMS와 연결해 데이터를 조회·삽입·갱신·삭제하도록 지원하는 API다. JDBC 코드는 대체로 같은 순서를 따르지만, SQL과 결과의 성격에 따라 사용할 객체와 메서드가 달라진다.

  1. 어디에 연결하는가? JDBC URL, 사용자 아이디와 비밀번호로 Connection을 얻는다.
  2. SQL이 고정 문자열인가, 값만 바뀌는 템플릿인가? 단순 SQL은 Statement, ?에 값을 넣어 반복할 SQL은 PreparedStatement를 검토한다.
  3. 결과가 표인가, 변경된 행의 개수인가? 조회는 executeQuery(), 삽입·수정·삭제는 executeUpdate()가 기본 선택이다.
  4. 결과의 구조를 미리 아는가? 알고 있으면 열 이름·자료형에 맞춰 읽고, 실행 중 구조를 조사해야 하면 메타데이터를 사용한다.
판단 결과주요 객체·메서드얻는 것
DBMS 서버 연결DriverManager.getConnection()Connection
문자열 SQL 실행Connection.createStatement()Statement
매개변수 SQL 준비Connection.prepareStatement(sql)PreparedStatement
SELECT 결과 처리executeQuery()ResultSet
INSERT·UPDATE·DELETE 결과 처리executeUpdate()영향받은 행의 개수

판단 핵심: SQL의 첫 단어만 외우는 데서 멈추지 말고 “실행 결과의 형태가 행들의 표인가, 정수 개수인가”를 확인한다. 이 질문이 실행 메서드와 반환형을 함께 결정한다.

관계형 데이터베이스의 구조가 Java에서 읽을 단위를 정한다

데이터베이스는 데이터를 모아 둔 집합 장소이고, DBMS는 데이터베이스를 효율적으로 관리하는 소프트웨어다. 관계형 DBMS에서는 데이터를 테이블 형태로 저장한다. 데이터베이스는 여러 테이블로, 테이블은 여러 레코드(행)로, 레코드는 여러 필드(열)로 구성된다. 각 레코드를 식별하는 키 필드도 존재한다.

데이터베이스 관점예시JDBC에서 만나는 형태
테이블citySELECT 대상과 ResultSet의 전체 구조
레코드도시 한 건ResultSet.next()가 가리키는 한 행
필드ID, Name, PopulationgetInt(), getString()으로 읽는 열
스키마열 이름·자료형·길이SQL 작성과 자료형 변환의 기준
도시를 구별하는 ID특정 행을 식별하는 조건에 활용

강의자료의 실습 환경은 2024년 자료 기준으로 MariaDB 서버와 명령형 클라이언트, world 샘플 데이터베이스를 사용한다. 설치 버전이나 메뉴 위치는 시점과 환경에 따라 달라질 수 있으므로, 학습의 중심은 특정 화면을 외우는 것이 아니라 서버가 실행 중인지, 사용할 데이터베이스가 존재하는지, JDBC 드라이버가 Java 프로젝트의 클래스패스에 포함되었는지를 확인하는 데 둔다.

환경 점검: DBMS 설치만으로 Java 연결이 완성되지는 않는다. 서버 실행, 데이터베이스 준비, 사용자 계정, JDBC 드라이버 JAR의 클래스패스 등록이 모두 갖춰져야 연결 코드를 실행할 수 있다.

드라이버·URL·계정은 Connection을 만드는 세 입력이다

JDBC API는 JDK의 java.sql 패키지에 포함되지만, 실제 DBMS와 통신하는 JDBC 드라이버는 해당 DBMS용 구현을 사용한다. 강의의 MariaDB 실습에서는 Connector/J 드라이버 JAR를 프로젝트의 클래스패스에 추가하고 드라이버 클래스를 로드한 뒤 연결을 시도한다.

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

Class.forName("org.mariadb.jdbc.Driver");

String url = "jdbc:mariadb://localhost:3306/world";
String user = "root";
String password = "실제 비밀번호";

try (Connection connection =
        DriverManager.getConnection(url, user, password)) {
    System.out.println("connected");
}

URL을 구성 요소로 읽으면 오류를 찾기 쉽다. jdbc:mariadb는 JDBC와 DBMS 종류, localhost는 서버 주소, 3306은 포트, world는 접속할 데이터베이스 이름이다. 사용자 아이디와 비밀번호는 URL과 별도 인수로 전달한다.

입력강의 예잘못되었을 때 먼저 볼 곳
드라이버org.mariadb.jdbc.DriverJAR 클래스패스와 클래스 이름
서버 주소·포트localhost:3306서버 실행 상태와 접속 위치
데이터베이스world샘플 데이터베이스 설치 여부
사용자 정보root와 설정한 비밀번호계정과 비밀번호의 일치 여부

DriverManager.getConnection(url, user, password)가 성공하면 Connection 객체가 반환된다. 이 객체는 연결 자체를 나타낼 뿐 아직 SQL을 실행한 것은 아니다. 다음 단계에서 StatementPreparedStatement를 만들어야 한다.

자원은 Connection에서 ResultSet 방향으로 열고 자동으로 닫는다

MariaDB 연동 프로그램의 전체 순서는 JDBC 패키지 사용, 드라이버 준비, 서버 연결, SQL 실행, 결과 처리, 연결 해제로 정리할 수 있다. 객체의 의존 관계는 Connection → Statement → ResultSet이다. 연결에서 실행 객체를 만들고, 실행 객체가 조회 결과를 만든다.

String sql = "SELECT ID, Name FROM city LIMIT 0, 5";

try (Connection connection =
             DriverManager.getConnection(url, user, password);
     Statement statement = connection.createStatement();
     ResultSet result = statement.executeQuery(sql)) {

    while (result.next()) {
        int id = result.getInt("ID");
        String name = result.getString("Name");
        System.out.println(id + " : " + name);
    }
}

try 괄호 안에 세 자원을 선언하면 블록을 벗어날 때 자동으로 정리된다. 강의에서 설명하는 finally 블록의 수동 close() 호출을 간결하게 대신한다. 중요한 점은 결과 처리까지 try 블록 안에서 끝내는 것이다. ResultSet은 그것을 만든 실행 객체와 연결에 의존하기 때문이다.

오개념 교정: 연결을 얻은 직후 닫고 ResultSet만 바깥에서 읽을 수 있다고 생각하면 객체의 의존 관계를 놓친다. 결과를 순회하는 동안에는 그 결과를 만든 실행 자원도 유효한 범위 안에 있어야 한다.

SQL의 결과형에 따라 실행 메서드를 선택한다

Statement는 SQL 구문을 실행하고 결과를 반환하는 객체이며 Connection.createStatement()로 만든다. 세 실행 메서드는 SQL 문자열을 인수로 받지만 반환형과 사용 목적이 다르다.

판단 상황메서드반환값후속 처리
SELECT임을 알고 있음executeQuery(sql)ResultSetnext()로 행 순회
INSERT·UPDATE·DELETE임을 알고 있음executeUpdate(sql)int영향받은 행 개수 확인
실행 전 결과 종류를 하나로 한정하지 않음execute(sql)booleantruegetResultSet(), falsegetUpdateCount()
try (Statement statement = connection.createStatement()) {
    int inserted = statement.executeUpdate(
            "INSERT INTO log_table(message) VALUES ('start')");
    int changed = statement.executeUpdate(
            "UPDATE log_table SET message='done' WHERE id=1");
    int deleted = statement.executeUpdate(
            "DELETE FROM log_table WHERE id=1");

    System.out.println(inserted + ", " + changed + ", " + deleted);
}

여기서 정수는 SQL이 성공했다는 단순 코드가 아니라 각 구문으로 영향받은 행의 개수다. 강의자료의 삽입 예에 보이는 inset은 문맥상 INSERT를 뜻하므로 올바른 SQL 철자로 사용해야 한다.

boolean hasResult = statement.execute(sql);

if (hasResult) {
    ResultSet result = statement.getResultSet();
    // 조회 결과 처리
} else {
    int affectedRows = statement.getUpdateCount();
    // 변경된 행 개수 처리
}

execute()의 불리언은 “SQL 성공 여부”가 아니다. 첫 결과가 ResultSet이면 true, 갱신 개수라면 false라는 결과 종류 표시다.

ResultSet은 첫 행 앞에서 시작하는 커서를 움직여 읽는다

ResultSetSELECT 실행 결과를 테이블처럼 나타낸다. 내부 커서는 한 행을 가리키는 포인터이며, 처음에는 첫 번째 행이 아니라 첫 행의 바로 앞에 있다. 따라서 값을 읽기 전에 next()를 호출해야 한다.

호출 시점커서 위치next() 결과값 읽기 가능 여부
생성 직후첫 행 앞아직 호출 안 함읽을 현재 행이 없음
첫 번째 next()첫 행행이 있으면 true첫 행 읽기 가능
두 번째 next()둘째 행행이 있으면 true둘째 행 읽기 가능
마지막 행 다음 next()마지막 행 뒤false반복 종료
while (result.next()) {
    int idByName = result.getInt("ID");
    String cityByName = result.getString("Name");

    int idByIndex = result.getInt(1);
    String cityByIndex = result.getString(2);
}

열은 이름이나 인덱스로 읽을 수 있다. JDBC의 첫 번째 열 인덱스는 0이 아니라 1이다. getString()은 문자열 열, getInt()는 정수 열을 읽는다. previous()는 이전 행으로 커서를 이동하고, getStatement()는 현재 결과를 만든 Statement를 돌려준다.

실패 원인: next() 없이 곧바로 열 값을 읽는 실수는 배열 인덱스 오류와 다르다. 커서가 아직 어떤 행도 가리키지 않는 상태라는 것이 원인이므로, “이동 성공 시에만 읽는다”는 while (result.next()) 구조로 고친다.

DBMS 자료형과 Java 자료형은 읽기·설정 메서드까지 한 묶음이다

테이블의 열 자료형은 Java의 변수 자료형과 연결된다. 조회에서는 ResultSetget... 메서드로 Java 값을 얻고, 매개변수 SQL에서는 PreparedStatementset... 메서드로 DBMS에 전달할 값을 지정한다.

DBMS 자료형Java 자료형조회 메서드매개변수 설정
CHARStringgetString()setString()
VARCHARStringgetString()setString()
INTEGERintgetInt()setInt()
DATEjava.sql.DategetDate()setDate()

예를 들어 인구 열이 정수라면 getInt("Population")로 읽고, 인구 조건의 ?에는 setInt()로 값을 넣는다. 열 이름만 맞는다고 충분한 것이 아니라 DBMS 자료형, Java 변수형, getter와 setter를 일관된 묶음으로 선택해야 한다.

PreparedStatement는 SQL 구조와 데이터 값을 분리한다

PreparedStatement는 미리 준비된 SQL을 표현한다. Connection.prepareStatement(sql)로 만들 때 SQL을 전달하고, SQL 안의 ?에 실행 전에 값을 지정한다. 같은 SQL 구조를 여러 값으로 반복할 때 매번 전체 문장을 새로 조립하지 않아도 된다.

String sql = "SELECT ID, Name, Population "
        + "FROM city "
        + "WHERE CountryCode = ? AND Population > ?";

try (PreparedStatement prepared =
        connection.prepareStatement(sql)) {
    prepared.setString(1, "KOR");
    prepared.setInt(2, 1_000_000);

    try (ResultSet result = prepared.executeQuery()) {
        while (result.next()) {
            System.out.println(result.getString("Name")
                    + " : " + result.getInt("Population"));
        }
    }
}

첫 번째 ?setString(1, "KOR"), 두 번째 ?setInt(2, 1_000_000)과 연결된다. 열 인덱스처럼 매개변수 인덱스도 1부터 시작한다. PreparedStatement 객체가 이미 SQL을 가지고 있으므로 실행할 때는 executeQuery(), executeUpdate(), execute()에 SQL 문자열을 다시 전달하지 않는다.

비교 기준StatementPreparedStatement
SQL 제공 시점실행 메서드 호출 시객체 생성 시
변하는 값 표현SQL 문자열에 직접 포함?setInt()·setString() 등으로 지정
조회 실행executeQuery(sql)executeQuery()
반복 실행 상황매번 SQL 문자열 제공같은 SQL 구조에 매개변수 값만 교체

선택 기준: SQL 전체가 한 번만 쓰이는 단순 예라면 Statement의 흐름을 이해하고, 같은 구조에서 조건값만 바뀌거나 ?로 값을 분리해야 한다면 PreparedStatement를 선택한다.

메타데이터는 연결 정보와 결과 열 정보를 서로 다르게 설명한다

메타데이터는 데이터 자체가 아니라 데이터를 설명하는 정보다. DatabaseMetaData는 드라이버와 데이터베이스 연결 정보를, ResultSetMetaData는 조회 결과의 테이블·열·자료형 정보를 제공한다. 이름이 비슷하므로 어느 객체에서 getMetaData()를 호출하는지로 구분한다.

질문출발 객체메타데이터대표 메서드
어떤 드라이버·URL·사용자로 연결했는가?ConnectionDatabaseMetaDatagetDriverName(), getURL(), getUserName()
결과에 열이 몇 개이고 이름·형은 무엇인가?ResultSetResultSetMetaDatagetColumnCount(), getColumnName(), getColumnType()
DatabaseMetaData databaseInfo = connection.getMetaData();
System.out.println(databaseInfo.getDriverName());
System.out.println(databaseInfo.getDriverVersion());
System.out.println(databaseInfo.getURL());
System.out.println(databaseInfo.getUserName());

조회 결과의 열 구조를 동적으로 확인하려면 다음처럼 ResultSet에서 메타데이터를 얻는다. 직접 구성한 예에서는 열 개수까지 모두 순회하기 위해 조건을 index <= columnCount로 둔다. 강의 슬라이드 예의 index < columnCount는 마지막 열을 제외하게 되므로 의도한 전체 열 순회에는 등호가 필요하다.

ResultSetMetaData resultInfo = result.getMetaData();
int columnCount = resultInfo.getColumnCount();

for (int index = 1; index <= columnCount; index++) {
    System.out.println(
            resultInfo.getColumnName(index) + " / "
            + resultInfo.getColumnType(index) + " / "
            + resultInfo.getTableName(index));
}

getColumnType()이 돌려주는 JDBC 자료형 정보를 이용하면 Types.INTEGER, Types.CHAR 등의 경우를 나누어 알맞은 getter를 선택할 수 있다. 결과 구조를 미리 고정하지 않은 도구를 만들 때 유용한 판단 정보다.

한 번의 조회를 입력·선택·이동·변환·해제로 추적한다

직접 구성한 조회 사례를 다섯 상태로 분해하면 각 객체의 책임이 선명해진다. 요구사항은 “국가 코드와 최소 인구를 입력받아 해당 도시의 ID·이름·인구를 출력한다”이다.

  1. 입력: JDBC URL·계정으로 Connection을 얻는다.
  2. 선택: 값이 바뀌는 조건 두 개가 있으므로 ?가 있는 PreparedStatement를 만든다.
  3. 결합: 국가 코드는 setString(1, ...), 최소 인구는 setInt(2, ...)로 지정한다.
  4. 실행과 이동: 조회이므로 executeQuery()ResultSet을 얻고, next()가 참인 행만 읽는다.
  5. 변환과 해제: ID·PopulationgetInt(), NamegetString()으로 옮기고 블록을 벗어나 자원을 정리한다.

이 흐름에서 결과가 없으면 첫 next()false가 되어 본문을 한 번도 실행하지 않는다. 반대로 수정 SQL로 바꾸면 커서를 순회할 이유가 사라지고, executeUpdate()의 정수 결과로 몇 행이 바뀌었는지 확인한다. 같은 연결 코드라도 SQL의 결과형이 바뀌면 실행 이후의 분기가 달라지는 경계 사례다.

자가 점검: 긴 JDBC 코드를 보면 각 줄 옆에 연결(C), 실행문(S 또는 PS), 결과(R), 메타데이터(M) 중 하나를 적어 본다. 이어서 SQL 결과가 “표/개수” 중 무엇인지 표시하면 실행 메서드와 후속 처리의 오류를 빠르게 찾을 수 있다.

새 JDBC 코드는 실행 결과에서 거꾸로 점검한다

  1. 최종적으로 필요한 결과를 적는다. 여러 행이면 ResultSet, 변경 개수면 int, 연결 정보면 DatabaseMetaData, 열 구조면 ResultSetMetaData다.
  2. SQL 종류에 맞는 실행 메서드를 고른다. 조회는 executeQuery(), 변경은 executeUpdate(), 결과 종류가 가변이면 execute()다.
  3. SQL 제공 시점을 고른다. 실행할 때 문자열을 넘기면 Statement, 생성할 때 SQL을 준비하고 값만 넣으면 PreparedStatement다.
  4. 인덱스 기준을 확인한다. JDBC 열과 ?의 인덱스는 1부터 시작하며, 전체 열 반복은 마지막 인덱스까지 포함한다.
  5. 커서 이동을 먼저 배치한다. ResultSet 생성 직후 값을 읽지 않고 next()가 참인 범위에서 읽는다.
  6. DBMS형·Java형·getter/setter를 한 줄로 맞춘다. 문자열은 getString()/setString(), 정수는 getInt()/setInt()처럼 대응시킨다.
  7. 의존 자원을 같은 범위에서 관리한다. 연결, 실행 객체와 결과 집합을 try-with-resources로 묶는다.

이 점검 순서를 따르면 접속 실패, SQL 실행 메서드 오류, 커서 위치 오류와 자료형 불일치를 서로 다른 단계에서 진단할 수 있다. “JDBC 코드가 안 된다”를 하나의 문제로 보지 않고 어느 객체의 입력·상태·결과가 어긋났는지 좁혀 가는 것이 핵심이다.

핵심 개념 정리

  • 관계형 데이터베이스의 테이블·행·열 구조는 ResultSet의 행 순회와 열 getter에 대응한다.
  • JDBC 연결은 드라이버, URL, 사용자 정보가 필요하며 성공하면 Connection을 얻는다.
  • Connection에서 실행 객체를 만들고, 조회 실행 객체에서 ResultSet을 얻는다.
  • executeQuery()는 행 집합, executeUpdate()는 영향받은 행 수, execute()는 첫 결과의 종류를 알린다.
  • ResultSet 커서는 첫 행 앞에서 시작하고 열·매개변수 인덱스는 1부터 센다.
  • PreparedStatement는 객체 생성 때 SQL을 받고, ?에 자료형별 setter로 값을 지정한다.
  • DatabaseMetaData는 연결·드라이버를, ResultSetMetaData는 조회 결과의 열 구조를 설명한다.

JDBC 문제는 원하는 결과형 → 실행 메서드 → Statement 종류 → 매개변수와 자료형 → ResultSet 커서 → 메타데이터 필요 여부 → 자원 범위 순서로 판정한다. 이 순서는 단순한 API 암기표가 아니라 접속부터 결과 해제까지 어느 지점에서 선택이 달라졌는지 찾는 진단 절차다.

예상문제 10선

1. JDBC의 역할을 가장 정확히 설명한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③

  • ① 오답: 객체 직렬화와 파일 저장은 JDBC의 데이터베이스 연결 역할이 아니다.
  • ② 오답: JDBC는 SQL 실행과 결과 처리를 지원하지만 테이블을 클래스 파일로 자동 생성하는 API로 정의되지 않는다.
  • ③ 정답: 연결, SQL 실행, 조회·삽입·수정·삭제 결과 처리가 JDBC의 범위다.
  • ④ 오답: ResultSet은 조회 SQL의 실행 결과이며 컬렉션 소스로 임의 생성하는 객체가 아니다.

2. JDBC 조회 객체의 일반적인 생성 관계로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①

  • ① 정답: 연결 관리자가 연결을 반환하고, 연결에서 실행 객체를 만든 뒤 조회 실행으로 결과 집합을 얻는다.
  • ② 오답: 결과 집합은 연결과 실행 객체가 준비된 뒤에 생성되므로 출발점이 될 수 없다.
  • ③ 오답: Statement는 먼저 Connection에서 생성해야 한다.
  • ④ 오답: ResultSet은 연결에서 직접 만드는 것이 아니라 실행 객체가 SQL을 실행한 결과다.

3. 실행할 SQL이 UPDATE city SET Population=100 WHERE ID=1일 때 기본 선택으로 알맞은 메서드와 반환형은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④

  • ① 오답: executeQuery()는 행 집합을 반환하는 조회 SQL에 대응한다.
  • ② 오답: getResultSet()execute()가 조회 결과를 만들었을 때 꺼내는 후속 메서드다.
  • ③ 오답: next()는 이미 만들어진 조회 결과의 커서를 이동한다.
  • ④ 정답: 수정 SQL은 영향받은 행의 개수를 정수로 받는 executeUpdate()가 기본 선택이다.

4. Statement.execute(sql)false를 반환했다는 설명으로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②

  • ① 오답: 연결 실패 여부와 execute()가 돌려주는 첫 결과의 종류는 다른 문제다.
  • ② 정답: 불리언은 성공 여부가 아니라 ResultSet인지 갱신 개수인지 구분한다.
  • ③ 오답: SQL 오류를 결과 종류인 false와 같은 의미로 해석하면 안 된다.
  • ④ 오답: 행이 없는 조회도 결과의 형태는 ResultSet이며 커서 이동 결과에서 빈 상태를 확인한다.

5. 두 행을 가진 ResultSet을 생성한 직후 첫 번째 행의 값을 읽으려면 가장 먼저 무엇을 해야 하는가?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③

  • ① 오답: 생성 직후 커서는 첫 행 앞에 있으므로 이전 행으로 이동해서는 첫 행을 가리킬 수 없다.
  • ② 오답: 값 읽기는 현재 행이 있어야 하며 JDBC 열 인덱스도 1부터 시작한다.
  • ③ 정답:next()가 성공하면 그때 커서가 첫 행을 가리켜 getter를 사용할 수 있다.
  • ④ 오답: 메타데이터는 결과 구조를 설명할 뿐 커서를 첫 행으로 이동하지 않는다.

6. SQL이 WHERE CountryCode=? AND Population>?이고 두 값이 각각 "KOR", 1000000일 때 올바른 설정은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②

  • ① 오답: JDBC 매개변수 인덱스는 0이 아니라 1부터 시작한다.
  • ② 정답: 첫 물음표는 문자열 국가 코드, 둘째 물음표는 정수 인구 조건과 자료형·순서가 일치한다.
  • ③ 오답: 매개변수 위치와 자료형을 서로 뒤바꾸어 SQL의 두 조건과 맞지 않는다.
  • ④ 오답: 첫 매개변수만 두 번 덮어쓰고 두 번째 매개변수는 설정하지 않는다.

7. StatementPreparedStatement의 SQL 제공 시점을 바르게 비교한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④

  • ① 오답: ResultSet은 SQL 실행 결과라 SQL보다 먼저 만들어질 수 없다.
  • ② 오답: 연결과 커서 이동은 두 실행 객체의 SQL 제공 시점을 구분하는 단계가 아니다.
  • ③ 오답: 두 객체의 제공 시점을 정확히 반대로 설명했다.
  • ④ 정답: Statement.executeQuery(sql)connection.prepareStatement(sql)의 인수 위치가 차이를 보여 준다.

8. 현재 연결에 사용된 JDBC 드라이버 이름과 URL을 확인하려면 사용할 객체는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①

  • ① 정답: 연결의 getMetaData()로 얻어 드라이버·URL·사용자 정보를 조회한다.
  • ② 오답: 이 객체는 조회 결과의 열 개수·이름·자료형을 설명한다.
  • ③ 오답: 매개변수 SQL을 준비하고 실행하는 객체이며 연결 설명 정보의 주체가 아니다.
  • ④ 오답: 조회된 행들을 나타내며 드라이버 자체의 이름을 제공하는 메타데이터가 아니다.

9. ResultSetMetaData.getColumnCount()가 5를 반환했다. 1부터 시작하는 인덱스로 모든 열을 정확히 한 번씩 순회하는 조건은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③

  • ① 오답: 0번 열은 없고 마지막 5번 열도 범위에 포함되지 않는다.
  • ② 오답: 1~4만 방문해 다섯 번째 열을 누락한다.
  • ③ 정답: 유효한 열 인덱스 1, 2, 3, 4, 5를 모두 포함한다.
  • ④ 오답: 끝값은 맞지만 존재하지 않는 0번 열부터 시작한다.

10. “같은 조회 구조에서 최소 인구값만 바꾸어 여러 번 실행하고, 결과 도시를 행 단위로 읽는다”는 요구에 가장 알맞은 흐름은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②

  • ① 오답: 변경 행 개수를 반환하는 흐름이라 조회 결과 행을 제공하지 않는다.
  • ② 정답: 반복해서 바뀌는 값을 매개변수로 분리하고 조회 결과의 커서를 행마다 이동하는 흐름이다.
  • ③ 오답: 조회 SQL을 실행하고도 행 집합 대신 변경 행 개수를 얻으려 해 결과 처리 방식이 충돌한다.
  • ④ 오답: 조회 요구에 변경용 executeUpdate()를 사용하고, 정수 결과에 존재하지 않는 커서 순회를 연결했다.

참고 자료와 작성 기준

이 글은 해당 차시 강의자료를 바탕으로 학습 목적에 맞게 재구성한 비공식 학습자료입니다. 실행 메서드 선택표, 커서 상태 추적과 오류 교정 예시는 학습자의 이해를 돕도록 직접 구성하고 검토했습니다.

  • 작성·편집: 올에이클래스 학습연구팀
  • 주요 근거: 한국방송통신대학교 Java프로그래밍 14강 「JDBC 프로그래밍」 강의록(2024년 실습 환경) :codex-file-citation{path="K1. 컴퓨터과학과/1. 재검토필요/2-1 Java프로그래밍/1. 강의록/Java프로그래밍 강의록 14강.pdf" purpose="source"}
  • 편집 원칙: 올에이클래스 편집 정책
  • 최종 내용 검토: 2026-09-02

댓글