IBM®
메인 컨텐츠로 가기
    Korea [국가변경]    이용약관
 
 
   
        제품    서비스 & 솔루션    고객지원 & 다운로드    회원 서비스    
메인 컨텐츠로 가기

한국 developerWorks  >  Information Management | XML  >

XQuery 업데이트

의료계, 기업, 금융, IT 업계에서 DB2 pureXML 사용 사례

developerWorks
문서 옵션

JavaScript가 필요한 문서 옵션은 디스플레이되지 않습니다.

토론

영어원문

영어원문


제안 및 의견
피드백

난이도 : 중급

Susan Malaika, Senior Technical Staff Member, IBM
Jan-Eike Michels, Software Engineer, IBM
Christian Pichler, Data Server Solutions, IBM

2008 년 11 월 11 일

XML용 쿼리 언어인 XQuery는 XML을 수정하는 데 사용할 수 있습니다. 이 글에서는 메모리와 DB2® pureXML™ 데이터베이스에 저장된 XML을 포함하여 XML을 수정하는 다양한 방법을 소개합니다. 의료계, 기업, 금융, 정보 기술 등 네 개의 다른 사용 사례에서 DB2 pureXML을 활용하면서 XML을 수정하는 다른 방법들을 살펴봅니다. 마지막으로 하위 문서 업데이트나 전체 문서 대체와 저장된 XML의 버전 관리를 수행하는 데 XQuery를 사용하는 시기에 대한 가이드라인을 확인합니다.

소개

다양한 업계에서 XML을 메시지 교환 형식으로 사용하는 경우가 늘고 있다. 기업 컨소시엄이나 정부에서 이러한 교환 메시지 구조를 정의하는 경우도 많다. 다른 이니셔티브의 인기가 높아지면서 XML 교환 메시지 사용이 장려되고 있다. 이러한 이니셔티브에는 예를 들어 SaaS(Information as a Service and Software as a Service)를 비롯해 현재 주도적인 기술인 웹 서비스, FTP(File Transfer Protocol), 메시징, 이메일, 웹 기반 피드 정보 등이 함께 포함된다.

여러 조직에서 이러한 교환 메시지를 소비하고 생산하기 때문에 메시지를 직접 저장하기 시작하고 있다(예: 감사 용도). 일부 시스템에서는 이렇게 저장된 메시지가 기관이나 회사의 비즈니스를 지원하기 위한 최신 정보의 기본 소스가 된다.

저장된 XML 메시지를 수정하거나 저장된 기존 메시지에서 새 메시지를 끌어내기에 이상적인 사례가 있다. 다음은 업데이트된 XML 메시지를 작성하기 위한 몇 가지 예제다.

  • 기존 정보와 연결한다(“링크”한다). 예를 들어 의료계의 경우 추가 테스트 결과를 생성할 수 있다. 이 때 새 환자 레코드가 기존 레코드를 기반으로 작성되며 따라서 기존 레코드가 최근 진단 결과로 인해 증가된다.
  • 추가 정보를 통합한다. 예를 들어 기업에서는 주문에 이어 추가 항목이 주문에 추가될 수 있다. 이 과정에서 원래 주문을 취소하고 원래 주문과 추가 주문 항목의 내용을 통합하여 새 주문을 만드는 경우가 많다.
  • 수정된 정보를 통합한다. 예를 들어 금융 파생 상품(financial derivatives) 처리에서 새 그룹이 갱신이라는 과정을 통하여 특정 시점에 기존 그룹을 대체할 수도 있다.

XQuery는 XML 문서를 쿼리하는 데 사용할 수 있는 언어이며 XML 문서에서 하위 문서 업데이트를 수행하기 위한 확장이 추가되었다. 이러한 확장으로 새 노드를 추가하고 기존 노드를 삭제하거나 이름을 바꿀 수 있으며 기존 노드와 값을 대체할 수 있다(XQuery에 대한 자세한 내용은 참고자료를 보라).

이 글에서는 XQuery Update Facility, W3C 표준을 DB2에 저장된 XML에 적용하는 방법을 설명한다. 나아가 의료계, 기업, 금융 및 정보 기술 등 네 업계에서 XQuery Update Facility를 조명해 본다. 이 글은 해당 업계에 대한 특정 메시지 교환 형식의 예를 기반으로 한다. 또한 XQuery 업데이트의 기본 사항을 다루고 애플리케이션에서 XML을 읽고 구문 분석하며 수정하기보다는 XQuery 업데이트를 사용하여 XML을 수정하는 것이 더 쉽고 효율적임을 보여준 "Update XML in DB2 9.5"(developerWorks, 2007년 10월)라는 이전 글을 보완한다.

일부 업계의 번들을 다운로드하여 XQuery 업데이트를 시험해 볼 수도 있다. 이러한 번들은 무료이며 "Industry Formats and Services with pureXML"( 참고자료)이라는 DB2 pureXML 온라인 데모의 일부로 공개되어 있다.




위로


XML 수정 방법

XML을 수정하고 업데이트하기 위한 옵션은 그림 1에 표시된 것처럼 여러 가지가 있다.

  • 메모리에서 XML 수정: XML이 수정되지만 수정 내용이 영구적으로 저장되지 않는다.
  • 디스크에서 XML을 수정하고 내부(in-place)에 수정된 XML 저장: XML의 수정된 버전이 원래 XML을 기반으로 생성된다. 그런 다음 수정된 XML이 원래 XML 대신 저장되어 원래 XML을 대체한다.
  • 디스크에서 XML을 수정하여 수정된 XML의 새 버전 저장: 원래 XML을 기반으로 XML의 수정된 버전이 생성된다. 그런 다음 수정된 버전이 원래 버전과 별도로 저장된다.

그림 1. XML을 수정하고 업데이트하기 위한 여러 다른 옵션
XML을 수정하고 업데이트하기 위한 여러 다른 옵션



위로


XQuery 업데이트를 통해 XML을 수정하기 위한 사용 패턴

XML을 수정하는 방법은 XQuery 업데이트 지원을 사용하여 업데이트를 수행하기 위한 패턴의 기본이다. 다른 업데이트 패턴은 다음과 같다(그림 2).

  • 내부에 저장된 XML 업데이트
  • 수정된 XML 버전 삽입
  • XML 응답을 생성하도록 XML 요청으로부터 즉석에서(메모리에서) XML 업데이트
  • XQuery 업데이트 뷰를 통해 XML 내용의 부분 숨기기

그림 2. XQuery 업데이트 패턴
XQuery 업데이트 패턴

내부에 저장된 XML 업데이트와 XML의 업데이트된 버전 삽입은 수정된 XML을 지속하기 위한 두 가지 주요 방법이다. 즉석에서 XML을 업데이트하면 데이터베이스에 XML 요청이나 응답 중 하나 또는 둘 다 저장할 수 있음에도 불구하고 저장하지 않는다. XQuery 업데이트 뷰를 통해 XML 내용의 일부를 숨기면 저장된 내용을 수정하지 않지만 전통적인 관계형 뷰의 보안 기능은 활용할 수 있다.

다음 단락에서는 각 패턴에 대해 자세히 설명한다. 또한 DB2 pureXML 데이터베이스에 둘 이상의 열이 있는데 그 중 한 열은 XML 유형인 기존 테이블이 있는 것으로 가정하는 예제를 제공한다.

내부에 저장된 XML 업데이트

내부에 저장된 XML 업데이트란 XQuery 업데이트 표기법을 사용하여 원래 XML에서 하위 문서 업데이트가 수행되는 것을 의미한다.

Listing 1에서는 원래 XML에서 우편번호를 수정한 다음 원래 XML을 수정된 XML로 대체하는 Embedded XQuery 업데이트 문이 있는 SQL/XML 문을 보여준다.


Listing 1. 원래 XML을 업데이트된 XML로 대체하는 XQuery 업데이트

UPDATE xmlcustomer
   SET info = XMLQUERY('transform 
                        copy      $new := $i
                        modify    do replace value of $new/customerinfo/addr/zipcode 
                                                   with 90111
                        return    $new' PASSING info AS "i")
 WHERE cid = 1000;

XML의 수정된 버전 삽입

원래 XML을 유지하면서 기존 XML을 업데이트하는 다른 방법은 기존의 원래 XML에 완전하고 새로우며 업데이트된 레코드를 삽입하는 것이다.

Listing 2에서는 원래 XML을 기반으로 XML을 수정한 새 행을 삽입하기 위한 Embedded XQuery 문이 있는 SQL/XML 문을 보여준다.


Listing 2. 데이터베이스에 XML의 수정된 버전을 삽입하기 위한 XQuery 업데이트

INSERT INTO xmlcustomer (cid, 
                         info) 
     VALUES (1003, 
             XMLQUERY('transform
                       copy      $new := $i
                       modify    do replace value of $new/customerinfo/addr/zipcode
                                                  with 90111
                       return    $new' PASSING (SELECT info
                                                FROM   xmlcustomer
                                                WHERE  cid=1000) as "i"));

XML 응답을 생성하도록 XML 요청으로부터 즉석에서 XML 업데이트

XML을 즉석에서 업데이트하는 것은 XML 변수나 열에서 XML을 가져오는 동안 XML이 메모리에서 수정되는 것을 의미한다.

Listing 3은 우편번호를 검색하는 동안 즉석에서 XML의 우편번호를 수정하는 XQuery 문을 보여준다.


Listing 3. 메모리에 XML의 수정된 버전을 생성하기 위한 XQuery 업데이트

XQUERY 
for    $doc in db2-fn:sqlquery('SELECT info
                                FROM   xmlcustomer
                                WHERE  cid=1000')
return transform 
       copy      $new := $doc
       modify    do replace value of $new/customerinfo/addr/zipcode 
                                  with 90111
       return    $new;

XQuery 업데이트 뷰를 통해 XML 내용의 일부 숨기기

특정 사용자에게 XML을 숨기거나 흐리게 보여야 하는 경우가 있다. 예를 들어 의료 직원으로부터 사회 안전 번호를 숨기거나 설문 조사를 목적으로 하는 민감한 고객 정보를 제거해야 할 때가 있다. 이 경우 XML의 일부를 숨기거나 제한하도록 XQuery 업데이트를 적용하는 뷰를 XML에 만들 수 있다. 이렇게 하려면 XQuery 업데이트 뷰를 통해 액세스의 성능을 꼼꼼하게 확인해야 한다.

Listing 4에서는 anonymousCust 뷰를 통해 XML에 접근하는 소프트웨어에서 고객 이름, 주소, 우편번호, 전화번호를 숨기는 것을 보여준다.


Listing 4. 뷰에서 XML의 일부를 숨기기 위한 XQuery 업데이트

CREATE VIEW anonymousCust (custInfo) 
    AS SELECT XMLQUERY('for    $ci in $i 
                        return transform   
                               copy      $c := $i 
                               modify    (do delete $c/customerinfo/name,
                                          do delete $c/customerinfo/addr/street, 
                                          do delete $c/customerinfo/addr/zipcode, 
                                          do delete $c/customerinfo/phone) 
                               return    $c' PASSING info AS "i") 
         FROM xmlcustomer;




위로


HL7 업데이트(버전 관리와 연결(chaining))

HL7(Health Level 7)은 의료계의 임상 및 관리 영역에 대한 SDO(Standards Developing Organization)다. HL7의 기본은 RIM(Reference Information Model)으로 모든 HL7의 사양을 파생시킨 정보 모델이다. 이러한 사양 중 하나는 CDA(Clinical Document Architecture)로 교환 목적에 대한 임상 문서의 구조와 의미를 기술한다. CDA 문서에는 환자의 이름, 주소, 성별이 의약품 같은 정보가 포함될 수 있다.

사양은 CDA 문서에 포함된 구조와 의미 외에 기존 CDA 문서에 대해 업데이트를 수행하는 방법도 정의한다. 다음은 CDA 문서가 업데이트될 수 있는 예제 상황이다.

환자인 Megan Brown은 혈액 검사를 받기 위해 동네 병원을 방문했다. 하지만 Megan은 병원을 방문하는 동안 자세한 주소 정보를 제출하지 않았으며 혈액 검사를 받은 지 며칠이 지난 후에야 주소를 제출했다.

위 예에서 보인 것처럼 이제 CDA 문서에서 Megan의 주소를 업데이트해야 한다. 그렇게 하기 위해 CDA 문서 자체를 업데이트할 수 있다. 하지만 CDA 사양은 기존 CDA 문서를 직접 업데이트하지 못하도록 기술되어 있다. 대신 원래 문서의 사본을 생성하고 그에 따라서 업데이트해야 한다. CDA 문서의 업데이트된 사본 외에도 기존의 원래 CDA 문서를 가리키는 업데이트된 문서에 대한 참조가 추가되어야 한다(CDA에 대한 자세한 내용은 참고자료를 보라).

그림 3에서는 사양에 따른 CDA 문서의 업데이트를 보여준다.


그림 3. CDA 문서를 업데이트하는 시나리오
CDA 문서를 업데이트하는 시나리오

각 CDA 문서에는 각 문서에 고유한 식별자를 할당하는 요소 <id>가 있다. CDA 문서의 버전 관리는 요소 <setId><versionNumber>에 의해 수행된다. 원래 문서와 해당 업데이트된 버전에는 같은 <setId>가 있지만 <versionNumber>가 서로 다르다. 여기서 <setId>는 두 문서가 하나의 세트임을 나타내며 <versionNumber>는 버전을 나타낸다. 버전 관리 정보 외에 문서 간의 “관계”라는 것도 정의해야 한다. 업데이트된 버전에 의해 대체되는 원래 문서의 샘플에 적용되는, 즉 문서가 다른 문서에 대체됨을 보여주는 관계를 정의해야 한다. 이러한 관계의 정의는 <relatedDocument> 요소를 통해 수행된다.

코드 조각

Listing 5에서는 환자 정보를 포함하고 있지만 중요한 연락처 정보가 누락된 기존 CDA 문서의 발췌문을 보여준다.


Listing 5. 원래 HL7 CDA 샘플 XML 문서의 발췌문

...
<id root="2.16.840.1.113883.3.18.1" extension="2"/>
<setId root="2.16.840.1.113883.3.18.1" extension="2"/>
<versionNumber value="1" />
...
<patient>
  <name>
    <family>Megan</family>
    <given>Brown</given>
  </name>
  <administrativeGenderCode 
     code="F" 
     codeSystem="2.16.840.1.113883.5.1" />
  <birthTime value="198110070000" />
  <birthplace>
    <place>
      <addr>
        <city>San Jose</city>
        <country>United States of America</country>
        <postalCode>95102</postalCode>
      </addr>
    </place> 
  </birthplace>
</patient>
...

그림 2에 표시된 예에 따라 CDA 문서는 환자의 주소 정보를 덧붙여야 한다. Listing 6은 환자의 주소 정보로 증가된 CDA 문서에서 발췌한 코드를 보여준다. 또한 발췌문에는 필요한 버전 관리 정보도 포함된다.


Listing 6. 업데이트된 HL7 CDA 샘플 XML 문서의 발췌문

...
<id root="2.16.840.1.113883.3.18.1" extension="2-1"/>
<setId root="2.16.840.1.113883.3.18.1" extension="2"/>
<versionNumber value= "2" />
...
<addr>
  <streetName>Martine Ave</streetName>
  <houseNumber>11</houseNumber>
  <houseNumberNumeric>11</houseNumberNumeric>
  <city>San Jose</city>
  <postalCode>95102</postalCode>
  <country>United States of America</country>
</addr>

<patient>
  <name>
    <family>Megan</family>
    <given>Brown</given>
  </name>
  <administrativeGenderCode 
     code="F" 
     codeSystem="2.16.840.1.113883.5.1" />
  <birthTime value="198110070000" />
...
</patient>
...
<relatedDocument typeCode="RPLC">
  <parentDocument>
    <id root="2.16.840.1.113883.3.18.1" 
        extension="2" />
  </parentDocument>
</relatedDocument>
...

원래의 CDA 문서를 유지하고 올바른 버전 관리 정보를 추가하면서 CDA 문서의 업데이트를 수행하려면 Listing 7에 표시된 SQL/XML 문을 사용한다.


Listing 7. CDA 문서의 업데이트를 수행하기 위한 SQL/XML 문

INSERT INTO BUCKET (id, document) 
VALUES (11,
        XMLQUERY('declare default element namespace "urn:hl7-org:v3"; 
        for     $doc in $p 
        let     $newAddress := <addr>
                                 <streetName>Martine Ave</streetName>
                                 <houseNumber>11</houseNumber>
                                 <houseNumberNumeric>11</houseNumberNumeric>
                                 <city>San Jose</city>
                                 <postalCode>95102</postalCode>
                                 <country>United States of America</country>
                               </addr> 
        let     $IdRoot := $doc/ClinicalDocument/id/@root 
        let     $IdExtension := $doc/ClinicalDocument/id/@extension 
        let     $relationship := <relatedDocument typeCode="RPLC">
                                   <parentDocument>
                                     <id root="{$IdRoot}" 
                                         extension="{$IdExtension}" />
                                   </parentDocument>
                                 </relatedDocument> 
        return  transform 
                copy      $c := $doc 
                modify   (do insert $newAddress 
                             after $c/ClinicalDocument/recordTarget/patientRole/id,
                          do replace 
                             value of $c/ClinicalDocument/versionNumber/@value 
                             with xs:integer($c/ClinicalDocument/versionNumber/@value)+1,
                          do replace 
                             value of $c/ClinicalDocument/id/@extension 
                             with fn:concat($c/ClinicalDocument/id/@extension, "-1"), 
                          do insert $relationship 
                             after $c/ClinicalDocument/recordTarget)
                return    $c' PASSING (SELECT document 
                                         FROM bucket 
                                        WHERE id=1) as "p")
        )@




위로


UBL 구매 주문(버전 관리)

UBL(Universal Business Language, 참고자료 참조)은 OASIS(Organization for the Advancement of Structured Information Standards, 참고자료 참조)에서 구매 주문과 송장 같은 표준 전자 XML 비즈니스 문서의 특허료 없는 라이브러리를 정의하기 위해 개발했다. OASIS 기술 위원회는 UBL을 “기존 비즈니스, 법률, 감사, 레코드 관리 사례에 직접 적용하도록 디자인되어 기존 팩스와 종이 기반의 공급 체인에서 데이터 재입력을 없애고 전자 상거래나 중소 기업에 대한 시작점을 제공하는 것”으로 정의한다.

다른 버전 중에서도 UBL 버전 2.0에는 다음과 같은 간단한 예제 시나리오에서 사용된 것과 같은 “Order”와 “OrderChange” 문서에 대한 XML 스키마가 포함되어 있다. 이 시나리오에서 한 비즈니스 파트너(구매자)는 다른 비즈니스 파트너(판매자)에게 주문서를 제출한다. 판매자는 구매자에게 “OrderResponse” 문서를 보내 주문을 확인한다. 주문에 대한 응답을 받자 마자 구매자는 원래 주문서에서 배달 주소가 잘못되었음을 안다. 이제 구매자는 이 오류를 수정해야 한다. 이를 위한 옵션 몇 가지는 다음과 같다.

  1. “OrderChange” 문서 제출(대안 1: 그림 4에 표시)
  2. 원래 주문을 취소하고 새 주문서 제출(대안 2: 그림 5에 표시)
  3. 기타 대역 외 통신 사용(예: 판매자에게 직접 전화)

Listing 8은 배달 주소가 잘못된 원래 주문 XML 문서의 발췌문을 보여준다.


Listing 8. 배달 주소가 잘못된 UBL 주문 XML 문서의 발췌문

<Order ...
...
<cbc:UUID>6E09886B-DC6E-439F-82D1-7CCAC7F4E3B1</cbc:UUID>
<cbc:IssueDate>2007-10-15</cbc:IssueDate>
<cac:BuyerCustomerParty>...</cac:BuyerCustomerParty>
<cac:SellerSupplierParty>...</cac:SellerSupplierParty>
...
<cac:Delivery>
  <cac:DeliveryAddress>
    <cbc:StreetName>Avon Way</cbc:StreetName>
    <cbc:BuildingName>Thereabouts</cbc:BuildingName>
    <cbc:BuildingNumber>56A</cbc:BuildingNumber>
    <cbc:CityName>Bridgetown</cbc:CityName>
    <cbc:PostalZone>ZZ99 1ZZ</cbc:PostalZone>
    <cac:Country>
      <cbc:IdentificationCode>GB</cbc:IdentificationCode>
    </cac:Country>
  </cac:DeliveryAddress>
  <cac:RequestedDeliveryPeriod>
    ...
  </cac:RequestedDeliveryPeriod>
</cac:Delivery>
...
<cac:OrderLine>
  <cac:LineItem>...</cac:LineItem>
  ...
</cac:OrderLine>
...
</Order>

대안 1. 구매자가 실수를 수정하기 위한 OrderChange 문서 제출


그림 4. 기존 구매 주문을 수정하기 위한 대안 1
기존 구매 주문을 수정하기 위한 대안 1

구매자는 XQuery 표현식을 사용하여(Listing 10) 기존 Order 문서에서(Listing 8) OrderChange 문서를 작성한다(Listing 9).


Listing 9. 배달 주소를 수정한 UBL OrderChange XML 문서의 발췌문

<OrderChange ...
...
<cbc:UUID>6E09886B-DC6E-439F-82D1-8BCFC7A4ECCC</cbc:UUID>
<cbc:IssueDate>2007-10-16</cbc:IssueDate>
<cbc:SequenceNumberID>1</cbc:SequenceNumberID>
<cac:BuyerCustomerParty>...</cac:BuyerCustomerParty>
<cac:SellerSupplierParty>...</cac:SellerSupplierParty>
...
<cac:Delivery>
  <cac:DeliveryAddress>
    <cbc:StreetName>Stratford Way</cbc:StreetName>
    <cbc:BuildingNumber>111</cbc:BuildingNumber>
    <cbc:CityName>Bridgetown</cbc:CityName>
    <cbc:PostalZone>ZZ99 1ZZ</cbc:PostalZone>
    <cac:Country>
      <cbc:IdentificationCode>GB</cbc:IdentificationCode>
    </cac:Country>
  </cac:DeliveryAddress>
  <cac:RequestedDeliveryPeriod>
  ...
  </cac:RequestedDeliveryPeriod>
</cac:Delivery>
...
<cac:OrderLine>
  <cac:LineItem>...</cac:LineItem>
  ...
</cac:OrderLine>
...
</OrderChange>


Listing 10. UBL Order XML 문서(Listing 8)에서 UBL OrderChange XML 문서(Listing 9)를 작성하기 위한 XQuery 표현식

XQUERY 
declare default element namespace 
  "urn:oasis:names:specification:ubl:schema:xsd:Order-2"; 
declare namespace cac = 
  "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2";
declare namespace cbc = 
  "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2";

for     $doc in db2-fn:sqlquery('select data from ubladmin.ubltable where id=100') 
let     $SequenceNumber := <cbc:SequenceNumberID>1</cbc:SequenceNumberID> 
let     $newAddress := <cac:DeliveryAddress>
                         <cbc:StreetName>Stratford Way</cbc:StreetName>
                         <cbc:BuildingNumber>111</cbc:BuildingNumber>
                         <cbc:CityName>Bridgetown</cbc:CityName>
                         <cbc:PostalZone>ZZ99 1ZZ</cbc:PostalZone>
                         <cac:Country>
                           <cbc:IdentificationCode>GB</cbc:IdentificationCode>
                         </cac:Country>
                       </cac:DeliveryAddress>
return  transform 
        copy      $c := $doc 
        modify    (do rename $c/Order 
                      as "OrderChange",
   		       do replace 
                      value of $c/Order/cbc:UUID 
                      with "6E09886B-DC6E-439F-82D1-8BCFC7A4ECCC",
                   do replace 
                      value of $c/Order/cbc:IssueDate 
                      with "2007-10-16",
                   do insert $SequenceNumber 
                      after $c/Order/cbc:IssueDate,
                   do replace $c/Order/cac:Delivery/cac:DeliveryAddress 
                      with $newAddress)
         return    $c

구매자는 OrderChange 문서를 판매자에게 제출한다. Order 문서와 OrderChange 문서 사이의 차이를 수정하려면 XQuery 표현식에서 다음을 수행해야 한다.

  • <Order> 요소의 이름을 “OrderChange”로 변경
  • UUID와 IssueDate 요소의 값을 새 값으로 대체
  • 새 SequenceNumber 삽입
  • 기존 <cac:DeliveryAddress> 요소를 새로 구성된 요소로 대체

기존 <cac:DeliveryAddress> 요소를 완전히 대체하는 대신 Listing 11에 표시된 대로 잘못된 하위 요소만 대체할 수도 있다.


Listing 11. Order XML 문서(Listing 8)에서 새 UBL Order XML 문서(Listing 12)를 작성하기 위한 XQuery 표현식

XQUERY 
declare default element namespace 
  "urn:oasis:names:specification:ubl:schema:xsd:Order-2"; 
declare namespace cac = 
  "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2";
declare namespace cbc = 
  "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2";

for    $doc in db2-fn:sqlquery('select data from ubladmin.ubltable where id=100') 
return transform 
       copy      $c := $doc 
       modify   (do replace
                    value of $c/Order/cbc:UUID 
                    with "6E09886B-DC6E-439F-82D1-8BCFC7A4ECCC",
                 do replace 
                    value of $c/Order/cbc:IssueDate 
                    with "2007-10-16",
                 do replace 
                    value of $c/Order/cac:Delivery/cac:DeliveryAddress/cbc:StreetName 
                    with "Stratford Way",
                 do replace value of 
                    $c/Order/cac:Delivery/cac:DeliveryAddress/cbc:BuildingNumber 
                    with "111",
                 do delete 
                    $c/Order/cac:Delivery/cac:DeliveryAddress/cbc:BuildingName)
       return    $c

대안 2. 구매자가 기존 주문을 취소하고 새 Order 문서를 제출하여 오류 수정


그림 5. 기존 구매 주문을 수정하기 위한 대안 2
기존 구매 주문을 수정하기 위한 대안 2

구매자는 Listing 11에 표시된 것과 비슷한 XQuery 표현식을 사용하여 기존 Order 문서(Listing 8)에서 새 Order 문서(Listing 12)를 작성한 다음 판매자에게 제출할 수 있다.


Listing 12. 올바른 주소가 있는 새 UBL Order XML 문서의 발췌문

<Order ...
...
<cbc:UUID>6E09886B-DC6E-439F-82D1-8BCFC7A4ECCC</cbc:UUID>
<cbc:IssueDate>2007-10-16</cbc:IssueDate>
<cac:BuyerCustomerParty>...</cac:BuyerCustomerParty>
<cac:SellerSupplierParty>...</cac:SellerSupplierParty>
...
<cac:Delivery>
  <cac:DeliveryAddress>
    <cbc:StreetName>Stratford Way</cbc:StreetName>
    <cbc:BuildingNumber>111</cbc:BuildingNumber>
    <cbc:CityName>Bridgetown</cbc:CityName>
    <cbc:PostalZone>ZZ99 1ZZ</cbc:PostalZone>
    <cac:Country>
      <cbc:IdentificationCode>GB</cbc:IdentificationCode>
    </cac:Country>
  </cac:DeliveryAddress>
  <cac:RequestedDeliveryPeriod>
  ...
  </cac:RequestedDeliveryPeriod>
</cac:Delivery>
...
<cac:OrderLine>
  <cac:LineItem>...</cac:LineItem>
  ...
</cac:OrderLine>
...
</Order>

새 Order 문서를 작성하려면 XQuery 표현식이 UUID와 IssueDate 요소의 값을 새 값으로 대체해야 할 뿐만 아니라 <cbc:StreetName><cbc:BuildingNumber> 요소의 기존 값을 올바른 값으로 대체하고 <cbc:BuildingName> 요소를 삭제해야 한다.




위로


FpML 파생물(갱신 요청 응답)

FpML(Financial products Markup Language)은 ISDA(International Swaps and Derivatives Association)에서 정의한 XML 표기법으로 개인적으로 협의된 파생물(계약)을 기술한다. FpML을 작성할 때 ISDA는 OTC(Over the Counter) 파생물에서 이용되는 투자 은행의 커뮤니티를 대신하여 작동한다(ISDA와 FpML에 대한 자세한 내용은 참고자료 참조).

새로운 종류의 파생물이 항상 생성되고 있고 따라서 유연한 표기법이 필요하므로 XML은 FpML에 적합하다. FpML에는 현재 600개 이상의 XML 유형, 1730개 이상의 XML 요소, 21개 이상의 XML 스키마 파일(XSD)이 있기 때문에 FpML에서 관계형 테이블 같은 여타 표기법을 표현하기 힘들다.

이 글의 FpML XQuery 업데이트 예제( 그림 6)는 갱신 요청(참고자료)에 대해 응답을 생성하는 것을 보여준다. 갱신은 기존 그룹을 새 그룹이 있는 계약으로 대체하기 위한 계약이다.


그림 6. FpML 갱신(novation)
FpML 갱신(novation)

코드 조각

Listing 13은 다음 갱신 요청을 표시한다.


Listing 13. 갱신 요청의 발췌문

<FpML version="4-2"
   xmlns=http://www.fpml.org/2005/FpML-4-2
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
   xsi:schemaLocation="http://www.fpml.org/2005/FpML-4-2  
                       ../../fpml-main-4-2.xsd
                       http://www.w3.org/2000/09/xmldsig#  
                                   xmldsig-core-schema.xsd" 
  xsi:type="NovationConsentRequest">
  ...
  <novation>
    <oldTransaction>
      <partyTradeIdentifier>
        <partyReference href="abcBank"/>
          <tradeId tradeIdScheme=
                   "http://www.abcbank.com/tradeId/OTC">
             TradeABC0001
          </tradeId>
      </partyTradeIdentifier>
    </oldTransaction>
    <newTransactionReference>
      <partyTradeIdentifier>
        <partyReference href="xyzBank"/>
          <tradeId tradeIdScheme=
                  "http://www.xyzbank.com/tradeId/OTC">
            TradeXYZ0001
          </tradeId>
      </partyTradeIdentifier>
      </newTransactionReference>

Listing 14는 원하는 갱신 응답을 표시한다.


Listing 14. 갱신 응답의 발췌문

<FpML version="4-2"
   xmlns=http://www.fpml.org/2005/FpML-4-2
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
   xsi:schemaLocation="http://www.fpml.org/2005/FpML-4-2  
                       ../../fpml-main-4-2.xsd
                       http://www.w3.org/2000/09/xmldsig#  
                                   xmldsig-core-schema.xsd" 
  xsi:type="NovationConsentGranted">
  ...
  <novation>
    <oldTransactionReference>
      <partyTradeIdentifier>
        <partyReference href="abcBank"/>
          <tradeId tradeIdScheme=
                   "http://www.abcbank.com/tradeId/OTC">
             TradeABC0001
          </tradeId>
      </partyTradeIdentifier>
    </oldTransactionReference>
    <newTransactionReference>
      <partyTradeIdentifier>
        <partyReference href="xyzBank"/>
          <tradeId tradeIdScheme=
                  "http://www.xyzbank.com/tradeId/OTC">
            TradeXYZ0001
          </tradeId>
      </partyTradeIdentifier>
    </newTransactionReference>

Listing 15는 갱신 응답이나 확인을 생성하는 데 XQuery 업데이트를 사용할 수 있는 방법을 표시한다.


Listing 15. FpML 갱신 확인을 생성하기 위한 SQL/XML 문 novation confirmation

INSERT INTO BUCKET (id, document) 
VALUES (33,
        XMLQUERY('declare default element namespace "http://www.fpml.org/2005/FpML-4-2";
                  declare namespace xsi = "http://www.w3.org/2001/XMLSchema-instance"; 
                  for     $doc in $f 
                  let     $reference := $doc/FpML/novation/oldTransaction/tradeHeader
                                            /partyTradeIdentifier[last()] 
                  let     $oldReference := <oldTransactionReference>
                                             {$reference}
                                           </oldTransactionReference> 
                  return  transform 
                          copy      $c := $doc 
                          modify    (do replace 
                                        value of $c/FpML/@xsi:type 
                                        with "NovationConsentGranted", 
                                     do insert $oldReference 
                                        before $c/FpML/novation/newTransactionReference,
                                     do delete $c/FpML/novation/oldTransaction) 
                          return    $c' PASSING (SELECT document 
                                                   FROM bucket 
                                                  WHERE id=3) as "f")
                )@




위로


웹 2.0 APP — Atom Store에 대한 API(메모리에서 업데이트)

Atom은 다음과 같이 관련된 두 표준을 나타낸다(자세한 내용은 참고자료를 보라).

  • Atom Syndication Format은 웹 피드의 레이아웃을 나타내기 위한 XML 표기법이다. 피드에는 많은 항목이 있다. 예를 들어 특정 카테고리에 있는 최근 뉴스 항목의 목록(예: 중국의 스포츠)은 Atom 피드로 표현될 수 있다. 새로운 각 항목은 Atom 항목으로 표현된다.
  • APP(Atom Publishing Protocol)는 Atom 형식으로 된 웹 리소스를 만들고 업데이트하기 위한 HTTP 프로토콜이다. APP는 많은 리소스에서 Atom 표현을 가지도록 유도한다.

Atom 표기법에서 저장된 XML의 데이터 컬렉션을 Atom Store라고 부른다.


그림 7. Atom 시나리오
Atom 시나리오

사용자 인터페이스 소프트웨어를 포함하여 광범위한 도구와 기술에서 Atom 피드(see 그림 7)를 지원하고 교환, 저장해야 하므로 XML은 Atom에 적합하다.

이 글의 Atom XQuery 업데이트 예제는 Atom 피드 항목의 수정을 나타낸다. Listing 16에서는 피드 항목을 보여준다.


Listing 16. Atom 엔트리

<entry xmlns="http://www.w3.org/2005/Atom">
  <author>
         <name>Lonely John</name>
  </author>
  <title>Scary Nights</title>
  <content type="xhtml" xml:lang="en-US">
    <div xmlns="http://www.w3.org/1999/xhtml">
       It was a dark and stormy night
    </div>
  </content>
  <published>
    2006-07-13T10:59:26-07:00
  </published>
</entry>

Listing 17은 항목을 수정하고 더 많은 연결로 증가시키는 몇 가지 업데이트를 한 이후에 항목이 어떻게 변경될 수 있는지 표시한다.


Listing 17. 업데이트된 Atom 항목

<entry xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>John the brave</name>
    <email>johnb@ibm.com</email>
  </author>
  <id xmlns="http://www.w3.org/2005/Atom">b8b2332285095249</id>
  <summary xmlns="http://www.w3.org/2005/Atom" type="xhtml">
   <div xmlns="http://www.w3.org/1999/xhtml">
      <a href="http://atomfeeds.com?col=97">
        <img src="http://atomfeeds.com?col=97" 
             alt="Media of type application"/>
      </a>
    </div>
  </summary>
  <created xmlns="http://www.w3.org/2005/Atom" 
           by="johnb@ibm.com">2007-09-26T21:15:10.541636Z
  </created>
  <updated xmlns="http://www.w3.org/2005/Atom" 
           by="johnb@ibm.com">2007-09-26T21:15:10.541636Z
  </updated>
  <link xmlns="http://www.w3.org/2005/Atom" rel="self"
        href="http://atomfeeds.com?col=97"/>
  <link xmlns="http://www.w3.org/2005/Atom" rel="edit" 
         href="http://atomfeeds.com?col=97"/>
  <link xmlns="http://www.w3.org/2005/Atom" rel="edit-media" 
        href="http://atomfeeds.com?col=97&media"/>
  <title>Media of type application</title>
  <content xmlns="http://www.w3.org/2005/Atom" 
           type="application/x-www-form-urlencoded" 
           src="http://atomfeeds.com?col=97"/>
</entry>

Listing 18은 APP의 일부 기능을 구현하고 수정된 Atom 피드 항목을 생성하는 데 XQuery 업데이트를 사용할 수 있는 방법을 보여준다.


Listing 18. 원래 항목에서 수정된 Atom 피드 항목을 생성하기 위한 XQuery 업데이트

XQUERY declare default element namespace 'http://www.w3.org/2005/Atom'; 
  for $doc in db2-fn:sqlquery('select document from bucket where id=2') 
  let $newTitle := "Media of type application" 
  let $newAuthor := <author>
                      <name>John the brave</name>
                      <email>johnb@ibm.com</email>
                    </author> 
  let $newId := <id>b8b2332285095249</id> 
  let $summary := <summary type="xhtml"> 
                    <div xmlns="http://www.w3.org/1999/xhtml"> 
                      <a href="http://atomfeeds.com?col=97"> 
                      <img src="http://atomfeeds.com?col=97" 
                           alt="Media of type application"/></a> 
                    </div> 
                  </summary> 
  let $newContent := <content type="application/x-www-form-urlencoded" 
                              src="http://atomfeeds.com?col=97"/> 
  let $created := <created by="johnb@ibm.com">2007-09-26T21:15:10.541636Z</created> 
  let $updated := <updated by="johnb@ibm.com">2007-09-26T21:15:10.541636Z</updated> 
  let $linkSelf := <link rel="self" href="http://atomfeeds.com?col=97"/> 
  let $linkEdit := <link rel="edit" href="http://atomfeeds.com?col=97"/> 
  let $linkEditMedia := <link rel="edit-media" href="http://atomfeeds.com?col=97&media"/> 
  return transform copy $c := $doc 
         modify (do delete $c/entry/published, 
                 do replace value of $c/entry/title with $newTitle, 
                 do replace $c/entry/author with $newAuthor, 
                 do replace $c/entry/content with $newContent, 
                 do insert $newId after $c/entry/author, 
                 do insert $summary after $c/entry/author, 
                 do insert $created after $c/entry/author, 
                 do insert $updated after $c/entry/author, 
                 do insert $linkSelf after $c/entry/author, 
                 do insert $linkEdit after $c/entry/author, 
                 do insert $linkEditMedia after $c/entry/author) 
         return $c@




위로


몇 가지 가이드라인

데이터베이스에 XML을 저장하고 수정 요청을 처리할 때의 일반적인 디자인 전략은 원래 저장된 XML을 변경하지 않은 상태로 두고 내용이 변경된 시기와 변경 내용의 적용 시기를 함께 표시한(예: 타임스탬프, 버전 관리 또는 둘 모두 사용) 내용이 수정된 새 버전의 XML을 만드는 것이다. 일부 업계 메시지 형식은 수정된 데이터가 명시적인 버전 관리를 통해 어떻게 처리되어야 하는지 설명한다(예: 의료계).

일부 종류의 버전 관리나 타임스탬프를 통합하는 디자인 접근 방법은 외부 세계에서 일어나는 것을 밀접하게 반영하며 컴퓨터 시스템에서의 처리를 현실의 관습 및 사례와 쉽게 연관시킨다. 또한 버전을 관리하고 타임스탬프를 사용하면 호환성도 쉽게 처리할 수 있다.




위로


결론

이 글에서는 XQuery 업데이트를 사용하여 메모리 또는 DB2 pureXML 데이터베이스에 저장된 XML을 의료계, 기업, 금융, 정보 기술 등 네 업계와 관련하여 수정할 수 있는 방법을 보여주었다.

특별히 돈과 관련된 분야에서 정보를 직접 수정하는 일은 실제로 흔하지 않지만 일반적으로 변경 사항의 기록을 유지하는 것은 좋은 사례라고 할 수 있다. XML 메시지와 기존에 저장된 XML에서 파생된 새 버전의 메시지를 저장하면 통제와 호환성 이니셔티브 지원에 도움이 된다.

이 글에서는 XQuery 업데이트 기능을 통해 저장된 XML의 새 버전을 만들고 위 가이드라인에 따라 감사를 유지할 필요가 없거나 다른 시스템이 감사를 수행하는 경우 저장된 XML의 내부 대체를 수행하는 방법을 설명했다. 또한 XML 요청 메시지에서 파생된 XML 응답 메시지를 생성하는 데 XQuery 업데이트를 사용하는 방법과 뷰를 사용하여 정보를 숨기는 방법도 설명했다.



참고자료

교육
  • Industry Formats and Services with pureXML: 다양한 예제를 무료로 다운로드한다. 각 예제는 XML 기반의 업계 형식과 pureXML 사용 방법을 보여준다. 또한 XML 스키마 등록 방법, XML 인스턴스 문서의 유효성 검사 수행 방법, XQuery나 SQL/XML을 사용하여 XML 데이터를 쿼리하는 방법 등 많은 정보가 설명되어 있다.

  • W3C의 XQuery Update 명세: XQuery(XML Query Language) Update Facility의 사양을 확인한다.

  • "Update XML in DB2 9.5"(developerWorks, 2007년 10월): XML에 지속적인 변경을 가능하게 하는 XQuery Update Facility인 DB2 pureXML의 새 기능에 대한 정보를 얻는다. 또한 이 글에서는 DB2 pureXML의 XQuery Update Facility를 설명하는 유용한 예제를 제공한다.

  • 위키백과의 HL7 설명: SDO(Standards Developing Organization) HL7(Health Level 7)에 대한 간략한 정보를 얻는다.

  • HL7: SDO HL7의 기본 페이지로 표준 자체에 대한 참고자료를 확인한다(예: 추가 링크, 컨퍼런스 세부사항, 사양).

  • 위키백과의 UBL 설명: UBL(Universal Business Language)에 대한 간략한 정보를 얻는다.

  • UBL: OASIS의 UBL TC(Technical Committee)에 대한 자세한 정보를 얻는다.

  • 위키백과의 FpML 설명: FpML(Finanacial product Markup Language)에 대한 간략한 정보를 얻는다.

  • FpML: FpML의 기본 페이지로 다른 많은 참고자료가 제공된다(예: 도구, 문서).

  • 위키백과의 Atom 설명: Atom Syndication Format과 Atom Publishing Protocol에 대한 간략한 정보를 얻는다.

  • Atom Publishing Protocol: IETF의 RFC5023에서 Atom Publishing Protocol을 설명한다.

  • Health Level 7 (HL7) Clinical Document Architecture(CDA): CDA의 원래 사양.

  • developerWorks 정보 관리 존: 정보 관리에 대해 학습한다. 기술 문서, 사용 방법에 대한 글, 교육, 다운로드, 제품 정보 등을 확인한다.

  • developerWorks 기술 행사와 웹 캐스트

  • 기술 서점: 본 주제와 기타 기술 항목에 대한 책을 찾아본다.

제품 및 기술 얻기
  • DB2 Express-C: DB2의 무료판을 다운로드하라. 이 제품에는 pureXML 기술 같은 Data Servers의 핵심 기능이 들어있다. DB2 Express-C는 자유롭게 개발, 배치, 배포할 수 있다.

  • developerWorks에서 직접 다운로드할 수 있는 IBM 시험판 소프트웨어를 차기 개발 프로젝트에 사용해 보라.


토론


필자소개

Susan Malaika

Susan Malaika는 IBM Software Group에 속한 IBM Information Management Group의 상급 기술 직원이다. 전문 분야는 XML, 웹, 데이터베이스다. Susan은 Global Grid Forum의 그리드 환경에 대한 데이터를 지원하는 표준을 개발했다. IBM 제품 소프트웨어 개발자로 일하면서 동시에 인터넷 전문가, 데이터 분석가, 애플리케이션 디자이너, 개발자로 활동한다. 또한 웹에 관한 책의 공동 저자로서 트랜잭션 처리와 XML에 관한 기사를 게시한다. IBM Academy of Technology 회원이다.


Jan-Eike Michels

Jan-Eike Michels는 IBM Software Group에 속한 IBM Information Management Group의 소프트웨어 엔지니어다. SQL과 SQL/XML의 표준화를 담당하는 ANSI/INCITS/H2와 ISO/JTC1/SC32/WG3 위원회에서 IBM을 대표한다. 또한 DB2 XML 개발팀뿐만 아니라 XML을 사용하는 고객 및 비즈니스 파트너와 함께 작업하며 XML 솔루션 구현 작업을 지원한다. Jan-Eike Michels는 독일 Technical University of Ilmenau의 컴퓨터 공학 석사 학위를 보유하고 있다.


Christian Pichler

Christian Pichler는 오스트리아 Technical University of Vienna에서 의료에 관해 컴퓨터 공학과 컴퓨터 과학 석사 논문을 준비 중이다. IBM에서는 DB2에 XML을 저장하는 기술과 웹 서비스를 통해 접근하는 방법, 피드, Xforms를 담당하고 있다. 전문 분야는 의료 분야의 XML 표준이다.




기사에 대한 평가


보다 나은 서비스를 제공하기 위함이오니 잠시 짬을 내어 이 양식을 제출하여 주십시오.



 


 


 


이 문서 북마킹 하기

mar.gar.in mar.gar.in naver naver eolin eolin del.icio.us del.icio.us





위로


developerWorks 콘텐트를 다른 사이트에 전재하기:
developerWorks 콘텐트에 대한 저작권은 IBM에 있습니다. IBM의 서면 허가나 원본 저자의 허락이 없이는 전재를 금합니다. 저희 콘텐트를 전재하시려면 IBM developerWorks 담당자 에게 문의하십시오.
    IBM 소개 개인정보 보호정책 문의