II. XML과 Database 연동 [Beginning XML, 제13장] 멀티미디어 데이터베이스 (2001.10.23~11.1)
목차 1. 관계형 Database 예제 2. 기존의 Database 사용하기 3. XML을 Database에 통합하기 [교재] 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 1 2001/10/1 123589 125694 20 123590 125693 E25-25A 5
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 name 홍길동 order_no account_no item quantity date 123587 125692 E16-25A 16 2001/9/1 name 홍길동 description 책상
SQL Join Normalization 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_no c.name o.item p.description o.quantity o.date 123587 125692 홍길동 E16-25A 책상 16 2001/9/1
2. 기존의 Database 사용하기 N-계층 구조 N-계층 구조의 장점 N-계층 구조에 XML 적용 => 어느 계층? (경우에 따라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 SQL server Oracle SQL COM 표준 인터페이스 (Component Object Model) 예, ADO VB, JDBC DB2 data object SQL server data object Oracle data object XML 언어 사용 저장 - 서버에 독립적, - HTTP 프로토콜 통신 Business Object Business Object . . . 서버 독립적 XML 표현 ASP, CGI, VB, Java => XML, HTML, etc. Presentation Presentation
예제 코드 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 rsResults AS ADODB.Recordset Set rsResults = cnnDatabaseConnection.Execute(strSQL) 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 문서에 추가 <root> <name /> </root> <root> <name> 홍길동 </name> </root>
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 XML 형식의 데이터 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( ) ‘ 이미 XML 문서 형태로 되어 있음
4. Database 제작사와 XML XML과 Database는 서로 보완 관계 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 ISAPI filter 사용 템플리트 파일 사용 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 =“고소영” /> <row name =“이몽룡” /> </root>
템플리트 파일 사용 예제2 http://서버명/DB명/order.xml <?xml version=“1.0” ?> => 원하는 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>
템플리트 파라메터 사용 IE 출력 : 스타일 시트 선언 포함 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 Java XSQL sublet 작성 SQL 예제 : SELECT name FROM Customer 결과 Java XSQL sublet 작성 http://서버명/DB명/emp.xsql?find=T&sort=EMPNO <?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>