제공 : 한빛 네트워크
저자 : Sharad Acharya
역자 : 박찬욱
원문 : Making the Most of JDBC with WebRowSet
[이전 기사 보기]
WebRowSet으로 최고의 JDBC 만들기(1)
ResultSet 뽑아내기
이제 위의 예제가 데이터베이스에서 받아온 데이터를 XML으로 데이터 이행(conversion)이 필요한 어플리케이션의 일부 프로그램이라는 가정을 가지고 좀 더 심화있게 살펴보자. 이 목적을 위해서 com.sun.rowset.WebRowSetImpl 구현 클래스를 사용할 것이다. 이 행동을 살펴보면서 javax.sql.WebRowSet의 인스턴스를 구축하기 위해서 약간의 코드를 추가하고, 결과 값을 XML 파일로 뽑아낼 것이다. 구현한 내용은 다음과 같다.
... ... ...
ResultSet rs =
stmt.executeQuery("select * from student");
WebRowSet wrs = new WebRowSetImpl();
wrs.populate(rs);
try {
wrs.writeXml(
new FileOutputStream("student.xml"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
... ... ...
wrs.writeXML()를 사용해서 받은 결과로
WebRowSet 스키마 정의(WebRowSet scema definition)에 적합한 XML 문서로 결과 값을 만들 수 있다. 이 파일은 세 가지 부분을 포함하고 있다 : 속성(properties), 메타데이터(metadata), 데이터(data).
< properties>
... ... ...
... ... ...
... ... ...
태그는 격리 레벨(isolation level), RowSet type 등과 같은 동기화 제공자(synchronization provider)의 자세한 정보를 제공한다. 태그는 데이터베이스 테이블에 있는 numbers, name, type 컬럼 등과 같은 정보를 제공한다. 태그는 위의 테이블에 있는 다음과 같은 실제 데이터를 유지한다.
200 < /columnValue>
Jack
Dakota
21
100
John
Doe
26
이 예제에 있는 태그는 어떠한 수정 없이 데이터 소스 내에서 매핑되어 있는 현재 WebRowSet 객체의 각 컬럼의 값을 보여준다. INSERT UPDATE 혹은 DELETE와 같은 데이터 수정 작업은 다음 섹션에서 설명하는 것처럼 XML 결과에 적당하게 표시된다.
ResultSet 다루기(manipulating)
행의 위치를 가리키는 커서를 움직여서 WebRowSet에 있는 deleteRow()메소드를 호출함으로써 특정 행을 삭제할 수 있다. 이와 비슷하게, 행의 위치를 가리키는 커서를 움직여서 수정을 위한 적절한 메소드를 호출함으로써 한 행에 있는 하나 이상의 값을 수정할 수 있다. 다음 코드가 앞서 말 한 두 가지 경우의 예가 되겠다.
... ... ...
ResultSet rs =
stmt.executeQuery("select * from student ");
WebRowSet wrs = new WebRowSetImpl();
wrs.populate(rs);
wrs.absolute(1); //move to first row
wrs.deleteRow(); //delete current row
wrs.absolute(2); //move to second row
wrs.updateInt(4,20);//update current row
... ... ...
위 코드의 처음부터 네 번째 줄까지는 분명하다 : 객체를 초기화 하고, 그 객체에 결과 값을 할당(populate)하고 있다. 다음 두 줄은 첫 번째 행의 삭제를 시도하고 있다. 마지막 두 줄은 두 번째 행의 네 번째 컬럼의 값을 20으로 수정하려 하고 있다. 이 WebRowSet 객체의 출력문은 다음과 같은 엘리먼트를 만들어낸다.
200
Jack
Dakota
21
100
John
Doe
26
20
이 XML은 태그를 통해서 첫 번째 행이 삭제될 것 이라고 표시하여 보여준다. 또한 두 번째 행의 네 번째 행 위치에 있는 값은 현재 26의 값이 20으로 수정될 것이라고 표시되었다.
작업 내용 완료하기(committing the changes)
여태까지는 결과 값을 가지고 수정작업만 했다. 이 변화된 내용은 커밋을 하기 전까지는 아직 실제 데이터베이스에 반영된 것은 아니다. 다음 코드가 만약 성공적으로 수행된다면, 작업들이 완료됨으로써 변화된 내용이 영속적인 변화가 될 것이다.(실제 데이터베이스에 반영될 것이다.)
... ... ...
wrs.acceptChanges();
... ... ...
XML에서 읽어들이기
WebRowSet은 java.io.InputStream이나 java.io.Reader 인스턴스를 사용해 유요한 XML에서 데이터를 읽어 들이기 위한 몇 가지의 readXML() 메소드를 제공하고 있다. 당신은 입력을 원하는 데이터가 다른 작업을 처리하기 전에 실제 데이터베이스에 넣어서 영속성을 얻는 것이 필요한 유효한 XML 형식의 데이터라면 이 옵션을 통해서 많은 도움을 받을 것이다.
이득과 부담(Benefits and Liabilities)
지금까지 WebRowSet의 기본적인 사용법을 보여줬는데, 이제 당신의 데이터에 이 접근방법을 사용할 때의 장점과 단점에 대해서 계산해보겠다.
이득(Benefits)
- 표준적인 스키마(Standard schema)는 특별한 변환 없이 다른 어플리케이션에서 XML 데이터를 생산하고, 사용하는 것이 가능하게 해준다.
- 데이터 조정의 용이성(Ease of data manipulation) : 스크롤링(scrolling), 수정(updating), 캐싱(caching), 오프라인 작업(offline edits)을 제공한다.
- 더 적은 코드를 사용해서 데이터베이스에 XML(혹은 그 반대로)의 쉬운 변환(Easy tranformation)을 가능하게 한다. 더 적은 코드는 더 적은 에러를 의미하며, 좀 더 견고한(robust)한 코드를 의미한다.
- 더 적은 데이터베이스 업데이트(Less database updates)는 동시성 문제(concurrency issues)를 줄이는데 도움이 된다.
부담(Liabilities)
- 성능과 처리율(Performance and throughput)은 속성과 메타데이터와 같은 추가적인 정보에 의해서 좋지 않은 영향을 받는다. 이것은 거대한 XML 파일은 실질적 필요한 더 적은 양의 데이터를 전송하는 네트웍보다 더 많은 전송을 할 수 있는 네트웍이 필요하기 때문에, 분산 어플리케이션에서 좀 더 두드러진 문제가 될 것이다.
- 1.4나 그 이전 버전의 JDK에서는 이용할 수 없는 특징이기 때문에 새로운 버전의 JDK(A new JDK version)은 반드시 필요하다.
적용 가능성(Applicability)
WebRowSet은 다음과 같은 시나리오에 매우 적합하다.
- 현시점에서 최고의 아키텍처 적인 선택 중 하나인, XML 메시징에 의한 어플리케이션 통합. Java EE 어플리케이션은 외부 시스템과의 소통(communicate)을 위해서 JMS 기반의 통합(JMS-based integration)을 사용할 수 있다. 이 시나리오에서, WebRowSet API는 사용해야 하는 코드의 양을 줄여줄 뿐만 아니라 프로그램의 복잡성을 줄여준다.
- 영속성 데이터 소스에 있는 내용을 보여주는 작업은 대부분 결과 값을 반환하고, 결과 값을 만들어낸 (JSP와 같은) 컴포넌트에서 그 결과 값을 받아 탐색하는 작업에 의해 달성된다. 이 접근 방법의 대안으로는 XSLT와 화면에 보여줄 결과물을 만들어내기 전에 결과 값을 XML로 변경하는 방법이 있다. 이 선택은 결과 값을 화면에 보여주는 컴포넌트의 데이터 포맷과 직접적인 연관이 없기 때문에(decouple) 더 나은 유지 보수성(maintainability)을 제공한다.
결론
최근까지 데이터베이스와 XML 사이에 데이터를 변환하는 작업은 어플리케이션 개발과 테스트 자원을 엄청나게 소비하는 거대한 작업이 되었다. 다행히도, JDBC API의 새로운 버전은 결과 값을 통한 정밀한 탐색(precise navigation), 결과 값의 캐싱, XML 결과 값 기록하기 등과 같은 특징을 제공한다. 기업용 어플리케이션을 만드는 개발자에게 있어서 RDBMS의 중요성과 Java와 XML 어플리케이션의 현재, 그리고 앞으로도 지속적으로 성장할 것이라는 평판을 보면, WebRowSet과 같은 인터페이스에 의해서 제공되는 특징들은 매우 유용하게 사용될 것이다. 그렇기 때문에, 여전히 당신이 데이터 저장소로 RDBMS를 사용하는 다음 Java/XML 어플리케이션에 전통적인 데이터 접근 방법을 사용할 계획이었다면, 이번 글이 다시 그 결정을 고려해볼 수 있는 시간이 되었을 것이다. WebRowSet은 진정한 향상(real improvement)를 제공할 것이다.
리소스
역자 박찬욱님은 현재 학생으로, 오픈 소스에 많은 관심을 가지고 있습니다. Agile Java Network에서 커뮤니티 활동을 열심히 하고 있고, 블로그(chanwook.tistory.com)를 재미있게 운영하고 있습니다.