2010년 10월 11일 - 다운로드 섹션에 fpmldb2was.zip 추가
XML이 널리 사용되면서 일시적인 XML 메시지와 지속적인 XML 데이터를 효과적으로 처리하는 방법을 프로그래머가 찾게 되었다. 웹 서비스와 기타 소프트웨어 컴포넌트에서 중요한 비즈니스 데이터가 포함된 일시적인 XML 메시지가 생성되는 경우가 많아졌다. 이에 따라 애플리케이션에서 이러한 메시지뿐만 아니라 원시 XML 데이터베이스 관리 시스템에 저장된 지속적인 비즈니스 아티팩트를 처리해야 할 필요성이 증가하게 되었다.
일시적인 XML 데이터와 지속적인 XML 데이터를 Java 오브젝트에 맵핑하는 것은 분명 가능하지만 중첩이 많은 복잡한 XML 구조의 경우에는 이렇게 하기가 어렵다. 게다가 시간이 지나면서 XML 데이터 스키마가 변경될 가능성이 있는 경우에는 이로 인해 애플리케이션 코드가 더 복잡해질 수 있다. 이 시리즈의 첫 번째 기사에서는 애플리케이션 서버와 데이터베이스 서버 티어 전체에서 일시적인 XML 데이터와 지속적인 XML 데이터를 처리하여 필수적인 프로그래밍 방식과 관련된 복잡도를 줄이는 선언적 프로그래밍 방식을 소개했다.
이 기사에서는 서버측 Java 애플리케이션에서 일시적인 XML 데이터와 지속적인 XML 데이터를 처리하는 주제를 더욱 자세하게 살펴본다. 일반적인 애플리케이션 개발 태스크와 샘플 코드를 검토하는 과정을 통해 다음과 같은 내용을 확인한다.
- 일시적인 XML 데이터와 지속적인 XML 데이터를 효과적으로 통합해야 하는 Java EE 애플리케이션에서 원시 XML 데이터베이스 서버 기술을 활용하는 방법을 확인한다.
- 데이터베이스 관리 시스템에서 XML 인덱싱 및 쿼리 필터링 기능을 활용하여 강력한 런타임 성능을 보장하는 방법을 배운다.
- 일시적인 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.jar 및 db2_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 테이블
FpML 레코드에는 표시된 거래 유형에 따라 변하는 요소와 속성으로 구성된 중첩이 많은 구조가 포함되어 있다. 그림 2에는 신용 디폴트 스왑 거래를 위한 샘플 FpML 레코드 일부가 표시되어 있다.
그림 2. 신용 디폴트 스왑 거래를 위한 FpML 레코드 일부
샘플 테이블에는 크기가 2KB에서 126KB에 이르는 FpML 문서가 포함되어 있다. 게다가 이 테이블에서는 세 가지 다른 FpML 스키마 버전을 기반으로 하는 거래 문서가 동일한 XML 컬럼에 저장된다. (특히, FpML 4.2, 4.3 및 4.7 기반의 거래 문서가 저장된다.) 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 저장소에서 원하는 거래 데이터를 얻어야 할 수도 있다.
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 애플리케이션에 삽입하기는 어렵지 않다. 데이터베이스에서 원하는 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
DB2 데이터 액세스 계획을 보고 해석하는 방법에 관한 자세한 정보는 참고자료를 참조한다.
또한, XML Feature Pack을 이용하면 아마도 웹 서비스나 Java 애플리케이션에서 생성한 일시적 XML 데이터를 지속적 XML 데이터와 결합하는 XQuery 표현식을 작성할 수 있다. 예상하는 바와 같이 다양한 방식으로 이러한 작업을 수행할 수 있다. 여기에서는 그중 한 가지 방법을 살펴보도록 하자.
파생 상품 투자를 분석해야 하는 애플리케이션을 생각해 보자. 이러한 애플리케이션은 신용 디폴트 스왑 거래와 관련된 기업에 관한 현재의 마켓 데이터를 얻어야 하는 특성이 있다. 이러한 마켓 데이터와 관련된 간단한 예제에는 현재의 주가 정보가 포함되어 있다. 파생 상품 거래 레코드를 DB2에 저장했으며 웹 서비스를 통해 주식 정보를 얻을 수 있다고 가정하면, 애플리케이션에서는 지속적 XML 데이터와 일시적 XML 데이터를 결합해야 한다.
Listing 6에는 XML Feature Pack을 사용하여 필수 작업을 수행하는 한 가지 방법이 표시되어 있다. 여기에서는 Listing 3에 있는 것과 같은 쿼리를 사용하여 DB2에서 신용 디폴트 스왑을 얻으므로 이러한 과정을 다시 반복하지 않는다. 또한, 이전 시나리오에서 수행한 것과 같이 적절한 분석기를 사용하여 쿼리를 실행한다.
Listing 6에서는 다양한 XQuery 실행 파일 특히, XML Feature Pack에서 결합을 처리하는 XQuery 함수를 새로 정의하였다. 이외에도 Listing 6에서는 StreamSource 오브젝트를 작성하여
DB2에 저장된 해당 거래 데이터와 결합될 일시적 XML 데이터를 표현한다. 단순하게 하기 위해 포트폴리오 분석에 유용한 일시적 마켓 데이터를 표현하기 위해
사용하는 StreamSource를 assets.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 기반 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 레코드를 직접 수정하는 방법을 살펴본다.
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절은 예정된 만료일 노드를 새 노드로 바꾼다. 이 새 노드는 원본 노드를 네 가지 방법으로 변경한다.
- 조정되지 않은 날짜의 값(하위 노드)은 새 날짜(May 5, 2011)로 변경된다.
- 거래일 약정의 값(하위 노드)은 "FOLLOWING"으로 수정된다.
- 비즈니스 센터 하위 노드는 삭제된다. (결과적으로, 비즈니스 센터 노드의 하위 또한, 삭제된다.
- 새 하위 노드가 설명에 추가된다.
끝으로 RETURN절은 DB2가 수정된 데이터와 DOCUMENT 컬럼에 있는 데이터를 업데이트할 수 있게 예정된 만료일을 나타내는 새 노드를 리턴한다.
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에 있는 쿼리와 같은 방식을 사용할 수 있다.)
이 기사 시리즈의 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 pack | FpML-Sample-WASXMLFEP-DB2pureXML.zip | 5MB | HTTP |
| Sample FpML data and DB2 script | fpmldb2was.zip | 2MB | HTTP |
교육
- 다중 티어에서 XML 프로그래밍하기, Part 1: 성능, 신뢰도 및 개발 편의성을 위해 중간 티어에서 XML 사용하기: JDBC 4.0, SQLXML 및 WebSphere Server XML Feature Pack을 사용한 완전한 XML 솔루션 개발(Andrew Spyker 및 Bert Van Der Linden, developerworks, 2010년 3월): 데이터베이스 및 중간 티어에서 자연스럽고 유용하게 XML 데이터를 처리하는 방법을 배우자. 샘플 웹 애플리케이션에서는 XML 데이터베이스와 Atom 서비스 전체에서 XML 데이터를 결합하는 과정을 통해 이러한 방식을 탐구한다.
- Introduction to XML(Doug Tidwell, developerWorks, 2002년 8월): XML을 잘 설명하고 있는 이 튜토리얼을 읽어보자.
- Query DB2 XML data with XQuery(Don Chamberlin, Cynthia M. Saracco, developerWorks, 2010년 3월): 이 소개 기사에 있는 여러 가지 예제를 따라하여 DB2 pureXML과 함께 XQuery를 사용하는 방법을 배우자.
- An introduction to XQuery(Howard Katz, deveoperWorks, 2006년 1월): 이 기사를 통해 XQuery를 배우자. 그리고 훨씬 더 자세한 정보는 이 기사에 있는 링크를 참고하자.
- Get started with XPath: Learn the basics(Bertrand Portier, deveoperWorks, 2004년 5월): 이 XPath 소개 기사에서 XPath의 개념, XPath의 구문 및 시맨틱,
XPath 위치 경로를 사용하는 방법, XPath 표현식을 사용하는 방법, XPath 함수를 사용하는 방법 및 XPath와 XSLT의 관련성을 배우자.
- Getting started with DB2 for Linux, UNIX, and Windows: IBM DB2에 숙달되지 않은 개발자를 위해 수집한 정보를 먼저 살펴보자. 이러한 교육 자료를 두 시간
정도만 학습하면 일련의 자기 학습형 튜토리얼을 학습할 수 있는 준비를 갖추게 될 뿐만 아니라 IBM DB2 for Linux®, UNIX®, and Windows를 다운로드하여 사용해 볼 수 있다.
- DB2 pureXML wiki: 이 위키에서 데모, 무료 다운로드 및 기술 논문 등으로 구성된 포괄적인 링크 세트를 확인하자.
- DB2 pureXML Cookbook(Matthias Nicola 및 Pav Kumar Chatterjee, IBM Press): 지원되는 모든 플랫폼을 위한 포괄적인 DB2 pureXML 기술 안내서를 읽어보자.
- Work with GPX XML data in DB2 9.5 using JDBC(Khurram Farnaaz, Ronny Bartsch 및 Susan Malaika, developerWorks, 2009년 1월): DB2 pureXML 및 JDBC 4.0을 다루는 방법을 배우자.
- Using the SQLXML data type: The Java data type for database type XML(Deepak Vohra, developerWorks, 2008년 4월): XML 문서 작성, 관계형 데이터베이스에 XML 문서 저장, 데이터베이스에서 XML 문서 검색 및 SQLXML Java 데이터 유형의 XML 문서 검색 작업을 수행하는 방법을 배우자.
- DB2 9.7 Info Center: DB2 pureXML for Linux, UNIX, and Windows의 완전한 제품 문서를 확인하자.
- WebSphere Application Server Feature Pack for XML: WebSphere Application Server Feature Pack for XML 전용 웹 사이트를 방문하자.
- WebSphere Application Server Feature Pack for XML Information Center: WebSphere Application Server Feature Pack for XML의 완전한 제품 문서를 확인하자.
- IBM WebSphere Application Server V7 Feature Pack for XML Fix Pack 7:XML Feature Pack Fix Pack 1.0.0.7을 다운로드하자.
- WebSphere Community Blog: 이 커뮤니티 블로그를 읽어보자.
- 비디오: Getting started with the WebSphere Application Server Feature Pack for XML: 이 기사에 있는 샘플 애플리케이션을 설치하고 WebSphere Application Server Feature Pack for XML을 시작하자.
- 비디오: XML Feature Pack and Sample for XML Database Integration Setup(With DB2 pureXML) Part 1/2: 이 기사에서 설명한 블로그 체크 프로그램 샘플 애플리케이션을 실행하도록 WebSphere Application Server와 DB2를 구성한다.
- developerWorks의 XML 영역: XML 영역에서 기술 향상에 도움이 되는 참고자료를 얻을 수 있다.
- My developerWorks: developerWorks와 관련된 경험을 개인화할 수 있다.
- IBM XML 인증: XML 및 관련 기술에 대한 IBM 인증 개발자가 되는 방법을 찾아볼 수 있다.
- XML 기술 자료: developerWorks XML 영역에서 다양한 기술 관련 기사와 팁, 튜토리얼, 표준 및 IBM Redbook을 볼 수 있다. 또한 더 많은 XML 팁을 읽어본다.
- developerWorks 기술 행사 및 웹 캐스트: 이러한 세션에 참가하여 최신 기술에 대한 정보를 얻을 수 있다.
- Twitter의 developerWorks 페이지: 오늘 가입하여 developerWorks 트윗을 팔로우하자.
- developerWorks
podcasts: 소프트웨어 개발자의 흥미로운 인터뷰와 토론을 확인할 수 있다.
- developerWorks on-demand demos: 입문자를 위한 제품 설치 및 설정 과정에서 숙련된 개발자를 위한 고급 기능의 활용에 이르기까지 다양한 데모를 제공한다.
제품 및 기술 얻기
- DB2 Express-C: pureXML이 포함된 무료 DB2 Express C 에디션을 다운로드하자.
- Websphere Application Server: 무료로 다운로드할 수 있고 완전히 사용이 허가된 IBM WebSphere Application Server for Developers를 얻자.
- IBM 제품 평가판을 다운로드하거나 IBM SOA Sandbox의 온라인 시험판을 살펴보고 DB2®, Lotus®, Rational®, Tivoli® 및 WebSphere® 애플리케이션 개발 도구와 미들웨어 제품을 사용해 볼 수 있다.
토론
- DB2 pureXML 포럼: 이 포럼에 참여하자.
- XML 영역 토론 포럼: 여러 XML 관련 토론에 참여해 볼 수 있다.
- developerWorks 포럼 & 블로그를 통해 developerWorks 커뮤니티에 참여하자.
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 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.