관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

JDBC 프로그래밍 9 - 연습문제 이론편 문제 풀기 본문

프로그래밍 언어/자바

JDBC 프로그래밍 9 - 연습문제 이론편 문제 풀기

huenuri 2024. 12. 14. 15:03

고민을 하다 연습문제를 풀어보기로 했다.


 

 

 

 

연습문제 이론편 문제 풀기

 


 

 

 

문제 2번

 

1. 테이블(Table)

  • 정의 : 데이터베이스에서 데이터를 저장하는 기본 단위. 엑셀의 시트(sheet)와 비슷한 구조로, 데이터를 행과 열로 구성하여 저장
  • 특징
    • 각 테이블은 특정 주제(예: 학생, 직원, 상품 등)에 대한 데이터를 저장
    • 테이블에는 고유한 이름이 있어야 하고, 같은 데이터베이스 안에서는 중복될 수 없다.
    • 테이블은 여러 개의 열(Column)과 행(Row)으로 구성

예시

ID NAME AGE DEPT
1 홍길동 21 컴퓨터공학과
2 이기자 23 전자공학과
3 박영희 22 기계공학과

 

위 예제에서 학생(Student)이라는 테이블은 학생의 ID, 이름, 나이, 학과 정보를 저장한다.


 

 

 

 

2. 열(Column)

  • 정의 : 테이블의 세로 방향 구성 요소로, 저장할 데이터의 속성 또는 필드를 나타냄
  • 특징
    • 열은 데이터의 타입(예: 정수, 문자열, 날짜 등)과 제약조건(NOT NULL, UNIQUE 등)을 정의
    • 테이블마다 고정된 열이 있고, 같은 열에는 같은 종류의 데이터만 저장됨
    • 열은 필드라고도 불리며, 각 열은 테이블에 저장되는 데이터의 특정 속성을 나타냄

예시

열 이름(Column) 설명 데이터 타입
ID 고유 ID INT
NAME 이름 VARCHAR
AGE 나이 INT
DEPT 학과 VARCHAR

 

 

 

 

3. 행(Row)

  • 정의 : 테이블의 가로 방향 구성 요소로, 데이터를 하나의 레코드(Record) 단위로 저장
  • 특징
    • 각 행은 데이터의 한 인스턴스(instance)를 나타냄
    • 예를 들어, 한 행이 한 학생의 정보를 나타냄
    • 모든 행은 테이블의 열(Column)에 정의된 데이터 타입과 제약 조건을 따라야 함

예시

ID NAME AGE DEPT
1 홍길동 21 컴퓨터공학과
  • 위에서 한 행은 학생 ID가 1이고, 이름이 홍길동이며, 나이가 21살이고, 학과가 컴퓨터공학과인 데이터를 나타냄

 

요약 비교

구성 요소 역할 비유
테이블 데이터를 저장하는 큰 틀 엑셀의 시트(sheet)
열(Column) 데이터의 속성을 정의 엑셀의 열(컬럼, 세로줄)
행(Row) 데이터의 실제 값을 저장하는 단위 엑셀의 행(로우, 가로줄)

 

 

이처럼 테이블은 데이터베이스에서 데이터를 정리된 구조로 저장하기 위해 사용되며, 열(Column)은 데이터의 속성을, 행(Row)은 데이터의 각 인스턴스를 저장하는 역할을 한다.


 

 

 

 

 

문제 4번

Statement와 ResultSet은 JDBC(Java Database Connectivity) API에서 데이터베이스와 상호작용할 때 사용하는 클래스들이다. 이 두 클래스는 주로 데이터베이스에 쿼리를 보내고, 결과를 처리하는 데 사용된다.

 

1. Statement 클래스

정의

  • 데이터베이스에 SQL 쿼리를 실행하기 위한 객체
  • SQL문을 실행하고, 그 결과를 데이터베이스로부터 가져오는 역할을 함

기능

  • SELECT, INSERT, UPDATE, DELETE 같은 SQL문을 실행할 수 있음
  • JDBC의 Connection 객체로부터 생성됨
  • 주로 정적(변하지 않는) SQL문을 실행할 때 사용됨
Statement stmt = conn.createStatement();

 

여기서 conn은 Connection 객체이다.

 

주요 메서드

메서드 설명
executeQuery(String sql) SELECT 문을 실행하고, 결과를 ResultSet으로 반환.
executeUpdate(String sql) INSERT, UPDATE, DELETE 문을 실행하고, 영향을 받은 행(row)의 개수를 반환.
execute(String sql) 쿼리를 실행하고, 반환되는 결과(데이터/성공 여부)를 알 수 있음.
close() Statement 객체를 닫음. 메모리 관리에 필요.

 

예제

Statement stmt = conn.createStatement();
String sql = "SELECT * FROM students";
ResultSet rs = stmt.executeQuery(sql);

 

 

2. ResultSet 클래스

정의

  • SQL SELECT 쿼리의 결과 데이터를 담는 객체
  • 행(Row) 단위로 결과 데이터를 읽을 수 있으며, 데이터베이스에서 가져온 테이블의 데이터를 담고 있음

특징

  • 데이터를 읽기 전용(Read-only)으로 처리
  • 기본적으로 커서(Cursor)는 첫 번째 행 에 위치하며, next() 메서드를 호출해야 첫 번째 행부터 접근할 수 있음

생성 방법

  • Statement 객체의 executeQuery() 메서드를 호출하면 ResultSet 객체가 반환됨
ResultSet rs = stmt.executeQuery("SELECT * FROM students");

 

주요 메서드

메서드 설명
next() 다음 행으로 커서를 이동. 결과가 없으면 false를 반환.
getString(columnName) 문자열 데이터를 반환 (열 이름으로).
getInt(columnName) 정수 데이터를 반환 (열 이름으로).
getDouble(columnName) 실수 데이터를 반환 (열 이름으로).
getDate(columnName) 날짜 데이터를 반환.
close() ResultSet 객체를 닫음. 메모리 관리에 필요.

 

예제

ResultSet rs = stmt.executeQuery("SELECT * FROM students");
while (rs.next()) { // 다음 행이 있으면 true 반환
    String name = rs.getString("name");  // 열 이름으로 데이터 가져오기
    int age = rs.getInt("age");
    System.out.println("Name: " + name + ", Age: " + age);
}
rs.close(); // 리소스 반납

 

 

Statement와 ResultSet의 관계

  1. Statement 객체를 사용하여 데이터베이스로 쿼리를 보냄
  2. 쿼리의 결과가 ResultSet 객체로 반환됨(SELECT 쿼리일 경우)
  3. ResultSet 객체를 이용하여 데이터를 행(Row) 단위로 읽음

요약

클래스 역할
Statement SQL문을 실행하는 역할. executeQuery, executeUpdate 메서드를 통해 쿼리 수행.
ResultSet SELECT 쿼리의 결과 데이터를 담는 객체. 행(Row) 단위로 데이터를 읽음.

 

둘은 항상 함께 사용되며, 쿼리 실행과 결과 처리의 필수적인 구성 요소이다.


 

 

 

 

문제 5번

데이터베이스에서 id 필드 값을 읽어오도록 ResultSet 객체를 이용한 코드를 작성해야 한다.

 

해설

  1. ResultSet 클래스
    • ResultSet은 SELECT 쿼리의 결과를 담는 객체이다.
    • 쿼리로 가져온 테이블의 각 열(필드) 데이터를 읽기 위해 여러 메서드를 제공한다.
    • rs.getInt("columnName") : 해당 열(columnName)의 데이터를 정수형(int)으로 가져온다.
  2. getInt() 메서드
    • 데이터 타입이 int인 필드(컬럼)의 값을 가져올 때 사용한다.
    • 파라미터로 열 이름(id) 또는 열 인덱스(1부터 시작)를 받을 수 있다.
  3. 코드 흐름
    • SELECT 쿼리를 실행한 후, 결과를 ResultSet 객체(rs)로 받아온다.
    • rs.next() 메서드를 호출하여 결과 집합의 첫 번째 행부터 데이터를 읽는다.
    • rs.getInt("id")를 호출하여 id 필드의 값을 가져온다.

 

예제 코드

아래는 전체적인 흐름을 포함한 예제이다.

// 데이터베이스 연결 및 쿼리 실행
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, name FROM tableName");

// 결과 가져오기
while (rs.next()) {
    int id = rs.getInt("id"); // id 필드의 값 읽기
    String name = rs.getString("name"); // name 필드의 값 읽기
    System.out.println("ID: " + id + ", Name: " + name);
}

 

 그리고 답은 이거다.

int id = rs.getInt("id");

 

이제 자바 코드로 이 문제의 전체 코드를 작성해 보겠다.


 

 

 

 

자바 코드로 작성하기

 

 

 

 

오류가 발생한 이유는 tableName을 실제 테이블 이름으로 변경하지 않았기 때문이다. MySQL 데이터베이스에서 sampledb의 테이블 이름을 확인하고, tableName을 올바른 테이블 이름으로 바꿔야 한다.


 

 

 

코드 수정하기

 

1. 테이블 이름 확인

  • sampledb 데이터베이스에 테이블이 존재하는지 확인하고, 테이블 이름을 적어야 한다.
  • MySQL에서 USE sampledb; SHOW TABLES;를 실행하면 테이블 이름을 확인할 수 있다.

 

확인한 테이블 이름을 코드에서 tableName 대신 사용하면 된다.

 

 

 

2. 확인해야 할 사항

  • 테이블 이름이 student가 맞는지 확인
  • student 테이블이 없다면, 새 테이블을 생성하거나 정확한 테이블 이름을 확인해야 한다.

 

 

이제 데이터를 제대로 불러왔다. MySQL에서도 확인해 보니 다음과 같은 결과가 나온다.

 

 

 

근데 난 이기자의 데이터를 수정해보고 싶어서 다음과 같이 작성해 보았다.


 

 

 

 

SQL 문 수정하기

 

 

이제 내가 원하는 대로 코드가 잘 수정되었다.


 

 

 

 

학습을 마치고

연습문제 이론편 학습을 마쳤다. 문제를 응용해서 다른 코드도 작성해 보며 이젠 JDBC도 별로 어렵지 않게 되었다. 이어서 실습편 문제도 다 풀고 이 단원을 마무리해야지.

요즘은 학습 후기를 별로 길게 쓰고 싶지 않다.