관리 메뉴

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

데이터베이스와 JDBC 2 - JDBC를 이용한 데이터 조작하기 2 : SELECT 문과 Statement, ResultSet 클래스 본문

웹 · 앱 개발/JSP & Servlet

데이터베이스와 JDBC 2 - JDBC를 이용한 데이터 조작하기 2 : SELECT 문과 Statement, ResultSet 클래스

huenuri 2024. 12. 15. 09:15

개념적인 내용은 많이 지루해서 실습 위주로 진행하고 빨리 서둘러 이 단원을 마치고 싶다. 정말 하기 싫지만 아마추어와 프로의 다른 점은 아무리 하기 싫어도 자신이 해야 할일과 시작한 일을 끝마친다는 것이다.

난 아마추어가 아니라 프로니까 내가 하기로 결정한 일을 끝까지 책임지는 사람이 될 것이다.


 

 

 

 

 

JDBC를 이용한 데이터 조작하기 두 번째

 

SELECT 문과 Statement, ResultSet 클래스

Connection 객체가 생성되면 데이터베이스에 접근이 가능해진다. Connection 객체는 데이터베이스의 연결을 의미하는 것이고, 실제 SQL 문을 수행하기 위해 서는 Statement 객체를 생성해야 한다. Statement 객체는 이전 단계에서 생성한 Connection 객체(con)으로 접근해서 createStatement() 메서드를 호출해서 생성한다 다음과 같이 Statement 객체를 얻어온다.

Statement stmt = conn.createStatement();

 

Connection 객체에 대해 createStatement() 메서드의 결과값은 Statement 객체 변수에 저장해둔다. 그 이유는 SQL 표준 쿼리문을 수행하기 위해서이다. 모든 작업이 끝나면 Statement 객체 역시 close() 메서드를 호출해서 데이터베이스와의 연결을 해제해야 한다.

stmt.close();

 

 

Statement 객체 변수를 사용하면 DBMS에서 사용했던 SQL 표준 쿼리문을 자바 브로그램에서도 사용할 수 있게 된다. Statement 객체가 성공적으로 생성되었다면 4단계에서 처리할 쿼리문을 실행하는 메서드를 호출해야 한다. 쿼리문을 수행하는 메서드는 2가지로 구분된다.

 

 

Statement 객체 변수를 사용하여 쿼리문을 수행할 수 있다. 쿼리문을 수행하는 메서드는 쿼리문의 종류에 따라 달라진다. select 문과 같이 결과가 있는 경우에는 executeQuery() 메서드를 사용하고, insert, update, delete 문과 같이 내부적으로는 어떤 변화가 있지만 결과가 없는 경우에는 executeUpdate() 메서드를 사용한다.

executeQuary() 메서드는 매개 변수로 준 select 문을 데이터베이스로 보내어 실행하도록 하고 그 결과값을 ResultSet으로 받게 된다.

 


 

 

 

 

 

 

 

 

select 문을 수행하고 반환된 값을 저장한 ResultSet 객체는 여러 개의 로우(행)로 구성되어 있다. 만일 3개의 행으로 구성되어 있다면 위와 같이 실질적인 데이터가 저장되어 있는 영역과 함께 실제 데이터가 저장되어 있지 않은 영역으로 BOF와 EOF가 함께 존재한다.

BOF는 첫 번째 로우보다 하나 더 이전의 레코드 셋을 의미하고 EOF는 마지막 로우보다 하나 더 다음 레코드 셋을 의미한다. 이러한 여러 개의 로우를 한꺼번에 처리할 수는 없고 한 개의 행 단위로 처리할 수 있도록 ResultSet 클래스는 다음고 같은 다양한 메서드를 제공한다.

 

 

 

위 메서드들은 성공적으로 진행될 경우에는 true를 리턴하고, 그렇지 않을 경우에는 false를 리턴한다.


 

 

 

 

ResultSet 객체인 rs가 레코드 단위로 이동하기 위해서 next() 메서드를 사용해야 하는 이유를 살펴보자.

Statement 각체의 executeQuery() 메서드에 기술한 select 문의 결과값으로 여러 개의 로우를 리턴받는데 이중 레코드의 위치를 가리키는 Cursor가 있다. Cursor의 최초의 위치는 Before The First Row이기 때문에 Cursor의 위치를 다음 위치로 이동해야만 첫 번째 레코드의 내용을 얻어올 수 있다.

한 행의 처리가 끝나고 다음 행으로 이동하기 위해서 또 다시 next(0 메서드를 사용해야 한다. 더 이상 레코드가 존재하지 않으면 next() 메서드가 false를 리턴하기 때문에 반복문에서 벗어나 작업을 종료한다.


 

 

 

데이터베이스에는 다양한 자료형을 사용한다. 이런 다양한 컬럼 타입을 자바의 데이터 형에 맞추기 위해 JDBC는 다양한 형태의 getXXX 계열의 메서드를 제공한다. 컬럼 타입이 문자열(varchar2, char)일 경우에는 getString()을 이용해서 데이터를 읽어오고 정수(number)라면 getInt()를 사용한다.

 

 

 

 

 

 

 

인덱스 번호는 1부터 시작한다. 그래서 이메일 값을 얻어오려면 rs.getString("email") 대신에 rs.getString(4)라고 사용해도 된다. 성능 면에서 인덱스를 사용하는 편이 속도가 빠르다.


 

 

 

 

 

[직접 해보기] member 테이블의 내용 출력하기

 


 

 

 

 

코드 수정하기

이렇게 했을 때 width에서 노란줄이 뜬다. HTML5에서는 width 속성이 더 이상 유효하지 않아, 대신 CSS를 사용해 스타일링을 적용하는 것이 권장된다. 따라서 table 태그의 width 속성에 노란 줄이 뜬다. 이 내용을 syle 태그를 사용하여 설정해보겠다. 책은 이런 부분이 잘 반영되지 않았다.

 

이제 코드를 실행해보겠다. 어제 할때는 잘 안되었는데 오늘은 어떤지 볼 것이다.


 

 

 

 

코드 실행하기

 

하지만 테이블의 목록이 하나도 출력되지 않았다.

 

 

1. SQL 쿼리 문제

sql 변수에 저장된 쿼리 select * from member가 올바른 테이블을 참조하고 있는지 확인해야 한다. 다음을 확인하자.

  • 테이블 이름(member)이 실제로 존재하는지 확인

 

  • 테이블이 존재하고 데이터가 있는지 확인

 

이 오류는 member 테이블이 데이터베이스에 존재하지 않을 때 발생하는 메시지이다.

 

 

 

2. 현재 접속된 사용자 계정 확인

  • member 테이블이 현재 접속된 계정(여기서는 hr)에 없을 가능성이 있다.
  • 현재 계정에 테이블이 있는지 확인하려면 아래 SQL을 실행해보자.
     

 

 

  • 결과에 member 테이블이 없으면, 해당 계정에서 member 테이블이 존재하지 않는 것이다.

 

 

3. member 테이블이 없는 경우 생성

  • 테이블이 없다면 새로 만들어야 해. 아래 SQL을 사용해서 member 테이블을 생성할 수 있다.

 

 

 

 

4. 데이터 추가하기

아래 SQL로 데이터를 추가한다.

 

 

하지만 여기서 구문 오류가 발생했다. 여러 레코드들을 쉼표(,)로 구분하는 방식은 SQL 표준이다. 하지만 혹시 특정 데이터베이스에서 문제가 생긴다면, 아래처럼 하나씩 INSERT INTO로 나눠서 실행해볼 수 있다.

 

 

 

 

 

 

 

이제 member 테이블에 사람들의 정보가 잘 들어가있음을 확인했다. 하지만 수없이 코드를 수정하고 또 수정해도 역시 되지 않았다.


 

 

 

 

학습을 마치고

JSP 공부는 여기서 마칠 생각이다. 더 이상 이 과목을 공부하기가 싫어졌다. 그리고 지금 별로 필요 있을 것 같지도 않다. 오늘 새벽에 정말 일어나기 싫기도 하고 웹 개발 공부가 너무나도 지루해서 고민이 많았다.

때로는 어떤 일을 끝내는 데도 큰 용기가 필요한 것 같다.