DB2 Viper 시작하기

DB2 | 2007. 2. 14. 10:37
Posted by 시반

DB2 Viper 시작하기 (한글)

 

난이도 : 초급

Cynthia M. Saracco, Senior Software Engineer, IBM

2006 년 7 월 28 일

베타 버전으로 릴리스 된 DB2® Viper는 XML 데이터의 저장, 관리, 검색에 대한 새로운 기능을 제공합니다. 이 글에서는 XML 데이터를 관리하기 위한 데이터베이스 객체를 만들고 DB2 데이터베이스에 XML 데이터를 구축하는 방법을 설명합니다.

독자는 IBM에서 테이블형(SQL-기반), 계층형(XML-기반) 데이터 구조를 지원하는 최초의 DBMS인 새로운 DB2 Viper 릴리즈에 대해서 들었는지도 모른다. DB2의 새로운 “native” XML 지원이 궁금하고 이에 대해 알고 싶다면 이 글은 많은 도움이 될 것이다.

DB2의 native XML 기능에 빨리 다가서기 위해서 다음과 같은 공통적인 작업이 필요하다.

  1. 테스트 데이터베이스, 샘플 테이블 및 뷰를 포함한 XML 데이터 관리를 위한 데이터베이스 객체 생성
  2. INSERTIMPORT statements 문장을 이용해 XML 데이터로 데이터베이스 구축하기
  3. XML 데이터 검증하기. DB2로 XML 스키마 개발 및 등록, 데이터를 들여올 경우 XMLVALIDATE 옵션 이용하기

후속 기술문서에서는 SQL을 이용한 XML 데이터 조회, 갱신, 삭제, XQuery를 이용한 조회, DB2 XML 데이터를 처리하는 Java application 및 Web components를 다룬다.

데이터베이스 객체 생성하기

우선 단일 DB2 유니코드 데이터베이스를 생성해 보자. DB2 Viper에서는 유니코드 데이터베이스만이 XML 문서 및 정수, 날짜/시간, 가변 길이 문자열 등과 같은 전형적인 SQL 데이터 형태를 저장할 수 있다. 추후에는 위 데이터베이스에 XML 및 다른 형태의 데이터를 모두 관리하는 객체를 생성할 것이다.

테스트 데이터베이스 생성하기

새로운 DB2 유니코드 "test" 데이터베이스를 생성하려면 DB2 명령 윈도우를 열고 Listing 1에 나오는 유니코드 코드셋 지원영역을 지정하는 Statement를 실행한다.


Listing 1. XML데이터를 저장하기 위한 데이터베이스 생성하기

				
create database test using codeset UTF-8 territory us 

일단, 유니코드 데이터베이스를 생성하면 XML 데이터를 native 계층형 포맷으로 저장하기 위한 더 이상의 추가적인 명령이나 action은 불필요하다.

샘플 테이블 생성하기

XML 데이터를 저장하려면 한 개 이상의 XML 열을 포함한 테이블을 생성한다. 이런 테이블은 문서들에 대한 논리적 container 역할을 한다. DB2는 실제로 XML 및 표면화되어 있지 않지만 내부적으로, 비-XML 데이터에 관해 각기 다른 데이터 저장방식을 사용한다. 특히 단일 쿼리에서 다른 형태의 데이터들을 통합해야 할 경우에는 더욱 그렇다. 하지만, 형태가 다르다 할지라도 지원되는 모든 형태의 데이터를 관리하기 위한 논리적 객체로 테이블을 사용함으로써 운영 및 application 개발 문제를 단순화 시킬 수 있다.

사용자는 XML 형식의 열만을 가진 테이블, 일반적인 SQL 형태의 열만을 가진 테이블, 두 형태를 모두 포함하는 테이블을 정의할 수 있다. 이 글에서는 마지막 경우를 모델화한다. Listing 2에서의 예는 “test” 데이터베이스에 연결하고 두 개의 테이블을 생성한다. 첫 번째 테이블은 “items” 테이블로 판매항목 및 고객이 판매항목에 대해 내린 평가에 관한 정보를, 두번째 테이블은 “clients” 테이블로 연락 데이터를 포함한 고객에 대한 정보를 저장한다. 여기서 “comments” 및 “contactinfo”열은 새로운 DB2 XML 데이터 형태이고, 다른 열은 기존의 SQL 데이터 타입이다.


Listing 2. XML 데이터에 관한 테이블 생성

				
connect to test;

create table items (
  id          int primary key not null, 
  brandname   varchar(30), 
  itemname    varchar(30), 
  sku         int, 
  srp         decimal(7,2), 
  comments    xml
);

create table clients(
  id          int primary key not null, 
  name        varchar(50), 
  status      varchar(10), 
  contactinfo xml
);

위 테이블 정의를 자세히 보면 두 테이블 다 “comments” 또는 “contactinfo”열에 저장된 XML 문서의 내부구조가 명시되지(specified) 않았다는 사실을 알게 된다. 이는 DB2의 중요한 특징이다. 사용자들은 데이터를 저장하기 위해 XML 데이터구조(또는 더 정확하게 말하면 XML 스키마)를 미리 정의할 필요가 없다. 사실, DB2는 어떠한 well-formed XML 문서를 한 열에 저장할 수 있고 이는 다른 XML schema를 따르는 문서나 등록된 XML schema와 관련이 없는 문서도 동일한 열에 저장할 수 있다는 것을 의미한다.이 글에서는 DB2에서 데이터를 저장하는 방법을 설명할 때 이와 같은 특징에 대해 더 자세히 논하기로 한다.

뷰 생성하기

기존의 SQL 데이터 형태만 포함하는 테이블에 대해 뷰를 생성하는 것처럼 XML 데이터를 포함하는 테이블에 대해 View를 생성할 수 있다. Listing 3에서는 status가 "Gold" 인 client에 대한 View를 생성한다.


Listing 3. XML 데이터를 포함한 뷰 생성하기

				
create view goldview as 
select id, name, contactinfo 
from clients where status='Gold'; 

인덱스에 관한 사항

최종적으로, XML 열에 대해 인덱스를 생성해 데이터 검색을 빠르게 할 수 있다는 점은 알아둘 필요 있다. 이 글은 초보자들을 위한 글이고 샘플 데이터 규모도 작아, 그와 같은 주제를 여기선 다루지 않기로 한다. 하지만 실제 운영 상황에서 최적의 성능을 위해 적절한 인덱스를 정의하는 것은 매우 중요하다. DB2의 새로운 인덱싱 기술에 관해 자세히 알아보기 위해서는 이 글 끝에 참고자료 섹션을 참조하라.




XML 데이터 저장하기

이제 생성된 테이블을 이용해 데이터를 구축할 수 있다. 직접 SQL INSERT 문을 실행하거나 DB2 IMPORT 기능을 이용할 수 있다. IMPORT 기능은 결국 내부적으로 INSERT 문을 수행한다.

INSERT 문장 사용하기

사용자는 INSERT 문으로 직접 원시 XML 데이터를 DB2에 넣을 수 있다. 애플리케이션을 작성하거나 변수에 저장된 XML 데이터를 이용해 입력하는 경우에는 아마 가장 쉬운 방법일 수도 있다. 그러나 우선 DB2 Viper로 시작했고 애플리케이션을 작성하려 하지 않을 경우에는 INSERT문을 대화식으로 실행할 수 있다. (기호에 따라 CLP(Command Line Processor)를 이용할 수도 있지만 필자로선 DB2 명령 에디터를 사용하는 게 편하다.)

DB2 명령 에디터를 사용하려면 DB2 제어센터를 클릭한다. 상단에 있는 "Tools" 풀다운 메뉴에서 Command Editor를 선택하면 그림 1과 같이 별도의 창이 나타난다.


그림 1. DB2 명령 에디터


상단 창에 다음과 같은 문장을 입력한다.


Listing 4. 대화식으로 XML 데이터 삽입하기

				
connect to test;

insert into clients values (77, 'John Smith', 'Gold', 
   '<addr>111 Main St., Dallas, TX, 00112</addr>') 

왼쪽에 있는 녹색 화살표를 클릭해 명령을 실행한다.

이 경우, 입력 문장은 상당히 단순하다. 문서가 크거나 복잡할 경우, XML 데이터를 그림에 나오는 INSERT 문장에 입력하는 작업은 실지로 불가능하다. 대부분의 경우 호스트 변수, 파라미터 마커를 이용해 데이터를 삽입하기 위한 애플리케이션을 작성한다. 이 글과 같이 자바 코딩 예제가 간단히 소개된다. 하지만 초보자를 위한 글이라 애플리케이션 개발에 관한 주제에 대해 심도있게 논의하지는 않겠다. 대신 IMPORT 도구를 이용해 데이터로 DB2 XML 열을 구축하는 방식에 대해 논의하겠다.

DB2 IMPORT 이용하기

XML 데이터를 파일로 가지고 있는 경우, DB2 IMPORT 도구로 XML 데이터로 DB2 테이블을 생성하는 간단한 방법을 제공한다. 이 경우, 애플리케이션을 작성할 필요가 없고 단지 테이블에 올려놓고 싶은 데이터를 포함한 구별된(delimited) ASCII 파일을 생성하면 된다. 파일에 XML 데이터를 저장한 경우에는 파라미터로 적절한 파일 이름을 지정한다.

사용자에 따라 선택한 텍스트 에디터를 사용해 구별된 ASCII 파일을 생성한다. (통상적으로 그런 파일들의 유형은 .del 이다.) 파일에서의 각 라인은 테이블에 들어온 데이터 행을 나타낸다. 라인에 XML 데이터 지정자(XDS:XML Data Specifier)를 포함한 경우, IMPORT 명령은 참조 XML 파일에 포함된 데이터를 읽어들여 그 데이터를 DB2로 들여보낸다. 예를 들어, 그림 2에서의 첫번째 라인은 ID, 이름, 고객상태 등을 포함한 Ella Kimpton에 관한 정보가 포함되어 있다. 이 여자의 연락정보는 Client3227.xml 파일에 포함되어 있다.


그림 2. DB2 IMPORT 입력용으로 쓰이는 샘플 구별 ASCII파일


그림 3에는 Client3227.xml 파일의 컨텐츠가 나와 있다. 보다시피, 이 파일에는 Ella Kimpton의 주소, 전화번호, 팩스 번호 및 e-메일에 관한 정보가 포함되어 있다.


그림 3. 샘플 클라이언트 XML 파일


XML 파일이 모든 행(row)에 대해 준비되지 않아도 입력파일에서 XDS 정보를 생략하면 import는 잘 수행된다.예를 들어, 그림 4에 나온 items.del 파일은 항목 3641(멋진 드레스 슈트)에 관한 XML 파일 명칭이 빠져 있다. 그 결과, 이 행의 XML 열은 어떤 데이터도 포함되지 않는다.


그림 4. 한 행에 XML 데이터 지정자가 없는 샘플 구별 ASCII 파일


XML 파일 및 구별된 ASCII 파일이 있는 경우 DB2 IMPORT 도구를 사용할 준비가 다 된 셈이다. Listing 4에 나온 다음 문장으로 C:/XMLFILES 디렉토리에 있는 clients.del 파일에 지정된 컨텐츠를 "clients" 테이블로 import한다.


Listing 4. 데이터를 "clients" 테이블로 import하기

				

그림 2에 나온 client.del 파일은 6개의 XML 파일에 대한 레퍼런스를 포함해 6개의 행에 대한 데이터를 포함하고 있다.IMPORT 명령을 성공적으로 실행하면 그림 5와 비슷한 결과가 나온다.


그림 5. DB2 IMPORT의 샘플 출력


Exegenix와 같은 ISV(Independent Software Vendor)는 워드, PDF, 기타 문서 형식의 데이터를 XML형태로 바꿔 그 데이터를 DB2로 import 하기 위한 도구를 제공한다. (Exegenix에 대한 자세한 정보는 참고자료를 참고하라.)




XML 데이터 validation하기

방금 논의된 INSERTIMPORT 명령에 관한 예를 통해 테이블에 well-formed XML 데이터를 기록하게 된다. 여기에서는 XML 데이터를 validation하지 않는다. 이는 XML 데이터가 특정 XML 스키마에 따라 어떠한 구조에 적합한지 확인하지 않는다는 의미이다. 하지만 이런 validation은 DB2를 통해 가능하다. validation하는 방법을 알아보자.

Step 1: XML 스키마 생성하기

XML 데이터를 validation하기 위해 허용하는 element와 이에 대한 데이터 타입, 순서를 정의하는 XML 스키마가 필요하다.XML 스키마는 W3C 산업표준이고 XML 언어로 쓰여진다. XML 스키마의 기능을 설명하는 것은 이 글의 범주에서 벗어나므로, 웹 상에 있는 다양한 교재를 참조하라.(참고자료)

XML 스키마를 생성하는 많은 방법이 있는데, 텍스트 에디터를 이용하여 수동으로 생성할 수 있고 GUI Tool을 이용할 수도 있으며 자동으로 생성할 수도 있다. MDXSYS Limited와 같은 ISV는 그와 같은 XML 도구를 제공하고, IBM에서는 자사의 자바-통합 개발환경을 통한 XML 스키마 생성 지원기능을 제공한다.

예를 들어, IBM WebSphere® Studio로 그림 3에 있는 Client3227.xml 파일을 Web 프로젝트로 import한다. 마우스를 이용해 오른쪽 마우스를 클릭한 다음, 생성 -> XML Schema를 선택한다. 이렇게 하면 그림 6과 같이 특정 입력파일에 대한 유효한 XML 스키마를 생성하게 된다. 그 파일을 변경한 다음 (필요한 경우), DB2에 등록하면 된다.


그림 6. WebSphere Studio를 이용해 XML 파일로부터 XML 스키마 생성하기


이제 유연한 XML 스키마를 만들어 고객들마다 다른 연락정보 형태를 가질 수 있다고 가정해 보자. 예를 들어 여러 전화번호 또는 e-메일 주소를 제공하는 고객들과 그렇지 않은 고객들이 있다고 하자.

WebSphere Studio에서 생성한 스키마로부터 나온 그림 7과 같은 XML 스키마는 이와 같은 유연성을 보여준다. 이 스키마에는 주어진 element에 대해 허용된 최대, 최소 발생수("minOccurs" 및 "maxOccurs")에 대한 부가적인 정보를 포함하고 있다. 이 경우, 고객은 여러분이 수집하고 싶은 연락정보를 제공할 필요가 없다. 하지만 고객이 e-메일 정보를 제공할 경우, 이 스키마로 5개의 e-메일 주소(즉 5개의 "이메일" element 값)를 포함 할 수 있도록 한다.


그림 7. 클라이언트 고객정보에 관한 샘플 XML 스키마


이미 알고 있겠지만, XML 스키마는 형식정보를 포함하고 있다. 그림 7에 나온 스키마는 단순히 모든 기본 element를 문자열로 정의한 반면 운용되는 대부분의 XML 스키마는 정수, 소수점, 날짜 등 기타 데이터 형태를 이용한다. INSERT 또는 IMPORT 명령실행의 일환으로 주어진 스키마에 대한 XML 문서를 validation할 경우, DB2는 자동적으로 XML 문서에 대한 형식 주석을 덧붙인다.

Step 2. XML 스키마 등록하기

일단 적절한 XML 스키마를 생성하면 DB2로 스키마를 등록할 필요가 있는데 IBM에서는 이를 위한 여려 방법을 제공한다. DB2 제어센터에서 그래픽 마법사를 선택해 등록 절차를 안내받을 수 있고, System에서 제공하는 Stored Procedure를 호출할 수도 있으며 DB2 명령을 바로 수행할 수도 있다. 일단 DB2 명령을 바로 수행하는 방법을 사용해본다. 이 방법을 사용하면 DB2가 보이지 않게 작업하는 것을 보다 쉽게 이해할 수 있다.

스키마가 상당히 큰 경우, 스키마를 등록하기 전, 애플리케이션 힙 사이즈를 증가시키면 된다. 예를 들어, 다음과 같은 statement를 수행해 보자.


Listing 4. 애플리케이션 힙 사이즈 증가시키기

				
 connect to test;
 update db cfg using applheapsz 10000; 

그 다음 단계로, XML 스키마를 등록한다. 등록된 XML 스키마가 다른 XML 스키마를 참조하지 않는 경우 단일 명령으로 스키마를 등록하고 등록과정을 완료한다. 그렇지 않은 경우에는 각각의 명령을 수행해 1차 XML 스키마를 등록하고 다른 필요한 스키마를 등록한 다음 등록 과정을 완료한다. 스키마 문서가 상당히 큰 경우에는 문서 내용을 여러 개의 파일로 분할해 유지보수성, 가독성 및 재이용률을 향상시키는 게 일반적이다. 이는 복잡한 애플리케이션 또는 component를 여러 개의 모듈로 나누는 것과 유사하다. 이 주제에 관한 자세한 사항은 W3C "XML 스키마 입문서"(참고자료)를 참조하라.

이 글은 단순하고 독립적인 XML 스키마를 사용한다. 다음과 같은 명령을 이용해 DB2로 이 스키마를 등록한다.


Listing 5. XML 스키마 등록하기

				
register xmlschema 'http://mysample.org' from 'C:/XMLFiles/ 
ClientInfo.xsd' as user1.mysample complete;

이 예에서 ClientInfo.xsd는 XML 스키마 파일의 명칭이며 C:/XMLFiles 디렉토리에 위치해 있다. 이 XML 스키마는 SQL 스키마 "user1" 및 XML 스키마 "mysample"하에 DB2의 내부 저장소에 등록된다. http://mysample.org 파라미터는 이 예에서 placeholder에 불과하며 XML 인스턴스 문서에서 참조하는 URI를 명시한다. 많은 XML 문서들은 URI를 이용해 지정되는 namespace를 이용한다. 마지막으로, "complete" 절은 DB2로 하여금 XML 등록과정을 완료하도록 명령을 내리며, 등록된 스키마는 XML 데이터 검증을 위해 활용된다.

스키마 등록 과정에서 해당 스키마를 적용할 테이블 열을 지정하지 않았다는 사실을 알아둘 필요가 있다. 즉, 스키마는 SQL 열 constraints와 대등하지 않다. 주어진 스키마는 여러 다른 테이블에 있는 다양한 XML 열에 대한 데이터를 validation할 수 있다. 하지만, validation은 자동적이지 않다. DB2는 어떠한 well-formed XML 문서라도 XML 열에 저장할 수 있도록 한다. 문서를 저장하기 전에 등록 스키마에 대해 데이터를 검증하고 싶은 경우 DB2에 검증하라는 명령을 내려야 한다.

Step 3. Validation을 통해 XML 데이터 import하기

XML 스키마를 생성하고 DB2에 완전 등록시킨 상태에서, 스키마를 데이블에 삽입하거나 importing할 때 DB2로 XML 데이터를 검증할 수 있다. 스키마 validation을 염두에 두고, 초기 IMPORTIMPORT 시나리오를 다시 보도록 하자.

이미 "clients" 테이블을 구축한 경우, 테이블 컨텐츠를 삭제하거나, 테이블을 drop하고 재생성하는 것이 편리할지도 모른다. 이전에 했던 것처럼 테이블에 같은 데이터를 추가하기로 계획한 경우에만 이런 작업이 필요하다. "clients" 테이블에서 client ID 컬럼이 primary key로 잡혀 있다면 중복되는 데이터로 인해 import는 실패할 것이라는 것을 기억하자.

"clients" 테이블에 XML 데이터를 import하는 과정에 validation하기 위해서는 DB2 IMPORTXMLVALIDATE 절을 이용한다. Listing 6의 다음과 같은 문장은 XML 파일을 "clients" 테이블에 등록하기 전 clients.del 파일에 지정된 XML 파일을 validation하기 위한 기본 XDS (XML 데이터 지정자)로 이전에 등록된 XML 스키마를 사용하도록 DB2에 명령을 내린다.


Listing 6. validation하면서 XML 데이터 import하기

				
import from clients.del of del xml from C:/XMLFILES xmlvalidate using 
xds default user1.mysample insert into user1.clients; 

XML 문서가 지정 스키마와 일치하지 않는다고 DB2에서 결정되는 경우, 그 문서와 관련된 전 행은 거부된다. 그림 8은 IMPORT 명령 실행에서 나온 샘플 출력을 나타낸 것으로 출력 가운데 6개의 열 중 하나는 XML 문서가 지정 스키마와 일치하지 않기 때문에 거부된다.


그림 8. 한 열이 재송요구된 상태에서의 DB2 IMPORT 명령실행에서 나온 샘플 출력


XMLVALIDATEINSERT 문과 함께 사용되어 XML 데이터를 입력하기 전에 validation을 수행할 수 있다는 점을 알아둘 필요가 있다.문법은 이미 보았던 IMPORT 예와 비슷한데 XMLVALIDATE 절에서 등록된(처리완료된) XML 스키마를 지정하면 된다. (이에 대한 더 자세한 정보는 "A simple Java example" 을 참조한다.).




요약

DB2 Viper는 새로운 XML 데이터 타입과 XML 데이터를 효율적으로 자동 저장/처리하는 엔진 레벨 컴포넌트를 포함하여 XML을 지원하는 중요한 기능을 제공한다. 독자가 이 기능들을 빨리 이해하도록 하기 위해, 이 글에서는 테스트 데이터베이스 및 샘플 데이터베이스를 생성해 XML 문서를 저장하는 방법에 대해 설명했다. 본 글에서는 또한 XML 데이터로 데이터베이스를 구축하는 방법에 대해 검토해 보았다. 마지막으로, 사용자-제공 XML 스키마에 대해 XML 데이터를 validation하는 DB2의 기능을 요약하고 validation 과정을 시작하는 예를 제공했다.

DB2의 새로운 "native" XML 기능을 이용해 XML 데이터를 저장하는 방법을 배웠으므로, 여러분은 그 데이터를 조회할 준비가 되었다. 다음 글에서는 데이터 조회방법에 대해 알게 된다. 여기서는 DB2의 새로운 XQuery 기능 및 DB2의 SQL에 관한 XML 확장 등에 관해 소개한다.

감사의 글

이 글에 의견을 남겨주신 Rav Ahuja, Matthias Nicola 및 Gary Robinson 에게 감사의 말을 전한다.

기사의 원문보기





참고자료

교육


제품 및 기술 얻기


토론

출처

  • IBM DeveloperWorks

'DB2' 카테고리의 다른 글

[본문스크랩] DB2 SQLSTATE 메시지  (0) 2007.02.23
SQL을 이용한 DB2 XML 데이터 쿼리  (0) 2007.02.14
DB2 INDEX 설계  (0) 2007.02.02
DB2에서 *.sql 파일을 읽어들여 실행하기  (0) 2006.12.31
Column Size 변경  (0) 2006.12.19
 
블로그 이미지

시반

시반(詩伴)이란 함께 시를 짓는 벗이란 뜻을 가지고 있습니다. 함께 나눌수 있는 그런 공간이길 바라며...

카테고리

분류 전체보기 (233)
개발 이야기 (73)
WEB2.0 (57)
DB2 (24)
MySQL (6)
오라클 (26)
기타 (44)
취미 (0)
잡담 (2)