 |
|
난이도 : 중급 Khurram Faraaz, Systems Software Engineer, IBM Ronny Bartsch, Software Developer, IBM Susan Malaika, Senior Technical Staff Member, IBM Japan
2008 년 5 월 20 일 XML을 사용하는 많은 시스템에서 XML 스키마는 계속 진화할 것입니다. 본 글에서는 DB2® pureXML Schema Registry(XSR) 기능을 사용해 스키마의 변화를 처리하는 방법을 배우고 (중요도에 상관 없이) 단계별로 스키마 변화의 예제를 따라해 보겠습니다.
소개
DB2 pureXML은 다양한 XML 인스턴스 문서(제대로 된 문서라면)를 단일 행에 저장할 수 있는 XML 데이터 유형을 지원한다. 저장된 XML 문서는 DB2 XML Schema Repository(XSR)에 등록된 하나 이상의 XML 스키마에 대해 유효성을 입증받을 수 있다.
많은 시스템에서 XML 스키마는 해마다 적어도 한두 번 변화한다. 몇 가지 선택적 요소나 속성만이 소개되는 정도로 경미한 변화인 경우도 있다. 데이터베이스에 저장된 기존 문서가 새 스키마에 맞춰질 수도 있다. 스키마의 변화가 크지 않고 진화하는 XML 스키마를 위한 DB2 호환성 규칙에 따르는 경우 스키마는 호환된다(compatible)고 말한다. 이 경우 XSR에서 옛 스키마는 새 스키마로 바뀐다.
스키마가 크게 바뀔 때도 있다. 데이터베이스의 기존 문서가 새 스키마와 상충돼 더 이상 유효하지 않은 경우도 있다. 이런 경우 옛 스키마가 새 스키마로 바뀌는 것이 아니라 XSR에 추가된다. 데이터베이스에 삽입되거나 수정된 유효성 검사가 필요한 새 문서는 명시적으로 XMLBALIDATE 문에서 새 스키마에 참조하거나 XML 인스턴스에 있는 URI(uniform resource identifier)의 새 스키마를 참조하여 새 스키마에 대해 유효하게 된다.
스키마의 변화가 경미하든 중요하든 또는 스키마 유효성이 사용됐든 사용되지 않았든, 모든 경우 XML 인스턴스 문서는 DB2 pureXML의 같은 XML 행에 계속 저장되거나 접근될 수 있다.
DB2 XML 스키마 처리 개요
스키마 등록
스키마를 등록할 때 REGISTER SCHEMA 명령을 사용해 두 가지 종류의 이름을 스키마에 부여할 수 있다.
- SQL 이름, 예를 들어 TEST.customer - 일반적으로 유효한 스키마의 엄격한 통제를 필요로 하는 애플리케이션에서 유효성 검사 시간 또는 일치하는 XML 인스턴스 문서가 스키마 위치(location) 힌트를 가지고 있지 않을 때 사용된다.
- 스키마 위치 URI, 예를 들어 http://www.test.com/customer - 일반적으로 스키마 위치 힌트를 통해 XML 인스턴스 문서가 스키마에 보내질 때 사용된다.
그림 1. 스키마 등록
스키마 유효성 검사
XMLVALIDATE 함수를 사용해 SQL 이름을 지정하거나 인스턴스 문서에 포함된 스키마 위치 URI에 의존해 XSR에 등록된 하나 이상의 XML 스키마와 맞는 인스턴스 문서를 확인할 수 있다.
스키마 변화
종종 XML 스키마는 변화하여 비즈니스 환경 변화를 반영한다. 막 변화하려는 스키마에 대해 저장된 문서의 유효성을 검사한다면 DB2 pureXML에서는 두 가지 방법으로 진행된다.
- 두 스키마가 충분히 비슷하다면(호환된다면) 원래 스키마를 바꾸고 유효성 검사를 계속해 XSR에 새 스키마를 등록할 수 있다. 두 가지 스키마 이름 모두(SQL 이름과 스키마 위치 URI) 두 가지 호환 가능한 스키마에서 똑같이 남는다.
- 두 XML 스키마가 호환되지 않는다면 새 스키마를 새 SQL 이름과 새 스키마 위치 URI로 등록한다.
새 호환 가능한 스키마로 변화한 후 XMLVALIDATE를 사용할 때 기존 SQL 이름으로 새 XML 스키마를 계속 참조할 수 있거나, 기존 또는 새 XML 인스턴스 문서를 통틀어 변화없는 URI를 제공하는 XML 인스턴스 문서의 스키마 위치 URI에 의존할 수 있다.
스키마 변화 단계
스키마의 변화가 경미한 경우, 기존 스키마를 새로 수정된 스키마로 바꿔 XSR에서 XML 스키마를 발전시키는 단계를 살펴보자.
- 프로시저에 저장된 XSR_REGISTER를 호출하거나 REGISTER XMLSCHEMA 명령을 실행하여 XSR에 새 XML 스키마를 등록하자. 2번에서 설명하는 것처럼 기존 스키마를 새 스키마로 바꾸고자 한다면 새로 등록된 XML 스키마로 문서의 유효성 검사를 하면 안 됨을 명심하자.
- 프로시저에 저장된 XSR_UPDATE를 호출하거나 UPDATE XMLSCHEMA 명령을 실행하여 기존 스키마를 바꿔 XSR에 새 XML 스키마를 업데이트하자.
성공적으로 스키마가 바뀌면 기존 스키마를 대신한다. 한 번 바뀌면 업데이트된 XML 스키마만 남는다.
dropnewschema 옵션이 프로시저에 저장된 XSR_UPDATE나 업데이트 XMLSCHEMA 명령에서 사용된다면 새 스키마는 기존 스키마 이름 하에서만 존재하고 등록할 때 사용한 이름 하에서는 존재하지 않는다.
그림 2. 스키마 진화
스키마 진화
설명한 것처럼, DB2는 기존 스키마를 새 스키마로 교체하도록 업데이트하기 위해 저장된 프로시저와 명령을 제공한다. 성공적으로 교체하려면 XML 스키마는 호환되어야 한다. 두 XML 스키마가 호환되지 않는다면 업데이트는 실패하고 오류 메시지가 생성된다.
호환성을 위해 다음 사항이 꼭 필요하다.
-
속성 내용: 원 XML 스키마의 복잡한 유형 내에서 선언되거나 참조된 속성은 새 XML 스키마에도 있어야 한다. 또한 원 XML 스키마에 없었던 필요 속성은 새 XML 스키마에도 있을 수 없다.
-
요소 내용: 원 XML 스키마의 복잡한 유형 내에서 선언되거나 참조된 요소는 새 XML 스키마에도 있어야 한다. 원 XML 스키마에 없었던 필요 요소는 새 XML 스키마에도 있을 수 없고 선택적 요소만이 추가될 수 있다.
-
패싯(Facet) 충돌: 새 XML 스키마에서 간단한 유형의 패싯 값은 원 XML 스키마에서 정의된 간단한 유형의 값 범위와 호환돼야 한다. 예를 들어 다음과 같다.
<xs:restriction base="xs:decimal" />
|
다음은 대조되는 것이다.
<xs:restriction base="xs:decimal">
<xs:totalDigits value="7"/>
</xs:restriction>
|
-
비호환적 유형: 이미 삽입된 XML 문서가 새 스키마에 대해 유효성을 입증받지 못했거나 스키마가 원 XML 스키마에서와 다른 간단한 유형 주석을 가지면 새 XML 스키마의 요소나 속성 유형은 호환되지 않는다. 예:
type="xs:string" 대 type="xs:integer".
-
섞인 것 대 섞이지 않은 내용: 복잡한 유형의 내용 모델이 원 XML 스키마에서 섞인 것으로 선언된다면 새 XML 스키마에서도 그렇게 선언돼야 한다. 예:
mixed="true" 대 mixed="false".
-
nill 대 nill 아닌 것: 원 XML 스키마의 요소 선언에서 nillable 속성이 켜지면 새 XML 스키마에서도 그래야 한다.
-
제거된 요소: 원 XML 스키마에서 선언된 글로벌 요소는 새 XML 스키마에도 있어야 하고 abstract를 만들면 안 된다. 예:
<xs:element name="b" type="xs:string"/> 대 <xs:element name="b" abstract="true"/>.
-
제거된 유형: 원 XML 스키마가 다른 유형에서 파생된 글로벌 유형을 가지고 있다면 글로벌 유형은 새 XML 스키마에도 있어야 한다.
-
간단함에서 복잡함으로: 원 XML 스키마에 간단한 내용을 담은 복잡한 유형은, 업데이트된 XML 스키마에 복잡한 내용을 갖도록 재정의할 수 없다.
-
간단한 내용: 원 XML 스키마와 새 XML 스키마에서 정의된 간단한 유형은 같은 기본 유형을 공유해야 한다.
더 자세한 내용은 XML 스키마 변화를 위한 호환성 필요사항을 보기 바란다.
스키마 변화 예제
본 예제에서 호환되는 스키마 customer1으로 업데이트되고 난 후 호환되지 않는 스키마 customer2로 업데이트된 스키마 customer를 보여준다. 두 번째 XSR 업데이트는 실패한다. 이 예에서 XML 문서의 유효성을 검증할 때 XML 인스턴스 문서에 포함된 스키마 위치 URI가 아닌 스키마의 SQL 이름이 스키마를 참조하는 데 사용된다.
Listing 1. customer.xsd
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.test.com/customer">
<xsd:element name="customerType">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Name" type="xsd:string"/>
<xsd:element name="Address" type="xsd:string"/>
<xsd:element name="Phone" type="xsd:string"/>
<xsd:element name="email" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="type" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:schema> |
Listing 2. customer1.xsd
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.test.com/customer">
<xsd:element name="customerType">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Name" type="xsd:string"/>
<xsd:element name="Address" type="xsd:string"/>
<xsd:element name="Phone" type="xsd:string"/>
<xsd:element name="email" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="optType" type="xsd:string" use="optional"/>
</xsd:complexType>
</xsd:element>
</xsd:schema> |
Listing 3. customer2.xsd
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.test.com/customer">
<xsd:element name="customerType">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Name" type="xsd:string"/>
<xsd:element name="Address" type="xsd:string"/>
<xsd:element name="Phone" type="xsd:string"/>
<xsd:element name="email" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="reqType" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:schema> |
1단계: customer.xsd 등록하기
REGISTER XMLSCHEMA http://www.test.com/customer
FROM c:\article\customer.xsd AS TEST.customer;
COMPLETE XMLSCHEMA TEST.customer; |
여기서 http://www.test.com/customer는 스키마 위치 URI고 TEST.customer는 스키마의 SQL 이름이다.
2단계: customer1.xsd 등록하기
REGISTER XMLSCHEMA http://www.test.com/customer1
FROM c:\article\customer1.xsd AS TEST.customer1;
COMPLETE XMLSCHEMA TEST.customer1; |
여기서 http://www.test.com/customer1은 스키마 위치 URI고 TEST.customer1은 스키마의 SQL 이름이다.
3단계: customer2.xsd 등록하기
REGISTER XMLSCHEMA http://www.test.com/customer2
FROM c:\article\customer2.xsd AS TEST.customer2;
COMPLETE XMLSCHEMA TEST.customer2; |
여기서 http://www.test.com/customer2는 스키마 위치 URI이고 TEST.customer2는 스키마의 SQL 이름이다.
4단계: 스키마 customer를 호환되는 스키마 customer1으로 업데이트해 애플리케이션이 TEST.customer 스키마로 지속적으로 참조될 수 있다.
주의: customer1.xsd는 optType이라는 선택적 속성을 가지고 있다.
CALL sysproc.xsr_update('TEST','CUSTOMER','TEST','CUSTOMER1',0);
4단계 - 결과:
Return Status = 0
5단계: 스키마 customer를 스키마 customer2로 업데이트한다.
주의: customer2.xsd는 regType이라는 필요한 속성을 가진다.
CALL sysproc.xsr_update('TEST','CUSTOMER','TEST','CUSTOMER2',0);
5단계 - 결과:
반환 메시지: SQL20432N. 원 XML 스키마는 둘러쌓인 "customerType"을 가지거나 업데이트된 XML 스키마와 호환되지 않는 ""로 참조된다. 비호환성의 이유는 "1" ("ATTRIBUTE CONTENT"). SQLSTATE=22538이다
6단계: 등록된 스키마에 대해 인스턴스 문서의 유효성 검사를 하자.
Listing 4. Validating against the registered schema
<?xml version="1.0" encoding="UTF-8"?>
<n1:customerType type="String"
xsi:schemaLocation="http://www.test.com/customer"
xmlns:n1="http://www.test.com/customer"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Name>Kestle Ferder</Name>
<Address>Ring Road, Bangalore</Address>
<Phone>900400558765</Phone>
<email>m22@ibm.com</email>
</n1:customerType> |
위의 XML 인스턴스는 customer.xsd와 이후 customer1.xsd를 참조해 TEST.customer에 대해 성공적으로 유효하다.
INSERT INTO T1(XMLCOL) VALUES ( XMLVALIDATE ( ? ACCORDING TO
XMLSCHEMA ID TEST.customer ) )
|
7단계: 등록된 스키마에 대해 인스턴스 문서의 유효성을 검사하자.
Listing 5. Validating against the registered schema
<?xml version="1.0" encoding="UTF-8"?>
<n1:customerType type="String" optType="testschemaevol"
xsi:schemaLocation="http://www.test.com/customer1"
xmlns:n1="http://www.test.com/customer1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Name>Kes Sales</Name>
<Address>Ring Road, Bangalore</Address>
<Phone>900400658765</Phone>
<email>m23@ibm.com</email>
</n1:customerType> |
위의 XML 인스턴스는 customer.xsd에서 customer1.xsd로 스키마가 변화한 후 customer1.xsd를 참조해 TEST.customer에 대해 성공적으로 유효하다.
INSERT INTO T1(XMLCOL) VALUES ( XMLVALIDATE ( ? ACCORDING TO
XMLSCHEMA ID TEST.customer) ) |
요약 및 이점
DB2 pureXML 스키마 진화 기능을 사용해 유효성 검증을 할 때 변경된 스키마를 참조하는 애플리케이션을 바꾸지 않고 스키마를 발전시킬 수 있다.
스키마 변화가 큰 곳에서:
- 유효성을 검증하는 동안 스키마를 나타내는 SQL 이름을 사용한다면 새 스키마에 대해 유효성을 검증하기 위해 애플리케이션의 새 스키마 이름을 참조하도록 약간 변경해야 한다.
- 유효성을 검증하는 동안 XML 인스턴스 문서에서 스키마 위치 URI를 사용할 경우 XML 인스턴스가 적절한 스키마를 참조한다면 애플리케이션을 변경할 필요는 없다.
모든 경우 DB2에 이미 저장된 문서는 다시 유효성 검사를 할 필요가 없다. 스키마의 변화가 작든 크든, 스키마 유효성 검사가 사용되든 안 되든 XML 인스턴스 문서는 DB2 pureXML의 같은 XML 행에 계속적으로 저장되고 접근될 수 있다.
또한 변화하는 스키마에 기반을 둔 XML 데이터에 대해 질의를 실행할 때 애플리케이션에 큰 변화를 줄 필요가 없을 것이다.
참고자료 교육
제품 및 기술 얻기
-
DB2 엔터프라이즈 9 무료 시험판을 다운로드해 보라.
- 이제 DB2를 무료로 사용할 수 있다. DB2 Express-C는 커뮤니티 멤버를 위한 DB2 Express Edition의 무료 버전으로 DB2 Express Edition에서 제공하는 것과 같은 핵심 데이터 기능을 제공하고 애플리케이션 만들기 및 배치하기를 위한 기초를 제공한다.
-
IBM 제품 평가판을 다운로드해 애플리케이션 개발 도구와 DB2®, Lotus®, Rational®, Tivoli®, WebSphere®의 미들웨어 제품에 익숙해지자.
토론
필자소개  | 
|  | Khurram Faraaz는 인도 방갈로르에 위치한 IBM 정보 관리 그룹(IBM 소프트웨어 그룹의 한 부서)에서 시스템 소프트웨어 엔지니어로 일한다. 주 업무는 DB2의 XML 기능 검증 테스팅이다. Khurram은 또한 pureXML 인더스트리 번들에 대한 업무도 담당한다. khfaraaz@in.ibm.com으로 연락을 취할 수 있다. |
 | 
|  | Ronny Bartsch는 미국 소머즈에 위치한 IBM 정보 관리 그룹(IBM 소프트웨어 그룹의 한 부서)에서 소프트웨어 개발자로 일한다. 주 업무는 XML과 DB2 pureXML을 사용해 산업 표준과 관련된 인더스트리 번들과 데모다. rbartsc@us.ibm.com으로 연락을 취할 수 있다. |
 | 
|  | Susan Malaika는 IBM 정보 관리 그룹에서 일한다. 특히 그리드 컴퓨팅을 포함한 XML 및 웹 기술 전문가다. 웹에 글과 공동 집필한 책을 출판했다. IBM Academy of Technology 멤버이기도 하다. malaika@us.ibm.com으로 연락을 취할 수 있다. |
기사에 대한 평가
 |
| 이 문서 북마킹 하기
|
|