비즈니스를 계속 분석하여 관리할 데이터 유형을 확인하고 이 데이터를 적절히 업데이트하는 작업은 매우 중요하다. XML은 그 유연성으로 인해 매우 유용하게 사용되지만 구조를 정의한 다음 그 구조를 기반으로 XML 데이터를 처리하여 XML 데이터에 신뢰성을 부여해야 한다. XML 스키마는 구조를 정의하는 데 사용된다.
XML 스키마는 비즈니스 분석 결과에 따라 업데이트(전개)된다. XML 스키마를 전개하는 시나리오는 일반적으로 다음과 같다.
-
상향 호환되도록 XML 스키마를 전개한다.
기존의 XML 스키마와 상향 호환되는 XML 스키마를 전개한다. 이렇게 하면 기존의 XML 데이터를 수정하지 않아도 기존의 XML 데이터는 새로운 XML 스키마를 따르게 된다. -
XML 스키마를 전개한 다음(호환성 무시) XML 데이터를 변환한다.
기존의 XML 스키마와 호환되지 않는 XML 스키마를 전개한다. 기존의 XML 데이터를 새 XML 스키마에 맞게 변환한다. -
XML 스키마를 전개한 다음(호환성 무시), XML 데이터를 변환하지 않은 상태에서 XML 데이터를 관리한다.
기존의 XML 스키마와 호환되지 않는 XML 스키마를 전개한다. 기존의 XML 데이터를 변환하지 않으며 기존의 XML 스키마를 사용하여 기존의 XML 데이터를 관리한다.
이 기사에서는 이러한 시나리오를 설명한다.
이 시나리오에서는 기존의 XML 스키마와 상향 호환되는 XML 스키마를 전개한다. 이렇게 하면 기존의 XML 데이터를 수정하지 않아도 기존의 XML 데이터는 새로운 XML 스키마를 따르게 된다.
예를 들면, 이 기사에서는 다음과 같은 간단한 고객 정보를 사용한다. 기존의 XML 스키마는 Listing 1에 있다. XML 스키마를 따르는 XML 데이터는 Listing 2에 있다.
Listing 1. cust1.xsd(XML 스키마)
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="customer">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="phone" type="xs:string"/>
<xs:element name="email" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
|
Listing 2. cust1.xml
<?xml version="1.0"?>
<customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="cust1.xsd">
<name>cust1</name>
<address>address1</address>
<phone>11-2222-3333</phone>
<email>cust1@sample.com</email>
</customer>
|
Listing 1에 있는 XML 스키마는 다음 명령을 사용하여 등록한다. XML 스키마를 등록하고 XML 데이터를 가져오는 과정은 이 시리즈의 첫 번째 기사인 "DB2에서 XML 스키마 관리하기, Part 1: XML 스키마와 XML 데이터 유효성 검사"를 참조한다(참고자료 확인).
주: DB2 명령은 대소문자를 구분하지 않는다. XML 데이터와 스키마 위치는 대소문자를 구분한다. '/work/customer1.xsd'와 같은 실제 위치는 운영 체제에 따라 대소문자 구분 여부가 다르다. (Windows®는 대소문자를 구분하지 않는다. Linux®와 UNIX®는 대소문자를 구분한다.)
REGISTER XMLSCHEMA 'cust1.xsd' FROM '/work/cust1.xsd' AS SAMPLE2.CUST1; COMPLETE XMLSCHEMA SAMPLE2.CUST1; |
다음 명령을 실행하면 T1 테이블이 작성되고 Listing 2에 있는 XML 데이터가 T1 테이블에 삽입된다.
CREATE TABLE T1 (ID INT NOT NULL PRIMARY KEY, XMLDATA XML NOT NULL); IMPORT FROM /work/cust1.del of del XML FROM /work XMLVALIDATE USING SCHEMA SAMPLE2.CUST1 INSERT INTO T1; |
위 IMPORT 명령에서 사용한 cust1.del 파일에는 다음과 같은 정보가 있다. ID 컬럼의 값은 1로 설정된다.
1, "<XDS FIL='cust1.xml'/>" |
다음 SQL 문을 실행하면 T1 테이블에 있는 각 레코드의 유효성을 확인하는 데 사용된 스키마 위치와 XML 스키마 오브젝트 ID, 관계형 ID를 얻을 수 있다. 다음 SQL 문에서는 외부 결합을 사용하며 따라서, 해당 결과에는 유효성을 확인하지 않은 레코드와 이미 삭제된 XML 스키마로 유효성을 확인한 레코드가 공존하게 된다.
db2 => SELECT T1.ID,
XMLXSROBJECTID(T1.XMLDATA) OBJECTID,
substr(XSR.OBJECTSCHEMA,1,12) OBJECTSCHEMA,
substr(XSR.OBJECTNAME,1,12) OBJECTNAME,
substr(XSR.SCHEMALOCATION,1,16) SCHEMALOCATION
FROM T1 LEFT OUTER JOIN SYSCAT.XSROBJECTS XSR
ON XMLXSROBJECTID(T1.XMLDATA)=XSR.OBJECTID;
ID OBJECTID OBJECTSCHEMA OBJECTNAME SCHEMALOCATION
----------- -------------------- ------------ ------------ ----------------
1 65020719620281344 SAMPLE2 CUST1 cust2.xsd
1 record(s) selected.
|
샘플 XML에 있는 phone 요소에는 고객의 집 전화번호가 있다고 가정한다. 이제 XML에 핸드폰 전화번호를 추가한다.
기존의 XML 스키마와 상향 호환되는 새로운 XML 스키마를 정의한다. 이렇게 하려면 기존 요소를 변경하지 않은 상태에서 휴대전화 전화번호(cell-phone 요소)에 해당하는
새 요소를 추가한 다음, 옵션(minOccurs="0")을 사용하여 추가한 요소를 구성해야 한다. Listing 3을 참조한다.
Listing 3. cust2.xsd
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="customer">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="phone" type="xs:string"/>
<xs:element name="cell-phone" minOccurs="0" type="xs:string"/>
<xs:element name="email" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
|
다음 명령을 사용하여 Listing 3에 있는 XML 스키마를 등록한다.
REGISTER XMLSCHEMA 'cust2.xsd' FROM '/work/cust2.xsd' AS SAMPLE2.CUST2; COMPLETE XMLSCHEMA SAMPLE2.CUST2; |
XML 스키마 cust2.xsd는 XML 스키마 cust1.xsd와 호환 가능하며 따라서, cust1.xsd를 cust2.xsd로 바꿀 수 있다.
이렇게 하려면 다음과 같이 UPDATE XMLSCHEMA 명령을 실행한다.
UPDATE XMLSCHEMA SAMPLE2.CUST1 WITH SAMPLE2.CUST2; |
이 명령을 실행하면 관계형 ID SAMPLE2.CUST1을 사용하여 등록한 cust1.xsd가 cust2.xsd로 바뀐다.
Listing 4는 새로운 XML 스키마를 따르는 XML 데이터이다.
Listing 4. cust2.xml
<?xml version="1.0"?>
<customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="cust1.xsd">
<name>cust2</name>
<address>address2</address>
<phone>22-3333-4444</phone>
<cell-phone>090-4444-5555</cell-phone>
<email>cust2@sample.com</email>
</customer>
|
다음 명령을 실행하여 관계형 ID SAMPLE2.CUST1으로 등록한 XML 스키마를 사용하여 유효성을 확인한 다음, XML 데이터를 T1 테이블에 삽입한다. 이 명령은 정상적으로 수행될 것이다.
IMPORT FROM /work/cust2.del of del XML FROM /work XMLVALIDATE USING SCHEMA SAMPLE2.CUST1 INSERT INTO T1; |
위 IMPORT 명령에서 사용한 cust2.del 파일에는 다음과 같은 정보가 들어 있다. 해당 ID 컬럼의 값은 2로 설정된다.
2, "<XDS FIL='cust2.xml'/>" |
다음 SQL 문을 다시 실행하여 각 XML 데이터 세트의 유효성을 확인하는 데 어떤 XML 스키마가 사용되었는지 확인한다.
db2 => SELECT T1.ID,
XMLXSROBJECTID(T1.XMLDATA) OBJECTID,
substr(XSR.OBJECTSCHEMA,1,12) OBJECTSCHEMA,
substr(XSR.OBJECTNAME,1,12) OBJECTNAME,
substr(XSR.SCHEMALOCATION,1,16) SCHEMALOCATION
FROM T1 LEFT OUTER JOIN SYSCAT.XSROBJECTS XSR
ON XMLXSROBJECTID(T1.XMLDATA)=XSR.OBJECTID;
ID OBJECTID OBJECTSCHEMA OBJECTNAME SCHEMALOCATION
----------- -------------------- ------------ ------------ ----------------
1 65020719620281344 SAMPLE2 CUST1 cust2.xsd
2 65020719620281344 SAMPLE2 CUST1 cust2.xsd
2 record(s) selected.
|
ID가 2인 XML 데이터의 유효성을 확인하는 데는 새로운 XML 스키마가 사용된다. 위 결과에서 알 수 있듯이 XML 스키마를 업데이트한 후에도 오브젝트 ID는 변경되지 않는다. 또한, 앞서 유효성을 확인한 XML 데이터(이 예제에서 ID가 1인 XML 데이터)도 새로운 XML 스키마를 따른다.
관계형 ID 역시 변경되지 않지만 해당 스키마 위치는 새 XML 스키마의 위치로 변경된다. 다음 SQL 문을 실행하여 등록된 각 XML 스키마의 관계형 ID와 스키마 위치를 가져온다.
db2 => SELECT OBJECTID,
substr(OBJECTSCHEMA,1,12) OBJECTSCHEMA,
substr(OBJECTNAME,1,12) OBJECTNAME,
substr(SCHEMALOCATION,1,16) SCHEMALOCATION
FROM SYSCAT.XSROBJECTS;
OBJECTID OBJECTSCHEMA OBJECTNAME SCHEMALOCATION
-------------------- ------------ ------------ ----------------
65020719620281344 SAMPLE2 CUST1 cust2.xsd
66857945295662336 SAMPLE2 CUST2 cust2.xsd
2 record(s) selected.
|
위 결과에서 알 수 있듯이 두 개의 레코드가 같은 스키마 위치를 가리킨다. 이러한 경우에는 XML 데이터의 유효성을 확인하는 데 스키마 위치를 사용하지 않는다. 스키마 위치가 cust2.xsd인 XML 스키마 중 어느 것을 사용해야 하는지 식별하기는 불가능하기 때문에 스키마 위치 cust2.xsd를 사용하여 XML 데이터의 유효성을 확인하는 과정은 아래와 같이 실패한다.
db2 => INSERT INTO T1(ID, XMLDATA) VALUES (22,
XMLVALIDATE(XMLPARSE(DOCUMENT
'<?xml version="1.0"?>
<customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="cust2.xsd">
<name>cust2-2</name>
<address>address2-2</address>
<phone>33-4444-5555</phone>
<cell-phone>090-5555-6666</cell-phone>
<email>cust2-2@sample.com</email>
</customer>'))
);
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL16196N XML document contains an element "customer" that is not correctly
specified. Reason code = "37" SQLSTATE=2200M
|
아래와 같이 XML 스키마 중 하나를 삭제하면 위에 있는 INSERT문이 정상적으로 실행된다.
DROP XSROBJECT SAMPLE2.CUST2; |
따라서, 기존의 XML 스키마를 새 XML 스키마로 바꾼 다음에는 새 XML 스키마를 삭제해야 한다. 이를 위해 UPDATE XMLSCHEMA 명령에서 DROP NEW SCHEMA 옵션을 사용할 수 있다.
UPDATE XMLSCHEMA SAMPLE2.CUST1 WITH SAMPLE2.CUST2 DROP NEW SCHEMA; |
또한, 스키마 위치를 새 위치로 바꿀 수도 있다. 그러면 기존의 XML 데이터에 포함된 스키마 위치는 맞지 않게 된다. 이러한 문제점은 아래와 같이 기존의 스키마 위치를 사용하는 새로운 XML 스키마를 등록하면 해결할 수 있다.
REGISTER XMLSCHEMA 'cust1.xsd' FROM '/work/cust2.xsd' AS SAMPLE2.CUST2; COMPLETE XMLSCHEMA SAMPLE2.CUST2; |
그런 다음 DROP NEW SCHEMA 옵션을 사용하여 XML 스키마를 다시 업데이트한다.
UPDATE XMLSCHEMA SAMPLE2.CUST1 WITH SAMPLE2.CUST2 DROP NEW SCHEMA; |
이렇게 하면 XML 스키마를 바꾸고 나서도 스키마 위치를 사용하여 XML 데이터의 유효성을 확인할 수 있다.
XML 스키마를 기존의 XML 스키마와 상향 호환되도록 전개하면 기존의 XML 데이터를 별도로 수정하지 않아도 새 XML 스키마를 사용하여 기존의 XML 데이터를 관리할 수 있다. 다시 말해서,
새로 추가한 요소와 속성은 상향 호환성을 유지하기 위해 선택사항이 되어야 하며 따라서, 새로 추가한 정보가 필수가 되는 경우에는 이러한 요소와 속성의 존재 여부에
대해서는 유효성을 확인할 수 없다. (위 예제에서는 cell-phone 요소를 추가하였다.
그러나 이 요소는 선택사항으로 추가되며 따라서, cell-phone 요소가 없는 XML 데이터 또한 정상적으로 유효성이 확인된다.)
상향 호환성을 유지하는 데 필요한 기타 요구사항은 DB2 Information Center 및 developerWorks 기사,
"Evolving your XML schemas using DB2 pureXML"를 참조한다. 해당 링크는 참고자료를 확인한다.
XML 스키마를 전개한 다음(호환성 무시), XML 데이터 변환
이 시나리오에서는 기존의 XML 스키마와 호환되지 않는 XML 스키마를 전개한다. 기존 XML 데이터는 새로운 XML 스키마에 맞게 변환된다.
Listing 5에는 phone 요소 아래에 home 및 cell 요소가 추가되어
있으며 이러한 요소를 사용하여 고객의 집 전화번호와 휴대전화 전화번호를 적절하게 관리한다. 해당 XML 스키마는 Listing 6에 있다.
Listing 5. cust3.xml
<?xml version="1.0"?>
<customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="cust3.xsd">
<name>cust3</name>
<address>address3</address>
<phone>
<home>44-5555-6666</home>
<cell>090-6666-7777</cell>
</phone>
<email>cust3@sample.com</email>
</customer>
|
Listing 6. cust3.xsd
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="customer">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="phone" type="phoneType"/>
<xs:element name="email" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="phoneType">
<xs:sequence>
<xs:element name="home" type="xs:string"/>
<xs:element name="cell" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
|
아래와 같이 XML 스키마(Listings 6)를 등록하고 XML 데이터(Listing 5)를 가져온다.
REGISTER XMLSCHEMA 'cust3.xsd' FROM '/work/cust3.xsd' AS SAMPLE2.CUST3; COMPLETE XMLSCHEMA SAMPLE2.CUST3; IMPORT FROM /work/cust3.del of del XML FROM /work XMLVALIDATE USING SCHEMA SAMPLE2.CUST3 INSERT INTO T1; |
위 IMPORT 명령에서 사용한 cust3.del 파일에는 다음과 같은 정보가 있다. ID 컬럼의 값은 3으로 설정된다.
3, "<XDS FIL='cust3.xml'/>" |
다음 SQL 문을 다시 실행하여 각 XML 데이터 세트의 유효성을 확인하는 데 어떤 XML 스키마가 사용되었는지 확인한다.
db2 => SELECT T1.ID,
XMLXSROBJECTID(T1.XMLDATA) OBJECTID,
substr(XSR.OBJECTSCHEMA,1,12) OBJECTSCHEMA,
substr(XSR.OBJECTNAME,1,12) OBJECTNAME,
substr(XSR.SCHEMALOCATION,1,16) SCHEMALOCATION
FROM T1 LEFT OUTER JOIN SYSCAT.XSROBJECTS XSR
ON XMLXSROBJECTID(T1.XMLDATA)=XSR.OBJECTID;
ID OBJECTID OBJECTSCHEMA OBJECTNAME SCHEMALOCATION
----------- -------------------- ------------ ------------ ----------------
1 65020719620281344 SAMPLE2 CUST1 cust1.xsd
2 65020719620281344 SAMPLE2 CUST1 cust1.xsd
22 65020719620281344 SAMPLE2 CUST1 cust1.xsd
3 68398419340809216 SAMPLE2 CUST3 cust3.xsd
4 record(s) selected.
|
ID가 1, 2 및 22인 XML 데이터는 Listing 3에 있는 XML 스키마 cust2.xsd를 따른다. (관계형 ID SAMPLE2.CUST1을 사용하는 XML 스키마는 스키마 위치 cust1.xsd로 등록된 XML 스키마 cust2.xsd(Listing 3)와 교체된다.) 이러한 XML 데이터 세트는 cust3.xsd에 맞게 다음과 같이 변경해야 한다.
-
/customer/phone아래에home과cell요소를 추가해야 한다. -
/customer/phone값은/customer/phone/home으로 이동된다. -
/customer/cell-phone이 정의되면 이 값이/customer/phone/cell로 이동하고/customer/cell-phone이 삭제된다. -
xsi:noNamespaceSchemaLocation속성 값은 cust3.xsd로 변경된다. (XML 데이터의 유효성을 확인할 때 관계형 ID를 사용한 경우에는 필요하지 않다.)
다음 SQL 문을 실행하여 관계형 ID SAMPLE2.CUST1을 사용하는 XML 스키마를 이용하여 유효성이 확인된 XML 데이터에 위의 변경사항을 적용하고 스키마 위치 cust3.xsd를 사용하는 XML 스키마를 이용하여 변경된 XML 데이터의 유효성을 확인한다.
UPDATE T1
SET XMLDATA=XMLVALIDATE(XMLQUERY(
'declare namespace xsi="http://www.w3.org/2001/XMLSchema-instance";
copy $new := $XMLDATA
modify (
do replace $new/customer/phone with
<phone>
<home>{$new/customer/phone/text()}</home>
<cell>{$new/customer/cell-phone/text()}</cell>
</phone>,
do replace value of $new/customer/@xsi:noNamespaceSchemaLocation with "cust3.xsd",
do delete $new/customer/cell-phone )
return $new'))
WHERE XMLXSROBJECTID(XMLDATA)=(SELECT OBJECTID FROM SYSCAT.XSROBJECTS WHERE
OBJECTSCHEMA='SAMPLE2' AND OBJECTNAME='CUST1')
|
다음 SQL 문을 다시 실행하여 각 XML 데이터의 유효성을 확인하는 데 어떤 XML 스키마가 사용되었는지 확인한다. 그러면 스키마 위치 cust3.xsd를 사용하는 XML 스키마로 유효성을 확인한 모든 레코드가 해당 결과로 표시된다.
db2 => SELECT T1.ID,
XMLXSROBJECTID(T1.XMLDATA) OBJECTID,
substr(XSR.OBJECTSCHEMA,1,12) OBJECTSCHEMA,
substr(XSR.OBJECTNAME,1,12) OBJECTNAME,
substr(XSR.SCHEMALOCATION,1,16) SCHEMALOCATION
FROM T1 LEFT OUTER JOIN SYSCAT.XSROBJECTS XSR
ON XMLXSROBJECTID(T1.XMLDATA)=XSR.OBJECTID;
ID OBJECTID OBJECTSCHEMA OBJECTNAME SCHEMALOCATION
----------- -------------------- ------------ ------------ ----------------
1 68398419340809216 SAMPLE2 CUST3 cust3.xsd
2 68398419340809216 SAMPLE2 CUST3 cust3.xsd
22 68398419340809216 SAMPLE2 CUST3 cust3.xsd
3 68398419340809216 SAMPLE2 CUST3 cust3.xsd
4 record(s) selected.
|
다음 SQL 문을 실행하여 T1 테이블에 있는 XML 데이터와 해당 ID를 확인한다.
SELECT ID, XMLSERIALIZE(XMLDATA AS VARCHAR(500)) FROM T1; |
UPDATE문을 사용하여 네임스페이스를 추가하거나 변경할 수 있지만 모든 요소를 맵핑해야 한다. Listing 6에 있는 cust3.xsd에 네임스페이스 "http://www.sample.com/customer3"가 있는 경우에는 다음과 같은 UPDATE문을 수행한다.
UPDATE T1
SET XMLDATA=XMLVALIDATE(XMLQUERY(
'declare namespace xsi="http://www.w3.org/2001/XMLSchema-instance";
declare namespace cust="http://www.sample.com/customer3";
copy $new := $XMLDATA
modify (
do replace $new/customer with
<cust:customer xsi:schemaLocation="http://www.sample.com/customer3 cust3.xsd">
<cust:name>{$new/customer/name/text()}</cust:name>
<cust:address>{$new/customer/address/text()}</cust:address>
<cust:phone>
<cust:home>{$new/customer/phone/text()}</cust:home>
<cust:cell>{$new/customer/cell-phone/text()}</cust:cell>
</cust:phone>
<cust:email>{$new/customer/email/text()}</cust:email>
</cust:customer> )
return $new'))
WHERE XMLXSROBJECTID(XMLDATA)=(SELECT OBJECTID FROM SYSCAT.XSROBJECTS WHERE
OBJECTSCHEMA='SAMPLE2' AND OBJECTNAME='CUST1')
|
XML 스키마를 전개한 다음(호환성 무시), XML 데이터를 변환하지 않은 상태에서 XML 데이터 관리
이 시나리오에서는 기존의 XML 스키마와 호환되지 않는 XML 스키마를 전개한다. 기존의 XML 데이터를 변환하지 않으며 기존의 XML 스키마를 사용하여 기존의 XML 데이터를 관리한다. DB2에서는 동일한 컬럼에 다른 유형의 XML 데이터가 포함될 수 있다.
이 시나리오에서는 애플리케이션에서 각기 다른 XML 스키마를 사용하여 각 XML 데이터 세트를 처리해야 한다.
상향 호환성을 유지하면서 XML 스키마를 전개할 때 발생하는 문제점을 앞서 살펴보았으며 이러한 경우에는 새로 추가한 요소와 속성의 존재 여부를 확인할 수 없다. 이 시나리오에서는 이러한 요소와 속성의 존재를 확인할 수 있다. 그리고 기존의 요소와 속성을 변경하지 않으면 같은 프로그램에서 다양한 XML 스키마를 사용할 수 있다. (그러나 새로 추가한 요소와 속성의 값을 얻을 수 없는 경우를 처리해야 한다.)
그림 1의 예제에서는 XML 스키마 오브젝트 ID와 그 버전이 애플리케이션에서 쌍으로 유지된다. 이 버전은 개발자가 지정하는 것이며 이 버전을 이용하여 해당 XML 구조(즉, XML 스키마)를 알 수 있다. 또한, 버전으로 관계형 ID나 스키마 위치를 알 수도 있다. XML 데이터를 가져올 때도 애플리케이션은 XML 스키마 오브젝트 ID를 가져온다. 그런 다음, 애플리케이션은 스키마 오브젝트 ID와 연관된 버전을 통해 XML 스키마를 식별하고 이 버전을 기반으로 XML 데이터를 처리한다.
그림 1. XML 데이터 처리, 여기서는 다양한 XML 스키마 중 하나를 사용하여 각 XML 데이터의 유효성을 확인한다.
그림 2의 예제에서는 또 다른 컬럼 값(Creation date)의 XML 데이터에 사용된 XML 스키마를 애플리케이션에서 식별한다. XML 데이터를 가져올 때도 애플리케이션은 해당 컬럼을 가져와서 XML 스키마를 식별한 다음, 이 스키마를 기반으로 XML 데이터를 처리한다. 그림 2에서는 애플리케이션이 작성 날짜 범위와 연관된 관계형 ID가 있는 테이블을 유지한다. 관계형 ID 대신 스키마 위치나 버전 번호 같은 것을 사용하여 XML 스키마를 식별할 수도 있다.
그림 2. XML 데이터 처리, 여기서는 다양한 XML 스키마 중 하나를 사용하여 각 XML 데이터의 유효성을 확인한다.
INSERT/UPDATE문과 함께 XMLVALIDATE 함수/옵션을 사용하거나 IMPORT 명령을 사용하여 XML 데이터의 유효성을 확인하는 대신, 트리거를 사용할 수도 있다. 다음 "CREATE TRIGGER"문은 UPDATE문을 처리하기 위한 것으로 CREATION_DATE 컬럼 값이 2008-01-01(Listing 7) 이상이면 관계형 ID가 SAMPLE2.ORDER2008인 XML 스키마를 사용하여 XML 데이터의 유효성을 확인하고 CREATION_DATE 컬럼 값이 2002-01-01과 2007-12-31(Listing 8) 사이에 있으면 관계형 ID가 SAMPLE2.ORDER2002인 XML 스키마를 사용하여 XML 데이터의 유효성을 확인한다. INSERT문에 대해서도 동일한 작업을 수행할 수 있으며 또한, INSERT문은 IMPORT 명령에 영향을 받는다. LOAD 명령은 IMPORT 명령과 유사하다. LOAD 명령은 트리거를 호출하지 않지만 이 명령에는 IMPORT 명령의 구문과 비슷한 구문을 사용하는 XMLVALIDATE 옵션이 있다.
Listing 7. CREATION_DATE 컬럼 값이 "2008-01-01" 이상인 XML 데이터의 유효성을 확인하기 위한 트리거
CREATE TRIGGER UPDATE_ORDER2008 NO CASCADE BEFORE UPDATE ON SAMPLE2.ORDER REFERENCING NEW AS N FOR EACH ROW WHEN (N.CREATION_DATE >= '2008-01-01') BEGIN ATOMIC SET (N.XMLDATA) = XMLVALIDATE(N.XMLDATA ACCORDING TO XMLSCHEMA ID SAMPLE2.ORDER2008); END |
Listing 8. CREATION_DATE 컬럼 값이 2002-01-01과 2007-12-31 사이에 있는 XML 데이터의 유효성을 확인하기 위한 트리거
CREATE TRIGGER UPDATE_ORDER2002 NO CASCADE BEFORE UPDATE ON SAMPLE2.ORDER REFERENCING NEW AS N FOR EACH ROW WHEN (N.CREATION_DATE < '2008-01-01' AND N.CREATION_DATE >= '2002-01-01') BEGIN ATOMIC SET (N.XMLDATA) = XMLVALIDATE(N.XMLDATA ACCORDING TO XMLSCHEMA ID SAMPLE2.ORDER2002); END |
기존의 XML 스키마와 상향 호환되는 XML 데이터를 전개하는 경우에는 데이터를 수정하지 않아도 새 XML 스키마를 사용하여 기존 XML 데이터를 관리할 수 있다. XML 스키마를 전개한 후에도 XML 데이터의 유효성을 확인하는 데 사용한 XML 스키마를 관계형 ID나 스키마 위치를 사용하여 식별할 수 있다. 그러나 스키마 위치를 사용할 경우에는 기존의 XML 스키마를 새 XML 스키마로 바꾸고 나서 새 XML 스키마를 삭제해야 한다. 또한, 기존 XML 스키마를 바꾸기 전에 새 XML 스키마를 등록할 경우에는 기존 XML 스키마와 같은 스키마 위치를 사용하여 새 XML 스키마를 등록해야 한다.
상향 호환되는 XML 스키마를 전개할 때 발생하는 문제점은 XML 데이터의 유효성을 확인하는 과정에서 새로 추가한 요소와 속성의 존재 여부를 확인할 수 없다는 점이다. 또 다른 문제점은 새로운 요구사항의 반영으로 XML 데이터가 잘못될 가능성이 있으며 이로 인해 오류가 발생할 수 있다는 점이다. 이러한 문제점을 해결하려면 기존의 XML 스키마와 호환되지 않는 XML 스키마를 전개해야 한다. 이렇게 하기 위한 시나리오로는 두 가지가 있으며 기존의 XML 데이터를 새 XML 스키마와 호환되도록 변환하거나 XML 데이터를 그대로 기존 XML 스키마를 사용하여 관리하는 것이다.
교육
- DB2에서 XML 스키마 관리하기, Part 1: XML 스키마와 XML 데이터 유효성 검사(Masahiro Ohkawa, developerWorks, 2010년 2월):
이 시리즈의 첫 번째 기사에서 스키마 위치와 관계형 ID를 탐색하여 XML 스키마를 관리하고 XML 데이터의 유효성을 확인하는 과정을 확인할 수 있다.
- IBM DB2 9.7 for Linux, UNIX and Windows Information Center: 스키마 전개 및 DB2 명령의 사용에 관한 자세한 정보를 찾을 수 있다.
- Altering registered XSR objects: DB2 Information Center의 이 섹션에서 XSR 오브젝트 등록에 필요한 자세한 정보를 얻을 수 있다.
- Evolving an XML schema: DB2 Information Center의 이 섹션에서 XML 스키마의 전개와 관련된 자세한 정보를 얻을 수 있다.
- REGISTER XMLSCHEMA 명령: 이 DB2 문서를 확인하면 이 명령에 관한 자세한 정보를 얻을 수 있다.
- UPDATE XMLSCHEMA 명령: DB2 Information Center의 이 섹션에서 이 명령에 대한 구문을 찾을 수 있다.
- SYSCAT.XSROBJECTS 카탈로그 뷰: 이 DB2 Information Center에서 자세한 관련 정보를 얻을 수 있다.
- XMLXSROBJECTID 스칼라 함수: DB2 Information Center의 이 섹션에서 이 함수에 관한 자세한 정보를 확인할 수 있다.
- XMLVALIDATE 함수: 이 DB2 문서에서 이 함수에 관한 자세한 정보를 얻을 수 있다.
- IMPORT 명령: 이 DB2 문서에서 IMPORT 명령에 관한 자세한 정보를 얻을 수 있다.
- Trigger processing of XML data: DB2 Information Center의 이 섹션에서 트리거를 사용한 XML 데이터 처리에 관한 자세한 정보를 얻을 수 있다.
- DB2 9 pureXML Guide: 이 IBM Redbook에서 pureXML 데이터 저장소, 하이브리드 데이터베이스 디자인 및 관리에 관한 자세한 정보를 찾을 수 있다.
- Evolving your XML schemas using DB2 pureXML(Khurram Faraaz, Ronny Bartsch, Susan Malaika, developerWorks, 2008년 3월):
DB2 pureXML Schema Registry(XSR) 기능을 사용하여 XML 스키마의 전개와 관련된 변경사항을 처리하는 방법을 학습할 수 있다.
- "Preserving XML queries during schema evolution"(Mirella Moura Moro, Susan Malaika, Lifyeow Lim, developerWorks, 2007년 6월):
XML 스키마의 변경과 무관하게 제대로 작동하는 쿼리를 작성하는 데 필요한 안내서를 확인할 수 있다. 이 기사에서는 XML 스키마를 전개하는 과정에서
XML 스키마에 적용할 수 있는 변경사항을 다양하게 분류한다. 그런 다음, 이러한 변경사항이 스키마 유효성 확인 프로세스(백워드 밸리데이션 및 포워드 밸리데이션)와
쿼리 평가에 미치는 영향을 시험한다.
- Update XML in DB2 9.5(Matthias Nicola, Uttam Jain, developerWorks, 2007년 10월):
XQuery Update Facility를 이용하면 XML 문서에서 개별 요소와 속성을 수정하거나 삽입, 삭제할 수 있다. 이 기사에서는 새로운
XML XQuery Update Facility 기능, XML 업데이트 조작에 관한 대표적인 예 및 일반적인 오류를 피하는 방법에 관한 자세한 정보를 확인할 수 있다.
- Getting Started with IBM DB2 Express-C: DB2 Express-C 홈 페이지이다.
- developerWorks XML 영역: XML 관련 기술을 향상시키는 데 참고가 되는 관련 자료를 얻을 수 있다.
- IBM XML 인증: XML 및 관련 기술에 대한 IBM 인증 개발자가 되는 방법을 찾아볼 수 있다.
- XML 기술 자료: developerWorks XML 영역에서 다양한 기술 관련 기사와 팁, 튜토리얼, 표준 및 IBM Redbook을 볼 수 있다.
- developerWorks 기술 행사 및 웹 캐스트: 이들 세션에 참가하여 최신 기술에 대한 정보를 얻을 수 있다.
- developerWorks 팟캐스트: 소프트웨어 개발자의 흥미로운 인터뷰와 토론을 확인할 수 있다.
제품 및 기술 얻기
- IBM 제품 평가판을 다운로드하거나 IBM SOA Sandbox의 온라인 시험판을 살펴보고 DB2®, Lotus®, Rational®, Tivoli® 및
WebSphere®의 애플리케이션 개발 도구 및 미들웨어 제품을 사용해 볼 수 있다.
토론
- 포럼에 참여하기.
- XML 영역 토론 포럼: 다양한 XML 관련 토론에 참여할 수 있다.
- developerWorks 포럼 & 블로그: 블로그에 있는 글을 읽거나 참여할 수 있다.