임 순 범
숙명여대 정보과학부 멀티미디어학과
II. XML 과 Database 연동
[Beginning XML, 제 13 장 ]
멀티미디어 데이터베이스
(2001.10.23~11.1)
목차
[ 교재 ] Beginning XML, David Hunter 외 5 인 공저 , 정보문화사 , 2001.
제 13 장 XML 과 데이터베이스 , pp.625-654.
1. 관계형 Database 예제
2. 기존의 Database 사용하기 3. XML 을 Database 에 통합하기 4. Database 제작사와 XML
1) Microsoft SQL Server
2) Oracle XDK
1. 관계형 Database 예제
• RDB 의 특징
– 테이블을 사용하여 데이터를 구조화 : Field, Record – 초점은 Application 이 아니라 데이터 그 자체
• 예제
– Parts table, – Customer table
– Order table
item description
E16-25A 책상
E25-25A 소파
account_no name home_phone work_phone 125692 홍길동 02)555-1212 02)555-2121 125693 고소영 02)555-1111 02)555-1112 125694 이몽룡 043)854-9919 02)555-1010
order_no account_no item quantity date
123587 125692 E16-25A 16 2001/9/1
123588 125692 E16-25A 1 2001/10/1
123589 125694 E16-25A 20 2001/10/1
• SQL (Structured Query Language)
SELECT name FROM Customer WHERE account_no = ‘125692’
• 결과 :
SELECT Order.order_no, Order.account_no, Customer.name, Order.item, Parts.description, Order.quantity, Order.date
FROM Order, Customer, Parts
WHERE Order.order_no = ‘123587’
AND Customer.account_no = Order.account_no AND Parts.item = Order.item
– Recordset : ADO(Active Data Objects) 기능 – Uniqueness (Database Integrity) : Primary key
description 책상 order_no account_no item quantity date
123587 125692 E16-25A 16 2001/9/1
name 홍길동 name
홍길동
• SQL Join
– SELECT o.order_no, o.account_no, c.name, o.item, p.description, o.quantity, o.date
FROM Parts p INNER JOIN Order o ON p.item = o.item
INNER JOIN Customer c ON o.account_no = c.account_no
WHERE o.order_no = ‘123587’• Normalization
– Database Integrity, easy to application, but speed (need to join) – vs. Denormalization
o.order_no o.account_n
o c.name o.item p.description o.quantity o.date
123587 125692 홍길동 E16-25A 책상 16 2001/9/1
2. 기존의 Database 사용하기
• N- 계층 구조
모든 데이터 저장 , 보통 경우는 Database
( 경우에 따라 stored procedure 사용 )
Database 와 Business Objects 가 서로 통신
( 예 , ADO Recordset)
application 논리에 따라 presentation 과 data 층 통신
사용자와 의사소통
• N- 계층 구조의 장점
– 개발자 역할이 단순화 : 각 계층 별로 – 변경이 용이하고 , 재사용성 증가
– 분산 시스템의 확장성 및 보안이 좋다 .
• N- 계층 구조에 XML 적용 => 어느 계층 ?
Data services Data Objects Business Objects
Presentation
• 이기종 분산 환경의 예
• XML 을 사용한 분산 환경 구축
– BizTalk, SOAP, XML-RPC 등 DB2
DB2 data object
Business Object
Presentation
SQL server Oracle
SQL server data object
Oracle data object
Business Object
Presentation
SQL
COM 표준 인터페이스 (Component Object Model) 예 , ADO VB, JDBC
XML 언어 사용 저장 - 서버에 독립적 ,
- HTTP 프로토콜 통신
서버 독립적 XML 표 현
ASP, CGI, VB, Java => XML, HTML, etc.
. . .
예제 코드
• Data Object 로부터 XML 결과 받기
– Data Object 생성하고 , 결과 XML 문서를 작성하는 VB 코드
– Database 에 접속하기 위하여 ADO(ActiveX Data Object) 객체 사용 – MSXML 파서를 사용하여 XML 문서 생성
• 예제 코드
– ADO 의 Connection 객체 사용하여 DB 에 접속 – DB 를 작동하기 위한 SQL 구문 준비
=> SQL 실행 & 결과 XML 문서 생성
Dim cnnDatabaseConnection AS ADODB.Connection Set cnnDatabaseConnection = New ADODB.Connection
…Dim strSQL As String
strSQL = “SELECT name FROM Customer WHERE account_no = ‘125692’
”
– Connection 객체의 Execute() 메소드가 SQL 구문 호출 – 결과는 ADO 의 Recordset 객체로
– 문서 생성 : MSMXL 의 DOM 객체 사용
– 결과
Dim objXML As MSXML.DOMDocument Set objXML = New MSXML.DOMDocument objXML.loadXML “<root> <name/> </root>”
‘ 초기 문서 생성
objXML.selectSingleNode(“/root/name”).Text = rsResults(“name”).Value
‘ SQL 결과를 XML 문서에 추가
Dim rsResults AS ADODB.Recordset
Set rsResults = cnnDatabaseConnection.Execute(strSQL)
<root>
<name />
<root>
<name> 홍길동 </name>
3. XML 을 Database 에 통합하기
• 비정규화 방법으로 저장하기
– XML 문서 그대로 저장 , primary key 는 별도로 저장 – 예제 ) Order table
– SELECT order_xml FROM Order WHERE order_no = ‘123587’
order_no account_no order_xml
123587 125692 <?xml version=“1.0”?>
<Order number=“123587”>
<Account number=“125692”>
<Name>홍길동 </Name>
<Homephone>02)555-1212</ Homephone>
<Workphone>02)555-2121</ Workphone>
</Account>
<Item number=“E16-25A”>
<Description>책상 </Description>
<Quantity>16</Quantity>
</Item>
<Date>2001/9/1</Date>
</Order>
. . .
• Staging Database
– Front-end : 비정규화 데이터를 임시 저장 장소에 보관 – Back-end : 정규화된 RDB 에 저장
– application 사용 시 편리 : join 필요 없음 , 간단한 SQL
– Staging DB 에 임시로 보관 , 일정 기간 후 삭제 => 공간 문제 해결 – 제약점 : 데이터를 가공하여 사용할 때 추가 작업 필요
– 예 ) 폼기반 웹 응용 : 폼 입력시 최종 submit 에만 DB 에 전송
• XML 형식의 데이터
– Data Object 에서 XML 문서를 SELECT 혹은 INSERT 하는 SQL 명 령
– Data Object 에서 수행 작업이 감소 => 더 많은 응용 가능 – Front-end 응용에서는 XML 의 모든 장점 적용 가능
– XML 문서를 분할하여 저장하는 것도 가능 => 여러 기법 적용
예제
• 간단한 Data Object 처리
Dim cnnDatabaseConnection AS ADODB.Connection Set cnnDatabaseConnection = New ADODB.Connection Dim strSQL As String
strSQL = “SELECT order_xml FROM Order WHERE order_no = ‘123587’
”
Dim rsResults AS ADODB.Recordset
Set rsResults = cnnDatabaseConnection.Execute(strSQL)
‘ 여기까지는 동일
Dim strResult As String
strResult = rsResults(“order_xml”).Value
‘ DOM 필요 없음 :
‘ objXML = New MSXML.DOMDocument, loadXML, selectSingleNode( )
4. Database 제작사와 XML
• XML 과 Database 는 서로 보완 관계
– XML 의 강정과 유연성을 활용하는 방향
– 데이터 검색 후 XML 로 변경 , 더 나아가 XML 형태로 저장
• XML 통합기술
– Data Object 제작시 쉽게 작업하도록 XML 지원 기능제공 – Microsoft
• IE : MSXML 내장
• Microsoft SQL Server
– Oracle
• XDK (XML Developer’s Kit)
• XML SQL Utility
– eXcelon : 전문 XML Database
Microsoft SQL Server
• SQL Server 2000
– SQL 예제 : SELECT name FROM Customer
• ISAPI filter 사용
http:// 서버명 /DB 명 ?sql=SELECT+name+FROM+Customer+FOR+XML+RAW
• 템플리트 파일 사용
http:// 서버명 /DB 명 /name.xml
– 결과
<root>
<sql:query xmlns:sql=“urn:schemas-microsoft-com:xml-sql”>
SELECT name FROM Customer FOR XML RAW </sql:query>
</root>
<?xml version=“1.0” ?>
<root>
<row name =“ 홍길동” />
<row name =“ 고소영” />
• 템플리트 파일 사용 예제 2
http:// 서버명 /DB 명 /order.xml
=> 원하는 order_no 를 골라서 선택하려면
<?xml version=“1.0” ?>
<root>
<sql:query xmlns:sql=“urn:schemas-microsoft-com:xml-sql”>
<! [CDATA [
SELECT Order.order_no, Order.account_no, Customer.name,
Order.item, Parts.description, Order.quantity, Order.date FROM Order, Customer, Parts
WHERE Order.order_no = ‘123587’
AND Customer.account_no = Order.account_no AND Parts.item = Order.item
FOR XML RAW ] ] > </sql:query>
</root>
• 템플리트 파라메터 사용
http:// 서버명 /DB 명 /order.xml?ordnum=‘123587’
– IE 출력 : 스타일 시트 선언 포함
<?xml version=“1.0” ?>
<?xml-stylesheet . . . ?>
<root>
<sql:query ordnum=‘ ’ xmlns:sql=“urn:schemas-microsoft-com:xml-sql”>
<! [CDATA [
SELECT Order.order_no, Order.account_no, Customer.name,
Order.item, Parts.description, Order.quantity, Order.date FROM Order, Customer, Parts
WHERE Order.order_no = ?
AND Customer.account_no = Order.account_no AND Parts.item = Order.item
FOR XML RAW ] ] > </sql:query>
</root>
Oracle XDK
• 자바용 XML SQL Utility
– SQL 예제 : SELECT name FROM Customer – 결과
• Java XSQL sublet 작성
<?xml version=“1.0” ?>
<ROWSET>
<ROW id=“1”> <name> 홍길동 </name> </ROW>
<ROW id=“2”> <name> 고소영 </name> </ROW>
<ROW id=“3”> <name> 이몽룡 </name> </ROW>
</ROWSET>
<?xml version=“1.0” ?>
<?xml-stylesheet . . . ?>
<query find=“%” sort=“ENAME” >
SELECT * FROM EMP
WHERE ENAME LIKE ‘%{@find}%’
ORDER BY {@sort}
</query>
• XSQL 템플리트 파라메터 사용 예제
http:// 서버명 /DB 명 /order.xsql?ordnum=‘123587’
<?xml version=“1.0” ?>
<?xml-stylesheet . . . ?>
<query ordnum=‘ ’ >
<! [CDATA [
SELECT Order.order_no, Order.account_no, Customer.name,
Order.item, Parts.description, Order.quantity, Order.date FROM Order, Customer, Parts
WHERE Order.order_no = {@ordnum}
AND Customer.account_no = Order.account_no AND Parts.item = Order.item
] ] >
</query>