메인 컨텐츠로 가기

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

다중 티어에서 XML 프로그래밍 하기, Part 2: XML 데이터베이스 서버를 활용하는 효과적인 Java EE 애플리케이션 작성

JDBC 4.0, SQLXML, WebSphere XML Feature Pack 및 DB2 pureXML을 사용하여 완전한 XML 솔루션을 최적화한다.

Andrew Spyker, Senior Software Engineer, IBM
Andrew Spyker is a team lead of the WebSphere Application Server Performance and Benchmarking organization within the WebSphere development organization. His current focus area is on programming models including J2EE and SDO, web services including WS-Security and other evolving web services standards, and how these areas fit into a service-oriented architecture. Given this SOA focus, he also works to understand key areas of performance as it relates to all WebSphere products including, but not limited to, WebSphere Business Integration Server and WebSphere Portal Server. His performance work includes enabling more performant and scalable application server features and helping customers architect their current and future applications for best performance. Andrew has two and a half years of performance experience and over seven years of Java programming experience. He received his BS in Computer Engineer from Pennsylvania State University.
Cynthia M. Saracco, Senior Software Engineer, IBM
photo: Cynthia Saracco
Cynthia M. Saracco works on database management and XML technologies at IBM's Silicon Valley Lab. She has co-authored three books and taught university-level courses on various software technologies.
(An IBM developerWorks Professional Author)
Bert Van Der Linden, DB2 pureXML Architect, IBM
Bert joined IBM in 2001 to work on the XML project in DB2 as one of the early architects. Bert came to IBM from a startup company, Propel, where he led the design and implementation of the distributed and fault-tolerant middleware, which hosted a scalable e-commerce application. Before that, Bert worked for many years at Tandem Computers on the NonStop SQL, a database that runs many critical applications in the financial industry.

요약:  이 시리즈 기사의 Part 1에서는 애플리케이션 서버와 데이터베이스 서버 티어 전체에서 일시적인 XML 데이터와 지속적인 XML 데이터를 처리하기 위한 선언적 프로그래밍 방식을 소개했습니다. 이 기사에서는 서버측 Java™ 애플리케이션에서 일시적인 XML 데이터와 지속적인 XML 데이터를 처리하는 방법을 더욱 자세하게 살펴봅니다. 실용적 예제와 샘플 코드를 사용하는 과정을 통해 XML 데이터베이스에서 XML 인덱싱과 쿼리 필터링 기능을 사용하여 대용량 XML 데이터를 처리하는 방법을 확인할 수 있습니다. 또한, 일시적인 XML 데이터와 지속적인 XML 데이터를 결합하는 방법을 검토합니다.

이 연재 자세히 보기

원문 게재일:  2010 년 10 월 11 일 (출판일: 2010 년 10 월 05 일) 번역 게재일:   2011 년 1 월 25 일
난이도:  중급 원문:  보기 PDF:  A4 and Letter (386KB | 25 pages)Get Adobe® Reader®
페이지뷰:  3231 회
의견:  


2010년 10월 11일 - 다운로드 섹션에 fpmldb2was.zip 추가

개요

XML이 널리 사용되면서 일시적인 XML 메시지와 지속적인 XML 데이터를 효과적으로 처리하는 방법을 프로그래머가 찾게 되었다. 웹 서비스와 기타 소프트웨어 컴포넌트에서 중요한 비즈니스 데이터가 포함된 일시적인 XML 메시지가 생성되는 경우가 많아졌다. 이에 따라 애플리케이션에서 이러한 메시지뿐만 아니라 원시 XML 데이터베이스 관리 시스템에 저장된 지속적인 비즈니스 아티팩트를 처리해야 할 필요성이 증가하게 되었다.

자주 사용하는 약어

  • API: Application Program Interface
  • BLOB: Binary large object
  • CLOB: Character large object
  • DBMS: Database Management System
  • DOM: Document Object Model
  • JDBC: Java Database Connectivity
  • OEM: Original equipment manufacturer
  • SAX: Simple API for XML
  • SOA: Service-oriented architecture
  • SQL: Structured Query Language
  • URI: Uniform Resource Identifier
  • URL: Uniform Resource Locator
  • W3C: World Wide Web Consortium
  • XHTML: Extensible Hypertext Markup Language
  • XML: Extensible Markup Language
  • XSLT: Extensible Stylesheet Language Transformations

일시적인 XML 데이터와 지속적인 XML 데이터를 Java 오브젝트에 맵핑하는 것은 분명 가능하지만 중첩이 많은 복잡한 XML 구조의 경우에는 이렇게 하기가 어렵다. 게다가 시간이 지나면서 XML 데이터 스키마가 변경될 가능성이 있는 경우에는 이로 인해 애플리케이션 코드가 더 복잡해질 수 있다. 이 시리즈의 첫 번째 기사에서는 애플리케이션 서버와 데이터베이스 서버 티어 전체에서 일시적인 XML 데이터와 지속적인 XML 데이터를 처리하여 필수적인 프로그래밍 방식과 관련된 복잡도를 줄이는 선언적 프로그래밍 방식을 소개했다.

이 기사에서는 서버측 Java 애플리케이션에서 일시적인 XML 데이터와 지속적인 XML 데이터를 처리하는 주제를 더욱 자세하게 살펴본다. 일반적인 애플리케이션 개발 태스크와 샘플 코드를 검토하는 과정을 통해 다음과 같은 내용을 확인한다.

  1. 일시적인 XML 데이터와 지속적인 XML 데이터를 효과적으로 통합해야 하는 Java EE 애플리케이션에서 원시 XML 데이터베이스 서버 기술을 활용하는 방법을 확인한다.
  2. 데이터베이스 관리 시스템에서 XML 인덱싱 및 쿼리 필터링 기능을 활용하여 강력한 런타임 성능을 보장하는 방법을 배운다.
  3. 일시적인 XML 데이터와 지속적인 XML 데이터를 결합하는 방법과 지속적 XML 문서의 특정 부분을 업데이트하는 방법을 검토한다.

선수조건 및 제품

이 기사를 읽으려면 XML과 XPath, XQuery에 익숙해야 한다. 이러한 기술에 관한 정보는 참고자료를 참조한다. 또한, 이 기사에 있는 예제는 WebSphere Application Server V7.0 Feature Pack for XML 1.0을 기반으로 하므로 이 기사 시리즈의 Part 1을 읽어야 한다. 또한, XML 데이터베이스 관리 기술을 알고 있으면 유용하다. 이 기사의 예제에서는 XML 데이터베이스 서버로 DB2®를 사용한다.

애플리케이션 환경 및 샘플 데이터베이스

서버측 Java 프로그래머가 일시적인 XML 데이터와 지속적인 XML 데이터를 효과적으로 처리할 수 있는 방법을 탐구하려면 하나의 Windows® 시스템에 다음과 같은 소프트웨어를 설치해야 한다.

  • WebSphere Application Server 7.0 테스트 환경을 사용하는 Rational Application Developer for WebSphere Software V7.5.5
  • Fix Pack 1.0.0.7로 업그레이드된 WebSphere Application Server Feature Pack for XML 1.0 (이 도구는 Rational Application Developer로 빌드된 WebSphere 테스트 환경과 WebSphere Application Server 독립형 버전에서 사용할 수 있다.)
  • DB2 9.7 Enterprise Server Edition

Rational Application Developer 개발 프로젝트의 빌드 경로에는 DB2 JDBC 4.0 드라이버에 맞는 .jar 파일이 포함되어 있다. 이 파일은 db2jcc4.jardb2_license_cu.jar이다. 프로젝트 내에서 XML Feature Pack을 사용하려면 해당 프로젝트를 마우스 오른쪽 단추로 클릭하고 Project Facets를 선택하여 해당 패싯을 사용 가능하게 함으로써 프로젝트에서 XML Transformation과 Query Project Facet을 사용 가능하게 해야 한다. 또한, 빌드 경로에 XML Feature Pack 씬 클라이언트 jar 파일(com.ibm.xml.thinclient_1.0.0.jar)을 추가할 수 있다. DB2 JDBC 4.0 드라이버에 대한 세부사항은 참고자료를 참조한다.

이 예제를 위한 데이터베이스에는 국제파생상품협회(ISDA)에서 제공하는 샘플 XML 데이터에 기초한 OTC(Over-The-Counter) 파생 거래의 레코드가 포함되어 있다. 이 데이터는 파생 상품을 거래하는 많은 기업에서 주로 사용하는 FpML(Financial Products Markup Language) 스펙을 준수한다.

DB2에는 다운로드 가능하고 특정 산업에 적합한 무료 소프트웨어가 많으며, 이러한 소프트웨어는 산업 표준 XML 형식을 준수하는 테스트 데이터베이스를 신속하게 작성하고 채울 수 있게 도와준다. 이러한 번들 가운데 하나에서 FpML을 사용할 수 있다. 이 기사의 특정 부분을 설명하는 데 도움이 되도록 이 번들을 사용자 정의했으며 이 번들은 다운로드 섹션에 있는 링크를 사용하여 다운로드할 수 있다. Windows 시스템에 샘플 데이터베이스를 설치할 경우에는 DB2 명령창을 열어서 start.bat를 실행한다. 이렇게 하면 필수 데이터베이스 오브젝트가 작성되고 샘플 FpML 데이터가 로드된다.

예제에서는 FPMLADMIN.FPML43 테이블을 사용하며, 이 테이블에는 두 개의 관계형 컬럼(ID와 COMMENT)과 한 개의 XML 컬럼(DOCUMENT)이 포함되어 있다. XML 컬럼에는 다양한 유형의 파생 상품 거래를 위한 FpML 레코드가 저장된다. 기업에서는 일반적으로 관계형 데이터와 XML 데이터를 모두 하나의 테이블에 저장하며 예제에서는 이러한 두 가지 유형의 컬럼을 참조한다. 그림 1에는 이 테이블의 구조가 표시되어 있다.


그림 1. 두 개의 관계형 컬럼(ID와 COMMENT)과 한 개의 XML 컬럼(DOCUMENT)이 있는 FPMLADMIN.FPML43 테이블
ID로 표시된 두 개의 항목과 간단한 설명 및 FpML 문서가 있는 샘플 FPMLADMIN.FPML43 테이블

FpML 레코드에는 표시된 거래 유형에 따라 변하는 요소와 속성으로 구성된 중첩이 많은 구조가 포함되어 있다. 그림 2에는 신용 디폴트 스왑 거래를 위한 샘플 FpML 레코드 일부가 표시되어 있다.


그림 2. 신용 디폴트 스왑 거래를 위한 FpML 레코드 일부
신용 디폴트 스왑 거래를 위한 FpML 레코드 일부의 화면 캡처

샘플 테이블에는 크기가 2KB에서 126KB에 이르는 FpML 문서가 포함되어 있다. 게다가 이 테이블에서는 세 가지 다른 FpML 스키마 버전을 기반으로 하는 거래 문서가 동일한 XML 컬럼에 저장된다. (특히, FpML 4.2, 4.3 및 4.7 기반의 거래 문서가 저장된다.) XML 스키마는 시간이 지나면서 발전하는 과정에서 변화하는 비즈니스 요구를 수용하는 경향이 있으므로 하나의 XML 컬럼에 다양한 스키마를 준수하는 문서를 저장하는 것이 일반적인 비즈니스 요구사항이다.


지속적 XML 데이터 쿼리하기

Java EE 프로그래머는 데이터베이스 티어에 저장된 지속적 XML 데이터를 검색하여 애플리케이션 서버 티어에서 이 데이터를 처리해야 하는 경우가 자주 있다. 이 과정을 설명하기 위해 여기에서는 XML 데이터를 쿼리하기 위한 내장 DB2 지원과 XML Feature Pack API를 활용하는 예제를 사용한다. 이러한 두 오퍼링은 XQuery와 XPath 표현식을 포함하여, XML 데이터를 쿼리하는 데 필요한 산업 표준을 지원한다.

DB2는 XML 데이터를 first-class 데이터 유형으로 인식하고 지원하기 때문에 프로그래머는 XML 데이터를 LOB(Large Object)로 처리하지 않고 직접 기본 형식으로 처리할 수 있다. 다중 소프트웨어 티어 전체에서 XML을 사용하면 프로그래밍 논리가 간단해지고 개발 비용이 줄어든다. 더욱이 DB2에서 원시 XML을 지원하면서 문서의 특정 부분(XML 노드)에 효과적으로 액세스할 수 있게 되었다.

쿼리 시나리오

Java EE 애플리케이션이 특정 거래의 신용 디폴트 스왑 데이터를 액세스해야 하는 상황을 생각해 보자. 거래 데이터를 일시적 XML 메시지로 애플리케이션에 전달하는 경우에는 애플리케이션이 XML Feature Pack에서 제공한 서비스를 사용하여 해당 메시지를 대상으로 XPath 표현식을 실행할 수 있을 뿐이다. Listing 1에서는 이러한 XPath 표현식을 정의한다.


Listing 1. XML Feature Pack API를 사용하여 일시적 XML 처리하기

// This XPath expression obtains the credit default swap data for a given trade.  
// For simplicity, we omitted declaring a specific namespace here.
  
String myXpath = "*:FpML/*:trade/*:creditDefaultSwap;
. . . 


모든 애플리케이션이 일시적 XML 메시지에 의존하는 것은 아니다. 법인의 거래 포트폴리오를 처리하여 투자 전략 분석이나 위험 관리, 기타 비즈니스 기능을 수행하도록 설계된 애플리케이션은 지속적 XML 저장소에서 원하는 거래 데이터를 얻어야 할 수도 있다.

지속적 XML 거래 데이터 단편을 리턴하는 샘플 쿼리

Listing 2에는 XPath 표현식을 사용하여 DB2 데이터베이스에서 관심 있는 회사가 참여하는 관련된 신용 디폴트 스왑 거래 데이터를 얻는 방법이 표시되어 있다.


Listing 2. 관계형 및 XML 조건부가 있는 SQL/XML 쿼리

SELECT XMLQUERY('declare default element namespace 
   "http://www.fpml.org/2009/FpML-4-7";
   $fpml/FpML/trade/creditDefaultSwap' passing document as "fpml")
FROM fpmladmin.fpml43 
WHERE comment LIKE ‘cd%’ 
AND 
XMLEXISTS('declare default element namespace "http://www.fpml.org/2009/FpML-4-7";
   $fpml/FpML/trade/creditDefaultSwap/generalTerms/referenceInformation
   /referenceEntity[entityName="Agrium Inc."]' passing document as "fpml")

 

이 쿼리는 특정 XML을 처리하는 두 개의 함수를 호출하는 표준 SQL 명령문이며 DB2 명령행 인터페이스나 그래픽 쿼리 도구를 사용하여 대화식으로 실행할 수 있다. 첫 번째 XMLQUERY() 함수는 리턴할 데이터(creditDefaultSwap 노드의 데이터)를 식별한다. 두 번째 XMLEXISTS() 함수는 해당 결과를 특정 엔티티(Agrium Inc.)를 참조하는 FpML 4.7 문서로 제한한다.

대부분의 SQL 명령문과 마찬가지로 이 예제는 SELECT column(s) . . . FROM table(s) . . . WHERE condition(s) 표준 SQL 구문을 따른다. 이 쿼리를 자세히 살펴본 다음, XML Feature Pack을 사용하는 애플리케이션에서 이 쿼리를 호출하는 방법을 확인할 수 있는 Java 코딩 예제를 검토하도록 하자.

이 쿼리의 첫 번째 행에서는 산업 표준 SQL 함수(XMLQUERY)를 호출하는 SQL SELECT문을 실행한다. XMLQUERY() 함수를 호출하는 경우에는 먼저, 관심 대상의 네임스페이스(http://www.fpml.org/2009/FpML-4-7)를 선언한다. 앞서 살펴본 바와 같이 샘플 DB2 테이블에는 하나의 컬럼에 다양한 버전의 FpML 레코드가 포함되어 있다. 그리고 이 기사에서는 특정 FpML 4.7 레코드만 처리한다.

XMLQuery 함수에 기본 네임스페이스를 선언한 후에는 검색할 데이터를 지정하는 XPath 표현식($fpml/FpML/trade/creditDefaultSwap)을 제공한다. XPath 표현식 다음에 있는 passing절은 $fpml 변수가 해당 테이블의 DOCUMENT 컬럼을 나타내도록 지정한다. 따라서 Listing 2의 첫 번째 줄은 DOCUMENT 컬럼에 저장된 FpML 4.7 거래 데이터의 서브세트만 검색한다는 것을 나타낸다. 특히, 신용 디폴트 스왑 데이터만 검색하며 이 데이터는 FpML을 통해 다수의 하위 노드가 포함된 XML 노드로 표현된다(그림 2 참조). SQL FROM절은 FPMLADMIN.FPML43을 관심 테이블로 식별한다.

SQL WHERE절은 신용 디폴트 거래와 관련된 결과만을 표시한다는 점을 나타낸다. 샘플 테이블의 COMMENT 컬럼(관계형 컬럼) 값을 사용하여 DOCUMENT 컬럼(XML 컬럼)에 기록된 거래 유형을 분리할 수 있다. cd로 시작하는 COMMENT 값은 신용 디폴트 거래를 나타낸다.

나머지 행에서는 산업 표준 XMLEXISTS() 함수를 호출하며, 이 함수는 특정 법인체(Agrium Inc)와 관련된 스왑으로 쿼리 결과를 제한한다. XMLEXISTS 함수를 더욱 자세하게 살펴보면 이 함수에서 적절한 네임스페이스를 선언하며 데이터베이스 서버에서 해당 테이블의 DOCUMENT 컬럼에 있는 데이터를 대상으로 실행하는 XPath 표현식이 이 함수에 포함되어 있다는 사실을 알 수 있다.

런타임 성능을 좋게 하기 위해 Java EE 프로그래머는 가능한 선택적으로 쿼리하도록 코딩한다. 샘플 쿼리는 XML 데이터 중에서 필요한 부분만 검색하며, 특히, XMLQUERY 함수는 거래 문서의 특정 XML 노드만 얻는다. 또한, 샘플 쿼리는 WHERE절에서 관계형 및 XML 조건부를 지정하여 관심 있는 행으로 제한한다. 이러한 방식으로 쿼리를 작성하면 데이터베이스와 애플리케이션 서버 티어 간에 전송되는 데이터 양이 최소화된다. (예제에서는 DB2에 저장된 하나의 XML 거래 레코드의 서브세트를 검색하지만 모든 신용 디폴트 스왑 거래와 관련된 일반적인 쿼리는 40개의 완전한 거래 레코드를 리턴한다.) 마지막으로, DB2에서 적절한 XML 인덱스를 정의하면 런타임 쿼리 성능을 개선할 수 있다. 이 부분은 나중에 간단히 살펴보게 된다.

쿼리 시나리오를 위한 샘플 Java EE 코드

이 데이터베이스 쿼리를 Java EE 애플리케이션에 삽입하기는 어렵지 않다. 데이터베이스에서 원하는 XML 데이터를 검색하여 애플리케이션에서 이 데이터를 처리하는 예제를 살펴보도록 하자.

Listing 3에는 적절한 XML Feature Pack 콜렉션 분석기가 실행할 데이터베이스 쿼리를 정의하는 서블릿에서 발췌한 코드가 표시되어 있다.


Listing 3. 메모리로 읽는 DB2 pureXML® 데이터에 XQuery 프로그램을 적용하는 Java EE 애플리케이션

// Excerpt from our sample servlet. 
//  
// First, the servlet sets up the database query. 
// Here, a String named "getCreditDefaultSwapsByEntityName" will be mapped to our query, 
// which extracts the creditDefaultSwap node from qualifying trades.

dbStatements = new HashMap<String, String>();
dbStatements.put("getCreditDefaultSwapsByEntityName",
 "select " +
   "xmlquery("'declare default element namespace " + 
     "\"http://www.fpml.org/2009/FpML-4-7\"; " + 
     "$DOCUMENT/FpML/trade/creditDefaultSwap' ) " +
  "from fpmladmin.fpml43 " + 
  "where comment like ? and " +
  "xmlexists("'declare default element namespace " + 
    "\"http://www.fpml.org/2009/FpML-4-7\"; " +
    "$fpml/FpML/trade/creditDefaultSwap/generalTerms/" + 
    "referenceInformation/referenceEntity[entityName=$name]' " +
    "passing document as \"fpml\", " +
    "cast (? as varchar(100)) as \"name\")"
);
...

// Next, another method in this servlet creates the XQuery executable.     
// This method then uses our JDBC resolver to execute it, 
// providing an appropriate value for the entityName variable. 

Source source = 
   new Source(FpMLServlet.class.getResource("/getCreditDefaultSwaps.xq").toString());
XQueryExecutable getCreditDefaultSwapsXQ = factory.prepareXQuery(source, staticContext);
...
JDBCCollectionResolver inputResolver =
  new JDBCCollectionResolver(getConnection(), dbStatements);
dynamicContext.setCollectionResolver(inputResolver);
dynamicContext.bind(new QName("http://com.ibm.xml.samples",entityName"), name);
XSequenceCursor output = getCreditDefaultSwapsXQ.execute(dynamicContext); 


Listing 3의 첫 번째 파트에 있는 쿼리는 Listing 2에 있는 대화식 버전과 거의 동일하며 차이점은 다음과 같다.

  • 매개변수 표시문자, 물음표(?)로 표시되어 있으며 하드 코딩된 조건부 값을 바꿔서 유연성을 높인다.
  • 큰따옴표는 적절하게 이스케이프 처리된다.

이 애플리케이션은 적절하게 정의된 이름 지정 쿼리를 사용하여 쿼리를 실행하고 비즈니스 논리를 리턴된 결과에 적용한다. 단순하게 하기 위해 이 예제의 비즈니스 로직에서는 적격 거래와 관련된 다른 회사채 정보와 채권 표면 이자율만을 얻는다. 프로덕션 애플리케이션에는 더욱 복잡한 비즈니스 논리가 포함된다.

Listing 3에 있는 코드의 두 번째 부분에는 데이터베이스 서버에서 적절한 XML 데이터를 가져와서 애플리케이션 서버에서 이 데이터를 처리하는 논리가 포함되어 있다. 이러한 코딩 패턴은 이 기사 시리즈의 Part 1에서 예제로 소개한 것과 같은 방식을 따른다(참고자료 참조). 먼저, 이 애플리케이션은 DB2에서 리턴한 XML 거래 레코드의 일부를 대상으로 XML Feature Pack이 실행할 XQuery 실행 가능 오브젝트를 작성한다. 그런 다음에는 절절한 콜렉션 분석기를 지정한다. 이 분석기는 DB2 데이터베이스에 연결하여 쿼리를 실행하고 해당 쿼리의 매개변수 표시문자에 적합한 데이터 값(해당 거래에서 참조한 엔티티의 이름)을 전달한다.

이 분석기를 구현하는 과정은 이 기사 시리즈 Part 1의 Listing 8에서 설명한 분석기 구현 과정과 동일하므로 여기에서는 자세하게 검토하지 않는다. 이 분석기는 jdbc:// URI 스킴으로 시작하는 콜렉션과 함께 작동한다. 또한, 이름 지정 쿼리를 사용하여 나머지 URI를 분석하고 해당 논리를 실행한다. 이 기사에서 논의한 나머지 샘플 코드와 마찬가지로 이 분석기 또한, 다운로드가 가능하다. 해당 링크는 다운로드 섹션을 참고한다.

여기에서 사용한 분석기 설계는 XML Feature Pack과 함께 제공되는 예제를 기반으로 하며 DB2 pureXML과 같은 원시 XML 데이터베이스에 액세스할 수 있는 한 가지 방법에 불과하다. 이 코드를 프로덕션 애플리케이션에서 사용할 경우에는 필요에 따라 샘플을 수정하거나 확장해야 한다. 또한, 이 기사 시리즈의 Part 1에서는 기타 가능한 분석기 설계 방식을 간략하게 논의한다. 예제는 해당 기사의 Listing 14를 참조한다(참고자료 참조).

데이터베이스에서 적절한 신용 디폴트 스왑 데이터가 검색되면, 애플리케이션은 원하는 대로 데이터를 추가로 처리할 수 있다. Listing 4에는 애플리케이션 서버에서 실행하고 데이터베이스에서 리턴된 각 거래에서 참조하는 회사채의 만기일과 채권 표면 이자율 및 금융 상품 ID를 추출하는 XQuery 함수가 표시되어 있다.


Listing 4. 거래에서 채권 정보를 얻는 XML Feature Pack XQuery 프로그램으로 getCreditDefaultSwaps.xq에서 발췌

declare variable $my:entityName as xs:string external;

declare variable $databaseURI := 
   concat('jdbc://getCreditDefaultSwapsByEntityName?cd%&', $my:entityName); 
declare variable $creditDefaultSwaps := collection($databaseURI);

for $bond in $creditDefaultSwaps//fpml:bond
     return
<tr>
     <td>{ $bond/fpml:instrumentId }</td>
     <td>{ $bond/fpml:couponRate }</td>
     <td>{ $bond/fpml:maturity }</td>
</tr>
 

인덱스를 작성하여 런타임 성능 개선하기

이제까지 데이터베이스에서 적절한 XML 데이터를 검색하여 중간 티어에서 이 데이터를 처리하기 위해 수행한 비즈니스 논리를 살펴보았으므로 이제, 또 다른 주제인 성능에 대해 살펴보도록 하자. 데이터베이스 티어에서 쿼리가 효과적으로 실행되는지 확인하기 위해 FPMADMIN.FPML43 테이블에 다음과 같은 두 개의 인덱스를 작성한다.

  • FPMLADMIN.COMMENTX, 관계형 COMMENT 컬럼을 색인화한다.
  • FPMLADMIN.ENTITYNAME, XML DOCUMENT 컬럼에 있는 특정 노드를 색인화한다.

바로 알 수 있듯이 DB2에서는 이러한 인덱스를 모두 사용하여 쿼리에 필요한 효과적인 액세스 결로를 생성한다. Listing 5에는 이러한 인덱스를 작성하는 방법이 표시되어 있다. 첫 번째 명령문은 관계형 인덱스를 정의하며 두 번째 명령문은 XML 인덱스를 정의한다.


Listing 5. 관계형 인덱스 및 XML 인덱스 작성하기

create index fpmladmin.commentx on fpmladmin.fpml43(comment)

create index fpmladmin.entityname on fpmadmin.fpml43(document) 
generate key using xmlpattern  
  'declare default element namespace "http://www.fpml.org/2009/FpML-4-7"; 
  /FpML/trade/creditDefaultSwap/generalTerms/referenceInformation
       /referenceEntity/entityName' 
as sql varchar(1000) 

샘플 데이터베이스의 FPMLADMIN.FPML43 테이블의 크기는 4MB이고 거의 900개의 행이 포함되어 있기 때문에 여기에서는 이러한 인덱스를 작성했다. 이름 지정 엔티티와 마찬가지로 대상 회사(Agrium Inc.)와 관계가 있는 신용 디폴트 스왑과 관련된 데이터의 용량은 작다. DB2에서는 관계형 인덱스와 XML 인덱스를 사용하여 관심 데이터를 신속하고 정확하게 검색할 수 있으며 이렇게 하면 해당 테이블에 있는 모든 행을 스캔하지 않아도 되기 때문에 불필요한 손실을 피할 수 있다.

그림 3에는 DB2에 내장된 RUNSTATS 기능을 사용하여 적절한 통계 데이터를 수집한 후에 쿼리를 수행하기 위해 DB2에서 선택한 액세스 계획이 표시되어 있다. 이 시리즈 기사를 처음부터 읽었으면 샘플 애플리케이션에서 요청한 데이터를 DB2에서 이러한 두 가지 인덱스를 사용하여 신속하게 검색했다는 사실을 알았을 것이다.


그림 3. 관계형 및 XML 인덱스를 사용하여 효과적으로 데이터를 액세스하는 DB2
FPMLADMIN.COMMENTX와 FPMLADMIN.ENTITYNAME 인덱스를 사용하는 DB2의 화면 캡처

DB2 데이터 액세스 계획을 보고 해석하는 방법에 관한 자세한 정보는 참고자료를 참조한다.


일시적 XML 데이터와 지속적 XML 데이터 쿼리하기

또한, XML Feature Pack을 이용하면 아마도 웹 서비스나 Java 애플리케이션에서 생성한 일시적 XML 데이터를 지속적 XML 데이터와 결합하는 XQuery 표현식을 작성할 수 있다. 예상하는 바와 같이 다양한 방식으로 이러한 작업을 수행할 수 있다. 여기에서는 그중 한 가지 방법을 살펴보도록 하자.

결합 시나리오

파생 상품 투자를 분석해야 하는 애플리케이션을 생각해 보자. 이러한 애플리케이션은 신용 디폴트 스왑 거래와 관련된 기업에 관한 현재의 마켓 데이터를 얻어야 하는 특성이 있다. 이러한 마켓 데이터와 관련된 간단한 예제에는 현재의 주가 정보가 포함되어 있다. 파생 상품 거래 레코드를 DB2에 저장했으며 웹 서비스를 통해 주식 정보를 얻을 수 있다고 가정하면, 애플리케이션에서는 지속적 XML 데이터와 일시적 XML 데이터를 결합해야 한다.

결합 시나리오에 필요한 샘플 Java EE 코드

Listing 6에는 XML Feature Pack을 사용하여 필수 작업을 수행하는 한 가지 방법이 표시되어 있다. 여기에서는 Listing 3에 있는 것과 같은 쿼리를 사용하여 DB2에서 신용 디폴트 스왑을 얻으므로 이러한 과정을 다시 반복하지 않는다. 또한, 이전 시나리오에서 수행한 것과 같이 적절한 분석기를 사용하여 쿼리를 실행한다.

Listing 6에서는 다양한 XQuery 실행 파일 특히, XML Feature Pack에서 결합을 처리하는 XQuery 함수를 새로 정의하였다. 이외에도 Listing 6에서는 StreamSource 오브젝트를 작성하여 DB2에 저장된 해당 거래 데이터와 결합될 일시적 XML 데이터를 표현한다. 단순하게 하기 위해 포트폴리오 분석에 유용한 일시적 마켓 데이터를 표현하기 위해 사용하는 StreamSourceassets.xml 파일에 있는 데이터로 채웠다. (그러나 프로덕션 애플리케이션에서는 웹 서비스나 메시지 큐에서 이 XML 데이터를 얻게 될 가능성이 높다.)


Listing 6. 일시적 XML 데이터와 지속적 XML 데이터를 결합하는 Java EE 애플리케이션

// Create the XQuery executable.   
Source source = 
    new Source(FpMLServlet.class.getResource("/joinCreditDefaultSwap.xq").toString());
XQueryExecutable joinCreditDefaultSwapsXQ = factory.prepareXQuery(source, staticContext);
...

// Declare the resolver and execute the join. 
// The resolver will issue the DB2 query, and WebSphere software will join its output 
// with XML data in the StreamSource object. 
JDBCCollectionResolver inputResolver = 
    new JDBCCollectionResolver(getConnection(), dbStatements);
dynamicContext.setCollectionResolver(inputResolver);
StreamSource source = 
    new StreamSource(FpMLServlet.class.getResourceAsStream("/assets.xml"));
dynamicContext.bind(new QName("http://com.ibm.xml.samples", "entityName"), name);
XSequenceCursor output = joinCreditDefaultSwapsXQ.execute(source, dynamicContext);

Listing 7에는 assets.xml 파일의 내용이 표시되어 있다.


Listing 7. 예제의 일시적 XML 데이터를 표현하는 assets.xml 파일의 내용


<?xml version="1.0" encoding="UTF-8"?>
<assets>
     <equity>
          <symbol>AGU</symbol>
          <name>Agrium Inc.</name>
          <currency>USD</currency>
          <high>64.06</high>
          <low>62.79</low>
     </equity>
     <equity>
          <symbol>STM-FP</symbol>
          <name>STMicroelectronics N.V.</name>
          <currency>EUR</currency>
          <high>6.92</high>
          <low>7.2</low>
     </equity>
</assets>

Listing 8에는 일시적 XML 데이터와 지속적 XML 데이터를 결합하는 XQuery 함수가 포함되어 있다.


Listing 8. 결합을 수행하는 XML Feature Pack XQuery 프로그램으로 "joinCreditDefaultSwaps.xq"에서 발췌

declare variable $my:entityName as xs:string external;

declare variable $databaseURI := 
    concat('jdbc://getCreditDefaultSwapsByEntityName?cd%&', $my:entityName); 
declare variable $creditDefaultSwaps := collection($databaseURI);

declare function local:equityRows($root) {
     for $equity in $root//equity
     let $referenceEntity := $creditDefaultSwaps//fpml:referenceEntity
     where $equity/name = $referenceEntity/fpml:entityName
     return
          <tr xmlns="http://www.w3.org/1999/xhtml">
               <td>{ $equity/*:symbol/text() }</td>
               <td>{ $equity/*:name/text() }</td>
               <td>{ $equity/*:high/text() }</td>
               <td>{ $equity/*:currency/text() }</td>
          </tr>
};

<table border="1">
<tr>
     <th>Ticker Symbol</th>
     <th>Company Name</th>
     <th>High</th>
     <th>Currency</th>
</tr>
{ local:equityRows(/) }
</table>

이 함수의 FOR절에서는 일시적 XML 데이터에 포함된 엔티티 노드를 루프로 처리한다. LET절에서는 참조된 엔티티 정보를 Listing 6에서 정의한 이름 지정 쿼리를 실행한 후에 DB2에서 리턴하는 신용 디폴트 스왑 데이터의 콜렉션에서 추출한다. WHERE절에서는 자산 이름을 기반으로 일시적 XML 데이터와 지속적 XML 데이터를 결합한다. 이 함수는 DB2에서 리턴한 신용 디폴트 스왑과 관련된 모든 기업의 주식 기호, 회사 이름 및 주가 관련 정보를 XHTML로 리턴한다.

일시적 XML 데이터와 지속적 XML 데이터를 결합하는 경우에는 결합이 이루어져야 하는 위치를 고려해야 한다. 하나의 소프트웨어 티어에 다른 소프트웨어 티어에 있는 소용량 데이터와 결합해야 하는 대용량 데이터가 있는 경우에는 일반적으로 대용량 데이터가 있는 티어에서 결합을 수행하는 것이 가장 효율적이다.


지속적 XML 데이터 업데이트하기

또한, XML 기반 Java EE 애플리케이션에서는 일반적으로 지속적 XML 데이터를 업데이트해야 한다. 이 기사의 Part 1에는 지속적 XML 문서를 메모리에 있는 다른 문서로 바꾸는 방법을 확인할 수 있는 코드 샘플이 포함되어 있다. 어떤 경우에는 전체 문서 업데이트가 특히 유용하다. 그러나 대부분의 애플리케이션에서는 XML 문서 중 일부만 업데이트해야 한다. 이렇게 하는 방법을 살펴보도록 하자.

DB2는 XQuery의 표준화된 확장인 XQuery Update Facility를 지원하며 프로그래머는 이 기능을 이용하여 다양한 방식으로 특정 XML 노드를 업데이트할 수 있다. 예를 들면, 새 노드를 추가하거나 노드를 삭제할 수 있으며 요소나 속성의 값을 업데이트하고 다른 업데이트 유형을 작성할 수 있다. 하위 문서 업데이트를 이용하면 런타임 성능을 개선할 수 있다. 프로그래머는 단순히 XML 문서의 해당 부분에서 처리할 변경사항을 지정하면 된다. DB2는 이러한 업데이트를 서버에서 직접 수행하여 애플리케이션 프로그래밍 논리와 이렇게 하지 않았으면 일어나야 할 데이터의 전송을 최소화한다. 이와는 대조적으로 CLOB나 BLOB에 의존하여 XML을 관리하는 DBMS에서는 애플리케이션이 데이터베이스에서 XML 문서를 검색하고 구문 분석하여 필요에 따라 업데이트한 다음, 이 문서를 다시 데이터베이스에 쓴다. 대용량 XML 문서 중 일부만 변경해야 하는 경우에는 이러한 방식을 수행하는 데 따른 성능상의 문제점을 고려해야 한다.

업데이트 시나리오

애플리케이션이 XML 노드의 값을 변경해야 하는 경우를 생각해 보자. 예를 들면, 신용 디폴트 스왑 거래에 참여하는 두 당사자가 FpML 거래 레코드에서 노드로 표현된 예정된 거래 만료일 관련 조항을 협상할 수도 있다. 개발자는 데이터베이스에 저장된 FpML 거래 레코드를 업데이트하여 이러한 새 조항을 반영해야 하며 이 조항은 일시적 XML 메시지로서 Java EE 애플리케이션에 전달될 수 있다.

규정상, 파생 상품 거래에 참여한 기업은 해당 데이터베이스에서 수정된 거래 레코드를 새 레코드로 표현하는 경우가 많다. 이 튜토리얼의 목적에 따라 여기에서는 원본 FpML 레코드를 직접 수정하는 방법을 살펴본다.

지속적 XML 데이터의 샘플 하위 문서 업데이트

Listing 9에는 FPMLADMIN.FPML43 테이블의 DOCUMENT 컬럼에 있는 XML 데이터를 업데이트하는 대화식 SQL문이 있다.


Listing 9. DB2에 저장된 문서의 XML 노드 업데이트하기
update FPMLADMIN.FPML43 
set document = 
  xmlquery ('declare default element namespace "http://www.fpml.org/2009/FpML-4-7";
    transform copy $new := $x 
    modify do replace 
      $new/FpML/trade/creditDefaultSwap/generalTerms/scheduledTerminationDate 
    with 
      <scheduledTerminationDate xmlns="http://www.fpml.org/2009/FpML-4-7">
         <adjustableDate>
            <unadjustedDate>2011-05-05</unadjustedDate>
            <dateAdjustments>
               <businessDayConvention>FOLLOWING</businessDayConvention>
            </dateAdjustments>
         </adjustableDate>
         <comment>This is new.</comment>
      </scheduledTerminationDate>
    return $new' passing document as "x")
where comment like 'cd-ex10-long-us-corp-fixreg-47%'and
  xmlexists('declare default element namespace "http://www.fpml.org/2009/FpML-4-7";
    $fpml/FpML/trade/creditDefaultSwap/generalTerms
    /referenceInformation/referenceEntity[entityName="Agrium Inc."]' 
    passing document as "fpml")

WHERE절은 Agrium Inc.와 관련된 특정 신용 디폴트 스왑 거래로 업데이트를 제한한다. 이 절의 논리는 이전 시나리오에서 표현한 논리와 매우 비슷하므로 여기에서는 다시 검토하지 않는다.

이 쿼리 중 흥미로운 부분은 XMLQuery() 함수 호출에 포함된 표현식에 포함되어 있다. 적절한 기본 네임스페이스를 선언하고 나면 이 표현식을 통해 원본 XML 문서 값(그림 2 참조)이 $new 변수로 복사된다. MODIFY절은 예정된 만료일 노드를 새 노드로 바꾼다. 이 새 노드는 원본 노드를 네 가지 방법으로 변경한다.

  1. 조정되지 않은 날짜의 값(하위 노드)은 새 날짜(May 5, 2011)로 변경된다.
  2. 거래일 약정의 값(하위 노드)은 "FOLLOWING"으로 수정된다.
  3. 비즈니스 센터 하위 노드는 삭제된다. (결과적으로, 비즈니스 센터 노드의 하위 또한, 삭제된다.
  4. 새 하위 노드가 설명에 추가된다.

끝으로 RETURN절은 DB2가 수정된 데이터와 DOCUMENT 컬럼에 있는 데이터를 업데이트할 수 있게 예정된 만료일을 나타내는 새 노드를 리턴한다.

업데이트 시나리오를 위한 샘플 Java EE 코드

Java EE 애플리케이션에서 이러한 업데이트 조작이 어떻게 구현되는지 살펴보도록 하자. 예상하는 바와 같이 이 쿼리를 애플리케이션에 통합하려면 매개변수 표시문자와 이스케이프 문자를 사용해야 한다. Listing 10의 첫 번째 부분에는 Java EE 애플리케이션에서 Listing 9에 있는 대화식 UPDATE문을 이름 지정 쿼리로 변환하는 방법이 표시되어 있다. 이전 시나리오에서와 마찬가지로 이 예제도 분석기에 의존하여 데이터베이스 조작을 실행한다.


Listing 10. DB2 pureXML을 사용하여 XML 요소 바꾸기

// Define the database query. 
// In this case, the named query will update part of an FpML trade record. 
dbStatements = new HashMap<String, String>();
dbStatements.put(
  "updateScheduledTerminationDateByEnityName",
  "update fpmladmin.fpml43 set document = " + 
  "xmlquery('" +
    "declare default element namespace " + 
       "\"http://www.fpml.org/2009/FpML-4-7\"; " +
     "transform copy $new := $x " +
     "modify do replace " +
       "$new/FpML/trade/creditDefaultSwap/generalTerms/scheduledTerminationDate with $d "+
     "return $new' " +
     "passing cast (? as xml) " +
     "as \"d\", " +
     "document as \"x\"" +
  ") " +			
  "where comment like ? and " +
    "xmlexists(" +
        "'declare default element namespace " + 
            "\"http://www.fpml.org/2009/FpML-4-7\"; " +
        "$fpml/FpML/trade/creditDefaultSwap/generalTerms" +
            "/referenceInformation/referenceEntity[entityName=$name]'" +
        "passing document as \"fpml\", cast (? as varchar(100)) as \"name\"" +
     ")"
);
...

// Create an XSLT executable and execute it with the JDBC resolver 
Source source = 
  new Source(FpMLServlet.class.getResource("/updateCreditDefaultSwap.xsl").toString());
XSLTExecutable updateCreditDefaultSwapXSL = 
  factory.prepareXSLT(source, staticContext);
...
JDBCResultsResolver resultsResolver = 
  new JDBCResultsResolver(getConnection(), dbStatements);
dynamicContext.setResultResolver(resultsResolver);
dynamicContext.bind(new QName("http://com.ibm.xml.samples","entityName"),"Agrium Inc.");
dynamicContext.bind(new QName("http://com.ibm.xml.samples","tradeType"),"cd-ex10-long%");
dynamicContext.bind(new QName("http://com.ibm.xml.samples","updateOrRestore"),"update");
...

// "newDate" is XML and comes from a non-DB2 XML data source
XItemView newDate = getUpdatedTerminationDate();
dynamicContext.bind(new QName("http://com.ibm.xml.samples",
   "updatedScheduledTermination"), newDate);
...
StreamResult result = new StreamResult(servletResponse.getOutputStream());
updateCreditDefaultSwapXSL.execute((Source)null, dynamicContext, result);

이전 시나리오에서와 같이 XQuery 프로그램을 사용하는 대신, 이 예제에서는 XSLT 2.0 스타일시트를 사용했다. Listing 11에는 XSLT 코드 중 일부가 표시되어 있다.


Listing 11. 지속적 XML 문서 중 일부를 업데이트하는 데 필요한 XSLT 코드

<xsl:param name="my:entityName" as="xs:string" />
<xsl:param name="my:tradeType" required="yes" as="xs:string" />
<xsl:param name="my:updateOrRestore" required="yes" as="xs:string" />
<xsl:param name="my:updatedScheduledTermination" as="node()" />

<xsl:variable name="updateCreditDefaultSwapURL"
    select="concat('jdbc://updateScheduledTerminationDateByEnityName?--XML--&', 
       $my:tradeType, '&', $my:entityName)" />

<xsl:when test="$my:updateOrRestore eq 'update'">
    <xsl:result-document href="{$updateCreditDefaultSwapURL}" method="xml" indent="yes">
    <xsl:copy-of select="$my:updatedScheduledTermination" />
  </xsl:result-document>
</xsl:when>

새 XML 문서에서 XML 데이터와 관계형 데이터 결합하기

데이터베이스 티어에서 XML만으로 표현된 관계형 데이터와 XML 데이터를 얻고자 하는 Java EE 프로그래머라면 DB2의 하위 문서 업데이트 지원을 사용하여 이러한 목적을 달성할 수 있다. 예를 들면, 프로그래머가 하나의 명령문을 작성하여 DB2 및 Oracle과 같은 DBMS에 저장된 테이블의 관계형 컬럼에서 추출한 정보로 XML 데이터의 가치를 높일 수 있다. 프로그래머가 이 기능을 이용하여 다중 시스템 전체에서 XML 데이터와 관계형 데이터를 결합할 수 있기 때문에 이 기능은 여러 가지 상황에서 유용할 수 있다. 이 기사를 통해 다운로드할 수 있는 샘플 코드에는 이 시나리오가 포함되어 있지 않지만, 이러한 쿼리를 실행하는 방식은 이전 예제에서 살펴본 바와 같다.

이러한 방식으로 DB2의 하위 문서 지원을 사용하는 방법을 이해하기 위해 FpML 데이터베이스에 파생 상품 거래에 자주 참여한 당사자의 연락처를 추적하는 기존의 관계형 테이블이 포함되어 있다고 생각하자. 이 테이블의 정의는 Listing 12를 참고한다.


Listing 12. FPMLADMIN.PARTYCONTACTINFO 테이블 작성

CREATE TABLE FPMLADMIN.PARTYCONTACTINFO (
          PARTYID VARCHAR(40) PRIMARY KEY NOT NULL,
          PARTYNAME VARCHAR(100),
          PHONENO BIGINT,
          EMAILID VARCHAR(100),
          ADDRESS1 VARCHAR(100),
          ADDRESS2 VARCHAR(100),
          CITY VARCHAR(100),
          ZIPCODE BIGINT,
          STATE VARCHAR(100),
          COUNTRY VARCHAR(100)
     )

FpML 거래 레코드에는 파생 상품 거래에 참여한 당사자에 관한 제한된 정보만 포함되어 있으며, 거래를 확인(계약)하려면 여전히 더욱 자세한 정보가 필요하다. Listing 13에 표시된 바와 같이 하나의 DB2 명령문으로 관계형 데이터를 XML 요소로 즉시 변환하여 이 요소를 XML 문서의 해당 노드에 삽입하고 처리할 새 XML 문서를 리턴할 수 있다.


Listing 13. 관계형 데이터로 FpML 거래 레코드의 가치 높이기


select xmlquery ('declare default element namespace "http://www.fpml.org/2009/FpML-4-7"; 
  transform 
  copy $new := $message 
  modify for $i in $new/FpML/party
  return
    do insert 
      db2-fn:sqlquery("select 
         XMLELEMENT(NAME ""ContactInfo"", 
         XMLELEMENT(NAME ""Address1"", p.ADDRESS1), 
         XMLELEMENT(NAME ""Address2"", p.ADDRESS2), 
         XMLELEMENT(NAME ""CITY"", p.CITY), 
         XMLELEMENT(NAME ""STATE"", p.STATE), 
         XMLELEMENT(NAME ""COUNTRY"", p.COUNTRY),
         XMLELEMENT(NAME ""PHONE"", p.PHONENO)
         ) 
         from FPMLADMIN.PARTYCONTACTINFO p 
         where partyId=parameter(1)", $i/partyId/text()) 
         as last into $i
         return <newroot>{$new}</newroot>'
  passing F.DOCUMENT as "message") 
FROM FPMLADMIN.FPML43 f  
where id=47022

관계형 데이터가 원격 DB2나 OEM 데이터베이스에 있는 경우에는 예제 데이터베이스에 이러한 원격 테이블의 별명을 간단히 작성한다. 별명은 로컬 DB2 서버의 원격 데이터베이스 오브젝트를 나타내며, 이 별명을 이용하면 원격 데이터베이스 오브젝트가 로컬 DB2 테이블에 있는 것처럼 이러한 원격 오브젝트를 처리할 수 있다. 따라서 기본 데이터가 원격 DB2나 Oracle과 같은 데이터베이스에 저장된 경우에도 Listing 13에 있는 쿼리는 동일하게 유지된다.

게다가, 이 쿼리를 쉽게 수정하여 이처럼 가치가 높아진 거래 데이터를 DB2 데이터베이스의 XML 컬럼에 삽입할 수 있다. Listing 13에 있는 SELECT절 바로 앞에 INSERT INTO . . .절을 삽입하기만 하면 된다. (원본 거래 레코드를 보존하고 수정된 거래를 새 문서로 데이터베이스에 삽입할 경우에는 Listing 9에 있는 쿼리와 같은 방식을 사용할 수 있다.)


Summary

이 기사 시리즈의 Part 2에서는 Java EE 프로그래머가 애플리케이션 서버와 데이터베이스 서버 티어에서 기본적으로 XML을 어떻게 처리하는지 설명했다. 몇 개의 샘플 애플리케이션을 통해 XML 데이터와 관계형 데이터를 대상으로 인덱싱과 쿼리 필터링 기능을 사용하여 서버측 Java 애플리케이션에서 대용량 일시적 XML 데이터와 지속적 XML 데이터를 처리했다. 또한, 예제를 통해 지속적 XML 데이터의 서브세트를 처리하는 방법 특히, 데이터베이스에서 관심 있는 XML 노드만 추출하는 방법과 문서 내에서 특정 XML 노드만 업데이트하는 방법을 살펴보았다. 지속적 XML 문서의 단편을 처리하면 애플리케이션과 데이터베이스 서버 티어 간에 불필요하게 데이터 전송을 하지 않아도 되며 이렇게 하지 않았을 경우에 애플리케이션 서버에서 수행해야 하는 몇 가지 처리 과정을 하지 않아도 된다. 끝으로 이 기사에서는 일시적 XML 데이터와 지속적 XML 데이터를 결합하는 방법을 설명했다. 이러한 과정은 현재, 다수의 소프트웨어 컴포넌트에서 XML을 많이 사용하게 되면서 점점 더 일반적인 프로그래밍 요구사항이 되고 있다.

감사의 인사

이 기사를 검토해 준 Lee Ackerman과 Matthias Nicola에게 감사한다. 또한, 이 기사를 통해 다운로드할 수 있는 DB2 스크립트를 개발하는 데 도움을 준 Susan Malaika와 그녀의 동료에게 감사한다.



다운로드 하십시오

설명이름크기다운로드 방식
Sample Java code using the XML feature packFpML-Sample-WASXMLFEP-DB2pureXML.zip5MBHTTP
Sample FpML data and DB2 scriptfpmldb2was.zip2MBHTTP

다운로드 방식에 대한 정보


참고자료

교육

제품 및 기술 얻기

토론

필자소개

Andrew Spyker is a team lead of the WebSphere Application Server Performance and Benchmarking organization within the WebSphere development organization. His current focus area is on programming models including J2EE and SDO, web services including WS-Security and other evolving web services standards, and how these areas fit into a service-oriented architecture. Given this SOA focus, he also works to understand key areas of performance as it relates to all WebSphere products including, but not limited to, WebSphere Business Integration Server and WebSphere Portal Server. His performance work includes enabling more performant and scalable application server features and helping customers architect their current and future applications for best performance. Andrew has two and a half years of performance experience and over seven years of Java programming experience. He received his BS in Computer Engineer from Pennsylvania State University.

photo: Cynthia Saracco developerWorks Professional author level

Cynthia M. Saracco works on database management and XML technologies at IBM's Silicon Valley Lab. She has co-authored three books and taught university-level courses on various software technologies.

Bert joined IBM in 2001 to work on the XML project in DB2 as one of the early architects. Bert came to IBM from a startup company, Propel, where he led the design and implementation of the distributed and fault-tolerant middleware, which hosted a scalable e-commerce application. Before that, Bert worked for many years at Tandem Computers on the NonStop SQL, a database that runs many critical applications in the financial industry.

잘못된 도움말 신고

부정사용 신고

감사합니다. 이 항목은 운영자가 관심을 표시했습니다.


잘못된 도움말 신고

부정사용 신고

제출실패 신고. 나중에 다시 실행해주세요.


디벨로퍼웍스 로그인


IBM ID가 필요하세요?
IBM ID를 잊으셨습니까?


비밀번호를 잊으셨습니까?
비밀번호 변경

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

화면상에 보여지는 닉네임을 정하세요.

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

3개의 &이나 대쉬를 포함해주시고 31글자내로 제한해주세요.


developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


아티클 순위

의견

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=20
Zone=XML, Information Management, WebSphere
ArticleID=618886
ArticleTitle=다중 티어에서 XML 프로그래밍 하기, Part 2: XML 데이터베이스 서버를 활용하는 효과적인 Java EE 애플리케이션 작성
publish-date=10112010
author1-email=aspyker@us.ibm.com
author1-email-cc=
author2-email=
author2-email-cc=
author3-email=robbert@us.ibm.com
author3-email-cc=

태그

Help
검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오.

태그를 더 많이 보거나 적게 보기 위해 슬라이더 막대를 사용하십시오.

인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다.

내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.

검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오. 인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다. 내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.