메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

WebRowSet으로 최고의 JDBC 만들기(1)

한빛미디어

|

2007-05-02

|

by HANBIT

14,227

제공 : 한빛 네트워크
저자 : Sharad Acharya
역자 : 박찬욱
원문 : Making the Most of JDBC with WebRowSet

어떤 실세계에서든지 엔터프라이즈 급의 어플리케이션은 몇 몇 영속 저장소(persistent storage)의 접근이 필수적으로 요구된다. 관계형 데이터베이스 관리 시스템(RDBMS)은 데이터 쿼리와 수정을 위한 SQL을 지원하는 현재 전 세계적으로 가장 많이 사용되는 영속 저장소 메카니즘이다. Java DataBase Connectivity(JDBC)는 자바 프로그램이 SQL을 사용해서 RDBMS에서 데이터를 받아오고, 수정하기 위한 구조(framework)를 제공하는 API의 묶음이다.

데이터베이스에서 자바 프로그램으로 데이터를 받거나 수정하는 것은 몇 단계의 작업을 포함하고 있다. 첫 번째로, 프로그램은 데이터베이스와 정보 전달이 가능하게 하기 위해서 커넥션을 얻어야 한다. 커넥션을 얻기 위한 접근법은 몇 가지가 있다. 전통적인 접근법으로는 자바 프로그램에서 특정 벤더에서 제공하는 JDBC 드라이버를 로딩한 후에 java.sql.DriverManager 클래스의 getConnection() 메소드를 호출하는 것이다. 또 다른 방법으로는 특정 벤더에서 제공하는 구현체를 이용하거나, 대상이 되는 데이터베이스를 위한 javax.sql.Connection 인터페이스를 구현한 커스텀 클래스를 작성해서 커넥션 객체를 생성하고, 초기화하는 것이다. Java EE container와 같은 좀 더 잘 관리되는(controlled) 환경에서는 Java Naming and Directory Interface(JNDI)를 사용해서 커넥션 객체를 받아 오는 방법도 있다. 커넥션 객체를 받아오는데 사용되는 메소드가 무엇이든지 간에, 커넥션을 성공적으로 받아 왔다면, 해당 커넥션은 java.sql.Connection 인터페이스를 구현한 인스턴스가 된다. 이 커넥션에서 프로그램은 java.sql.Statement 인스턴스를 만들거나 데이터베이스로 적절한 쿼리를 수행하기 위해서 몇 몇의 하위 인터페이스(subinterface)를 구현할 것이다. 마지막으로, 프로그램은 statement를 실행해, 데이터베이스의 데이터 중 쿼리를 만족시키는 실제 데이터를 대표하는 java.sql.ResultSet의 인스턴스를 받는다.

이 글을 쓰는 이 시점에서 JDK version 5.0JDBC version 3.0을 지원하는 자바의 가장 최신 버전이다. JDBC 3.0 버전은 데이터 처리와 전송을 쉽게 사용하고, 유연하게 사용하기 위한 몇 가지 기능을 제공한다. 이번 글에서는 첫 번째로 상속 구조(inheritance hierarchy)를 간단히 설명하고, 그 다음으로는 데이터베이스에서 XML로 데이터를 쉽게 전송하게 해주는(그 반대로도) javax.sql.rowset.WebRowSet 인터페이스의 특징을 어떻게 사용하는지를 보여주는 예제를 보여주게 될 것이다. 그다음 이 인터페이스의 이점(benefit)과 부담(liabilities)에 대해서 토의해볼 것 이다. 마지막으로 이 인터페이스가 더 좋은 선택이라는 것을 보여주는 몇 가지의 시나리오를 설명한 후에 결론을 질 것이다.

WebRowSet 구조(Hierarchy)

WebRowSet 인터페이스의 상속 구조를 간단히 설명하는 걸로 시작을 해보자. [그림 1]은 이번 논의의 대상이 되는 자바 요소(packages, interfaces, and classes)를 보여주고 있다.


[그림 1] WebRowSet 상속 구조

상속 구조의 시초(root)는 java.sql.ResultSet 인터페이스이다. 이 인터페이스의 인스턴스는 데이터베이스에서 몇 몇 쿼리를 포함하는 java.sql.Statement의 실행을 통해서 받아온 표 형태의 데이터를 나타낸다. 기본 ResultSet은 오로지 앞으로만 진행이 가능한 구조(only forward direction)고 수정이 불가능하다. 기본 ResultSet을 통한 이동의 방법으로는 정교한 컨트롤이 불가능하다.

그러면 다음 할 수 있는 선택은 무엇인가? ResultSet으로 무엇을 하기를 원하는 것은 매우 의존적이다. 예를 들어, 만약 JavaBeans 컴포넌트 모델을 위한 JDBC API를 지원하는 ResultSet을 원한다면, java.sql.ResultSet의 하위 인터페이스인 javax.sql.RowSet을 사용해야 한다.

자바 프로그램에서 데이터베이스 접근은 매우 무거운 작업(heavyweight operation)이기 때문에, 메모리에 데이터를 캐싱하는 것은 어플리케이션 성능을 위한 핵심 요소가 된다. 메모리에 캐시되어 있는 데이터의 행을 위한 컨테이너로 ResultSet을 사용하길 원하는 경우, javax.sql.RowSet의 하위 인터페이스인 javax.sql.rowset.CachedRowSet을 사용할 수 있다. 이 인터페이스의 인스턴스는 데이터소스에 항상 연결되지 않고도 작업을 수행할 수 있는 능력을 제공한다. 이 기능에 더해서, 이 인터페이스는 scrollable, updatable, serializable의 기능을 지원한다. 이 기능에 더해서, spreadsheet와 같은 표 형태의 포맷으로 다른 데이터소스와도 작업할 수 있다.

여기서 언급한 모든 기능에 더해서 결과 값을 XML로 빼내고, 결과 값을 유요한 XML(valid XML)로 집어넣는 능력을 까지 모두 사용하길 원한다면, javax.sql.rowset.WebRowSet이 당신의 선택이 될 것이다. 이용 가능하도록 이미 구현된 예로는 JDK 5.0의 내에 제공되는 Sun의 레퍼런스 구현 클래스(Reference implementation class)인 com.sun.rowset.WebRowSetImpl 가 있다.

이 상속 구조의 제일 아래에 있는 javax.sql.rowset.JoinRowSet은 javax.sql.rowset.WebRowSet의 하위 인터페이스로 다중 조인의 방법을 제공할 뿐만 아니라, 마치 테이블 내에서 SQL JOIN이 수행된 것처럼 결과 값 객체를 제공한다.

Simple ResultSet 사용하기

이것을 소개하는 취지는, 간단한 예제를 보여주자는 것이다. 이 글에서 논의되는 모든 예제는 윈도우 XP에 오라클 데이터베이스 버전 10.2와 JDK 5.0을 사용하는 Eclipse 3.1.0을 기반으로 한다. 샘플 코드와 실제 결과 파일을 원한다면 리소스 섹션을 보라.

“student"라 명명한, 약간의 정보를 저장하고 있는 네 개의 컬럼을 갖고 있는 간단한 데이터베이스를 생각해보자. 다음의 테이블은 이미 저장되어 있는 결과를 반환시켜 주는데 사용되는 쿼리를 보여준다.

SQL> select * from student:

ID FNAME LNAME AGE
200 Jack Dakota 21
100 John Doe 26

초보자를 위해서, student 테이블을 포함하고 있는 데이터베이스와 연결해서 그 데이터를 받아오는 자바 클래스를 작성해보자.
public class DatasourceConnector {
 public static void main(String[] args) {
   Connection con =null;
   OracleDataSource ds =null;
   try {
     ds = new OracleDataSource(); 
       ds.setUser("");
       ds.setPassword("");
       ds.setURL(
       "jdbc:oracle:thin:@localhost:1521:");
     } catch (SQLException e) {
       e.printStackTrace();
   }
   try {
     con = ds.getConnection();
     Statement stmt = con.createStatement();
     ResultSet rs = 
       stmt.executeQuery(
         "select * from student ");
     for (int j=0; 
           j
이 예제에 있는 자바 클래스는 커넥션 객체를 생성하고, 초기화하고, 쿼리 스트링을 포함하는 statement를 생성한 다음 결과 값을 받아 온다. 당신이 원하는 설정을 위해서 ‘<...>’ 로 표시되어 있는 내부에는 사용하는 데이터베이스의 사용자 ID, 비밀번호, 스키마 이름을 제공해야 한다. 이 파일을 DatasourceConnector.java로 저장하고, 컴파일하고, 실행했다.
>javac DatasourceConnector.java
>java DatasourceConnector
모든 것이 잘 수행되었고, 다음과 같은 비슷한 실행 결과를 불 것이다 :

ID FNAME LNAME AGE
200 Jack Dakota 21
100 John Doe 26

역자 박찬욱님은 현재 학생으로, 오픈 소스에 많은 관심을 가지고 있습니다. Agile Java Network에서 커뮤니티 활동을 열심히 하고 있고, 블로그(chanwook.tistory.com)를 재미있게 운영하고 있습니다.
TAG :
댓글 입력
자료실

최근 본 상품0