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

한국 developerWorks  >  Information Management | XML  >

DB2 pureXML을 사용해 XML 스키마 개선하기

호환성에 대한 가이드와 몇 가지 예제 학습

developerWorks
문서 옵션

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

토론

영어원문

영어원문


제안 및 의견
피드백

난이도 : 중급

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 스키마를 발전시키는 단계를 살펴보자.

  1. 프로시저에 저장된 XSR_REGISTER를 호출하거나 REGISTER XMLSCHEMA 명령을 실행하여 XSR에 새 XML 스키마를 등록하자. 2번에서 설명하는 것처럼 기존 스키마를 새 스키마로 바꾸고자 한다면 새로 등록된 XML 스키마로 문서의 유효성 검사를 하면 안 됨을 명심하자.
  2. 프로시저에 저장된 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 photo

Khurram Faraaz는 인도 방갈로르에 위치한 IBM 정보 관리 그룹(IBM 소프트웨어 그룹의 한 부서)에서 시스템 소프트웨어 엔지니어로 일한다. 주 업무는 DB2의 XML 기능 검증 테스팅이다. Khurram은 또한 pureXML 인더스트리 번들에 대한 업무도 담당한다. khfaraaz@in.ibm.com으로 연락을 취할 수 있다.


Ronny Bartsch photo

Ronny Bartsch는 미국 소머즈에 위치한 IBM 정보 관리 그룹(IBM 소프트웨어 그룹의 한 부서)에서 소프트웨어 개발자로 일한다. 주 업무는 XML과 DB2 pureXML을 사용해 산업 표준과 관련된 인더스트리 번들과 데모다. rbartsc@us.ibm.com으로 연락을 취할 수 있다.


Susan Malaika photo

Susan Malaika는 IBM 정보 관리 그룹에서 일한다. 특히 그리드 컴퓨팅을 포함한 XML 및 웹 기술 전문가다. 웹에 글과 공동 집필한 책을 출판했다. IBM Academy of Technology 멤버이기도 하다. malaika@us.ibm.com으로 연락을 취할 수 있다.




기사에 대한 평가


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



 


 


 


이 문서 북마킹 하기

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





위로


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