자바개발과정/XML

XML과 데이터베이스

경진 2008. 7. 18. 10:25
오라클과 XML

XML과 데이터베이스의 관련성

XML은 데이터를 표현하기 위한 방법으로, 결국 데이터를 담고 있는 그릇이라 할 수 있으며, 데이터베이스 역시 데이터를 저장, 관리할 목적을 갖고 있음. 즉 개념적으로 데이터를 다룬다는 공통점을 가지고 있다. 하지만, XML과 데이터베이스는 내부적으로 다른 구조를 취하고 있다. 그러나 개념적으로 같은 의미를 갖고 있기 때문에 서로 다른 구조를 갖고 있더라도 XML 문서의 데이터를 데이터베이스로, 데이터베이스의 데이터를 XML 문서로 변환하여 저장하는 것이 가능하다.

오라클과 XML

오라클이 맨 처음 XML 데이터를 지원하기 시작한 것은 8i 버전부터였으며, 버전이 증가하면서 점점 더 많은 기능이 추가되고 있다. 우리는 오라클 10g 버전을 기준으로 오라클에서 XML에 대해 제공하는 XML 데이터들을 저장, 조회, 조작하는 작업 위주로 실습한다.

오라클에서는 XML 데이터를 XML DB에 저장할 수 있다. XML DB란 오라클 9i부터 제공되기 시작했는데, 명칭이 DB라고 해서 별도의 서버가 존재하는 것이 아니라 XML 데이터를 저장하고 조회하는 등 일련의 작업을 처리하기 위한 목적으로 오라클 서버에 존재하는 하나의 DB라고 생각하면 된다. 그러므로 일반적인 절차를 따라 오라클을 설치하면 내부에 XML DB가 자동으로 설치된다.(엔터프라이즈와 스탠다드 에디션에서 디폴트로 설치된다)

오라클 서버에 XML DB가 설치되어 있는지 확인하는 질의문이다.

SELECT comp_name
  FROM dba_registry
 WHERE comp_name LIKE '%XML%';

info라는 테이블에 address 칼럼의 데이터 타입을 XMLTYPE으로 하여 테이블을 생성하는 예제이다.
(address 칼럼에 전화, 이메일, 주소 등의 정보를 가지고 있는 XML 문서를 저장하게 된다.)

저장할 테이블 생성 (info 테이블 생성)

CREATE TABLE info (
    id VARCHAR2(20)
    , name VARCHAR2(20)
    , address SYS.XMLTYPE
);

XML 문서 추가 (address 칼럼에 XML 문서를 추가)

INSERT INTO info
VALUES('20061101001', '박미영',
    sys.xmltype.createXML(' -- XML 트리구조 DB에 매핑시켜주기 위해 사용
    <addr_spec>
        <phone>010-614-9515</phone>
        <email>for.econet@gmail.com</email>
        <address>서울시 영등포구</address>
    </addr_spec>'
    )
);

XML 문서 추가 확인 (저장된 XML 문서를 질의하여 확인)

SET LONG 400 -- SQL Plus 에서 사용
SELECT*FROM info;

※ XML 문서의 특정 node에 접근하기 위해 Extract() 함수 내의 인자(argument)에 Document Element(여기서는 addr_spec이 Document Element에 해당된다)로부터 원하는 값이 있는 node까지 경로를 명시해 주면 된다. 이 node로부터 주소값을 얻기 위해서는 getStringVal() 함수를 사용한다.

XMLType을 지원하는 함수

XMLType 함수 설명
getClobVal() CLOB 타입의 문서 반환
isFragment() Fragment 여부 확인
getStringVal() XML Node에서 문자열 값을 얻기
getNumVal() XML Node에서 숫자값을 얻기
extract() XPath를 이용하여 문서의 일부분 추출
ExistNode() XPath 질의에 해당하는 노드 존재 확인
YourFunction() 확장가능

전체 XML 문서 중에서 일부 값 선택 조회
info 테이블에서 XML 문서의 특정 부분 이름과 주소 값을 조회하는 예제이다.

SELECT name
     , i.address.extract('/addr_spec/address/text()').getStringVal() address
  FROM info i;

※ XML 문서 내 특정 Node를 반복해서 검색할 경우 인덱스(INDEX)를 설정함으로써 검색 속도를 향상시킬 수 있다.

INSERT한 XML 문서에서 주소(address) Element에 인덱스를 생성한 예제이다.

CREATE INDEX address_idx ON info
(address.extract('address_spec/address').getStringVal());

테이블 삭제(CASCADE Option 이용 테이블 설정 제약 조건도 함께 삭제한다)

DROP TABLE info CASCADE CONSTRAINTS;

※ XMLType은 오라클에서 제공하는 XML 문서를 저장하기 위한 데이터 타입이며, 내부적으로 CLOB(Character Large Object)의 형태로 XML 문서 전체를 저장하며, XPath를 이용하여 문서의 내용에 접근할 수 있음. 또한, 문서에 대한 인덱싱을 통해 검색 시 좋은 성능을 보여준다.