관리 메뉴

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

JDBC 프로그래밍 5 - 자바의 JDBC 프로그래밍 2 : 데이터베이스 사용과 데이터 검색 본문

프로그래밍 언어/자바

JDBC 프로그래밍 5 - 자바의 JDBC 프로그래밍 2 : 데이터베이스 사용과 데이터 검색

huenuri 2024. 12. 14. 10:31

이번에는 데이터베이스를 사용하는 내용을 공부해보려고 한다.


 

 

 

 

데이터베이스 사용

자바에서 데이터베이스에 연결 후에는 16.3절에서 설명한 MySQL 명령행 도구에서 사용한 SQL 문을 똑같이 사용하여 데이터베이스에 접근한다. 자바에서 SQL문을 실행하기 위해서는 Statement 클래스를 이용하고, SQL문 실행 결과를 얻어오기 위해서는 ResultSet 클래스를 이용한다. Statement 클래스에서 자주 사용되는 메서드는 <표 16-3>과 같다.

 

 

데이터를 검색하기 위해서는 executeQuery() 메소드를 사용하고, 추가, 수정, 삭제와 같이 데이터 변경은 executeUpdate() 메소드를 이용한다.


 

 

 

ResultSet 객체는 현재 데이터의 행(레코드 위치)을 가리키는 커서(cursor)를 관리한다. 초기 값은 첫 번째 행 이전을 가리키도록 되어있다. 따라서 ResultSet 클래스는 주로 커서의 위치와 관련된 메소드와 레코드를 가져오는 메서드를 제공한다. ResultSet 클래스에서 자주 사용되는 메소드는 <표 16-4>와 같다.


 

 

 

 

데이터 검색

 

1. 테이블의 모든 데이터 검색

student 테이블의 모든 데이터를 검색하는 코드는 다음과 같다.

검색된 결과는 rs에 들어 있다.


 

 

 

 

2. 특정 열만 검색

테이블에서 특정 열만 검색하고 싶은 경우는 '*' 대신에 검색할 열의 이름을 콤마로 분리하여 나열한다. 다음은 student 테이블에서 모든 레코드에 대해 name과 id 필드만을 검색한다.


 

 

 

 

3. 조건 검색

특정 조건에 부합하는 데이터를 검색하고 싶은 경우는 다음 코드와 같이 select 문의 where 절을 이용하여 조건에 맞는 데이터 검색한다. 다음은 student 테이블에서 id 필드의 값이 0494013인 레코드를 검색한다.

 

그리고 검색된 걸과는 모두 rs에 들어있다.


 

 

 

4. 검색된 데이터의 사용

검색의 결과는 ResultSet 객체에 저장된다. ResultSet 클래스의 메서드를 이용하여 커서가 가리키는 현재 행에 대해 열의 값을 읽어 온다. 예를 들어 ResultSet 클래스의 객체 rs에 저장된 name 필드의 값과 id 필드의 값을 얻어내기 위해서는 각각 다음과 같이 한다.

 

 

다음 코드는 ResultSet 객체에 저장된 각 행의 모든 열을 순차적으로 출력하는 코드이다.

 

열의 값을 읽기 위해서는 열의 데이터 타입을 알고 있어야 하며 그에 맞는 ResultSet 클래스의 메소드를 호출해야 한다. 또는 모든 데이터 타입에 대해 getString() 메소드로 읽을 수 있는데 이 경우는 모든 값이 문자열로 반환되므로 프로그램 내에서 적절한 데이터 타입으로 변환해서 사용해야 한다.


 

 

 

예제 16-2 : 데이터 검색과 출력

앞서 생성한 sampledb의 student 테이블의 모든 데이터를 출력하고, 특별히 이름이 "이기자"인 학생의 데이터를 출력하는 프로그램을 작성하라.

 

 

책에 있는 코드는 오류가 있어서 내가 따로 수정한 코드를 올려보았다. 코드에는 다음과 같은 오류가 있었다.

 

문제점

  1. MySQL 드라이버 클래스
    • Class.forName("com.mysql.jdbc.Driver");는 더 이상 사용되지 않는(deprecated) 드라이버 클래스이므로 최신 드라이버 클래스 com.mysql.cj.jdbc.Driver로 변경해야 한다.
  2. 자원 해제 누락
    • Connection, Statement, ResultSet은 사용 후 반드시 닫아야 해. 그렇지 않으면 리소스 누수가 발생할 수 있다.
  3. printData 메서드의 컬럼명 사용
    • srs.getString("name") 등에서 하드코딩된 컬럼명을 사용하고 있음. 전달받은 col1, col2, col3 변수를 제대로 활용하지 않고 있음

 

 

하지만 실행 결과 이기자만 검색이 되고 있다.


 

 

 

 

왜 이기자만 조회되었는가?

  • 코드는 정상적으로 동작하며, SELECT name, id, dept FROM student WHERE name='이기자' 쿼리를 실행했기 때문에 조건에 맞는 이기자 레코드만 조회
  • MySQL에서 student 테이블을 확인하고 데이터가 제대로 입력되어 있는지 확인해야 한다.

 

조회 결과 이기자만 있었다. 아마 테이블 삭제 실습을 할 때 데이터를 나머지 사람들의 데이터를 지운 것 같다. 정보를 삽입할 때 주의할 점이 있어 그 내용을 한번 정리해보려고 한다.


 

 

MySQL에서 동일한 데이터를 삽입할 때 문제가 발생할지 여부는 테이블 정의와 제약 조건에 따라 다르다.

 

1. 테이블 정의에 따라 다름

(1) id가 기본 키(Primary Key)일 경우

  • 기본 키(Primary Key)로 설정된 컬럼은 중복 값을 허용하지 않는다.
  • 만약 이미 id='002'인 레코드가 존재하면 다음과 같은 오류가 발생
ERROR 1062 (23000): Duplicate entry '002' for key 'PRIMARY'
  • 이를 방지하려면 기본 키로 설정된 컬럼의 값을 중복되지 않게 지정해야 한다.

 

(2) id가 기본 키가 아닌 경우

  • 기본 키가 없거나 id 컬럼이 기본 키로 설정되지 않았다면, 동일한 데이터(예: name='이기자', id='002', dept='전자공학')를 삽입할 수 있다. 하지만 이렇게 하면 테이블에 중복된 레코드가 쌓이게 된다.

 

 

2. 테이블 상태 확인

student 테이블의 정의를 확인하려면 아래 명령어를 실행한다.

 

이 명령어는 테이블의 컬럼 정의, 데이터 타입, 제약 조건 등을 보여준다. 결과를 보면 id 컬럼이 기본 키(Primary Key)로 설정되어 있다. 따라서 id 값은 중복될 수 없다. 만약 동일한 id 값을 가진 데이터를 삽입하려고 하면 조금 전에 언급한 오류가 발생할 것이다.

 

테이블이 기본 키를 가진 경우

기본 키를 설정한 테이블 예

 

이와 같은 오류가 발생한다. 


 

 

 

 

3. 중복 데이터 방지 방법

(1) 기본 키 설정

id 컬럼을 기본 키로 설정하여 중복된 id 값을 삽입하지 못하도록 방지

ALTER TABLE student ADD PRIMARY KEY (id);

 

하지만 이미 id가 기본 키로 설정되어 있다면, 오류가 발생할 가능성이 높다.

 

 

예상했던 대로 오류가 뜬다.


 

 

(2) 데이터 중복을 제외하고 삽입

이기자는 있는 것이 확인되었으니 다른 두 명의 데이터만 삽입해 보았다.

 

이제 데이터를 조회해 보자.

 

 

 

 

두 명의 다른 데이터가 삽입되었다.


 

 

 

코드 다시 실행하기

 

MySQL에서 설정을 마치고 코드를 실행하니 이번에는 이기자외에 다른 사람들도 조회된다. 마지막에 이기자인 사람만 조회했으니 이기자는 두 번 등장한 것이다.


 

 

 

학습을 마치고

이제 MySQL에서도 오라클처럼 검색하고 조회하는 방법을 알게 되었다. 여기까지 오기 정말 힘들었다. 그래도 일단 시작한 것은 난 무슨 일이 있어도 중단하지 않게 된 것이 올해의 놀라운 변화이다.

다음 포스트에 데이터를 변경하는 내용을 공부해 보겠다.