상세 컨텐츠

본문 제목

Tip: XML과 데이터베이스 간 매핑 - 데이터를 XML 스키마로 매핑하는 쉬운 방법

프로그래밍/JAVA

by 라제폰 2009. 1. 30. 18:06

본문

XML 사용자들의 공통적인 관심사는 XML을 데이터베이스로 매핑하는 방법이다. 이 글에서 테이블 기반 매핑과 객체 관계형 매핑을 설명한다. 두 매핑 방식 모두 XML 문서와 데이터베이스(특히 관계형 데이터베이스)들 간 데이터를 전송하는 토대이다. 중요한 것은 이러한 매핑 방식이 양방향이란 점이다. 다시 말해서 XML 문서에서 데이터베이스로, 데이터베이스에서 XML 문서로 데이터를 전송하는데 사용할 수 있다는 점이다.

데이터베이스가 XML 기능을 강조하지 않아도 관계형 데이터베이스에서 XML 문서를 저장 및 검색하는 것이 가능하다. 따라서 자바 프로그래밍 언어(데이터베이스는 Java Database Connectivity(JDBC) 호환이 될 필요가 없다.)와 관계형 데이터베이스와 XML 문서 흐름간 접착제로서 작용하는 프레임웍을 신중히 다루어야 한다.

XML을 데이터베이스로 매핑하는 두 가지 방식이 있다. 하나는 테이블 기반 매핑이고, 다른 하나는 객체 관계형(객체 기반) 매핑 방식이다. 두 방식 모두 양방향이기 때문에 XML 문서를 저장 및 검색할 수 있다.

테이블 기반 매핑

테이블 기반 매핑(Table-based mapping) 방식은 문서를 하나의 테이블 또는 테이블 세트로 간주한다. Listings 12는 문서 구조이다.


Listing 1. 테이블 매핑(싱글 테이블) 옵션

        
   <Table ABC>
      <Row1>
         <Column_a>123-45-7890</Column_a>
         <Column_b>Johnson, Eric</Column_b>
         <Column_c> Pharmaceutical </Column_c>
      </Row1>
      <Row2>
         <Column_a>999-00-1010</Column_a>
         <Column_b>Mitchell, Bruce</Column_b>
         <Column_c> Industrial </Column_c>
      </Row2>
   </Table ABC>


Listing 2. 테이블 매핑(다중 테이블) 옵션

        
    <Tables>
      <Table_1>
         <Row1>
            <Column_a>123-45-7890</Column_a>    
            <Column_b> Johnson, Eric </Column_b>
            <Column_c>Company A</Column_c>
         </Row1>
         <Row2>
            <Column_a>999-00-1010</Column_a>
            <Column_b> Mitchell, Bruce </Column_b>
            <Column_c> Company  B</Column_c>
         </Row2>
      </Table_1>
      <Table_2>
         <Row1>
            <Column_a>Company A</Column_a>
            <Column_b>Pharmaceutical</Column_b>
         </Row1>
         <Row2>
            <Column_a>Company B</Column_a>
            <Column_b>Industrial</Column_b>
         </Row2>
      </Table_2>
   </Tables>

이 매핑 방식의 뚜렷한 특징은 단순함이다. 이 구조는 관계형 데이터베이스의 테이블과 결과 세트와 매치하기 때문에 이 매핑에 근거하여 코드를 작성하기는 쉽다. 이 코드는 빠르고 확장성도 우수하며, 특정 애플리케이션에는 매우 유용하다. 특히 데이터를 한번에 한 테이블로 옮길 때 유용하다.

하지만 테이블 기반 매핑은 단점도 있다. XML 문서들의 매우 작은 하위 세트로만 작동한다. 게다가 물리적 구조(문자와 엔터티 레퍼런스, 문자 인코딩, 선언), 문서 정보(Document Type Definition (DTD)), 주석, 프로세싱 명령어를 보존하지 않는다.




위로


객체 관계형 매핑

테이블 기반 매핑이 XML 문서의 제한된 하위 세트로만 작동하기 때문에, 대부분의 XML 기반 관계형 데이터베이스와 XML 기반 객체 서버 그리고 몇몇 미들웨어 툴은 보다 세련된 객체 관계형 매핑(object-relational mapping)을 사용한다. 이 매핑 방식은 XML 문서를 데이터 스팩의 객체 트리로서 모델링하고, 이들 객체들을 데이터베이스로 매핑한다.

다음 XML 문서를 보자.(Listing 3)


Listing 3. 판매 주문

        
   <SalesOrder>
      <Number>1234</Number>
      <Customer>Gallagher Industries</Customer>
      <Date>29.10.00</Date>
      <Item Number="1">
         <Part>A-10</Part>
         <Quantity>12</Quantity>
         <Price>10.95</Price>
      </Item>
      <Item Number="2">
         <Part>B-43</Part>
         <Quantity>600</Quantity>
         <Price>3.99</Price>
      </Item>
   </SalesOrder>

이 문서는 Listing 4의 객체들로 매핑된다.


Listing 4. 계층적 XML로 나타난 판매 주문

        
      object SalesOrder {
         number = 1234;
         customer = "Gallagher Industries";
         date = 29.10.00;
         items = {ptrs to Item objects};
      }         /             \
               /               \
              /                 \
   object Item {       object Item {
      number = 1;         number = 2;
      part = "A-10";      part = "B-43";
      quantity = 12;      quantity = 600;
      price = 10.95;      price = 3.99;
   }                   }

이 방식은 계층적이고 매력적인 데이터 매핑 방식이다. 데이터베이스 객체들은 다음과 같은 여러 장점들이 있다.

  • 데이터베이스 독립성: 데이터베이스 객체들은 처음부터 독립적인 데이터베이스로 구현된다. 기반 데이터베이스의 기능에 의존하지 않는다. 이러한 독립성 때문에 데이터베이스 객체들을 사용하여, 구현된 애플리케이션을 한 데이터베이스 플랫폼에서 다른 플랫폼으로 포팅할 수 있는 것이다.
  • 자동 연결 핸들링: 자동 연결 핸들링은 시스템 리소스들을 연결, 연결 해제, 관리하는 기능이다. 클라이언트 객체들에 대한 추상화로 제어력과 퍼포먼스가 향상될 수 있다.
  • 선언적 참조 무결성(Declarative referential integrity): 액세스 로직을 데이터베이스 객체에 직접 삽입함으로서 플랫폼에 의존하지 않고도 데이터베이스에 접근할 때 저장된 프로시저를 사용하는 것과 똑같은 혜택을 누릴 수 있다. 참조 무결성은 데이터베이스와 독립적이고 데이터베이스 객체들간 복잡한 관계들은 서로 이식 가능하다. 예를 들어, 비즈니스 규칙을 데이터베이스 객체로 통합하여 이 객체에 접근하는 모든 애플리케이션들이 기존 규칙들을 따르도록 할 수 있다.
  • 다중 레벨 밸리데이션: 객체 또는 객체의 부모를 검사할 수 있다. 액세스, 권한, 데이터 무결성을 정형화 및 유효성 검사를 수행한다.
  • 임베디드 SQL 피하기: 데이터베이스 객체를 사용하면 임베디드 SQL을 피할 수 있다. 임베디드 SQL은 관리도 어렵고 시스템 의존적이다. 애플리케이션이 다른 자바 객체들과 단순히 인터랙팅하면 시스템의 디자인은 완전한 객체 지향이 된다.
  • 보안: 데이터베이스 객체와의 모든 인터랙션을 보호할 수 있고, 보안 데이터도 쉽게 관리할 수 있다.



위로


매핑 방식(Mapping methodology)

객체 관계형 매핑은 두 단계로 수행된다. 우선, XML 스키마(이 경우, DTD)를 객체 스키마로 매핑한다. 그런 다음, 객체 스키마를 데이터베이스 스키마로 매핑한다. 어떤 경우에는, 직접적인 DTD-데이터베이스 매핑에 두 가지 매핑 방식을 결합할 수 있다. 오늘날 대부분의 소프트웨어에서 이 방식이 사용된다.

표 1의 예제는 복잡한 엘리먼트 유형 AC 클래스로 매핑되는 동안, 단순한 엘리먼트 유형인 B, D, E가 스트링으로 매핑되는 것을 보여주고 있다. 객체 관계형 매핑, part 1에서 AC의 모델과 애트리뷰트는 클래스 AC의 속성으로 매핑된다. AC의 콘텐트 모델의 B, D, E에 대한 레퍼런스는 스트링으로 매핑된다.

표 1. 객체 관계형 매핑, part 1
DTD Classes
<!ELEMENT A (B, C)> <!ELEMENT B (#PCDATA)> <!ELEMENT C (D, E)> class A { String b; C c; }
<!ELEMENT D (#PCDATA)> <!ELEMENT E (#PCDATA)> class C {String d; String e; }

객체 관계형 매핑, part 2 (표 2)에서 클래스들은 테이블로 매핑되고, 스칼라 속성은 칼럼으로, 포인터/레퍼런스 속성은 프라이머리 키/외래 키 관계로 매핑된다. A의 콘텐트 모델에서 C에 대한 레퍼런스는 C 클래스의 객체에 대한 pointer/reference 유형으로 매핑된다. C 엘리먼트 유형은 C 클래스로 매핑된다.

표 2. 객체 관계형 매핑, part 2
Classes Tables
class A {String b; C c; } Table A: Column b Column c_fk
class C {String d; String e; } Table C: Column d Column e Column c_pk



위로


결론

두 개의 매핑 방식 모두 문서 자체 보다는 XML 문서의 데이터(data)를 모델링 한다. 이는 데이터 중심의 문서에는 좋은 매핑 방식이지만 문서 중심의 문서에는 그다지 좋은 선택이 못된다. 객체 관계형 매핑이 객체 지향 기술에 의존하지만 그렇다고 해서 그것이 이상적인 것 만은 아니다. 테이블 기반 매핑은 혼합된 콘텐트를 전혀 핸들 할 수 없고 객체 관계형 매핑은 퍼포먼스 관점에서 보면 비효율적이다. 두 가지 방식 각각 장단점이 있기 때문에 잘 이해하고 사용해야 한다.


관련글 더보기