XML 로 인터넷 상에서 데이터 주고받기

Dino Esposito ( [email-masked]  )

원본
기사 URL : http://msdn.microsoft.com/msdnmag/issues/0400/cutting/print.asp

다음의 번역이 옳다면 정성태([email-masked]: http://user.chollian.net/~kevin13)
가 한 것이고, 그렇지 않다면 그가 한 것이 아닙니다. 단지, 틀린 점이 있다면, 메일부탁드립니다. 조언을
기다립니다.

[역자 서문]
이 글은, 제가 임의로 번역한 것입니다. 원문 번역을 충실히 하지 않았으며,
개인적인 의견으로 필요없겠다 싶은 말들은 과감히 삭제를 했습니다. 지금까지 공부해 오면서, MSDN Magazine 에
MS 기술의 많은 부분들이 공개되어 있는 것을 경험했습니다. 영문이기 때문에, 쉽게 다가서지 못하는 분들께 조금이라도 그
기술을 알려드리고자 하는 뜻에서 번역을 한 것입니다. 저는 영어를 그리 잘 하는 편이 아니므로, 다소 제가 이해를 잘못한
부분이 있을 수 있으므로, 그에 대한 책임은 질 수 없습니다. 그리고, 저도 현업에서 일하고 있기에 쓸데 없는 문장까지
일일이 번역을 하는 수고는 할 수 없습니다. 기사의 원 저자에게는 정말 죄송합니다. 참고로, 여기서 제가 쓰는 모든 글은
어쨌든, "원 저자" 가 쓴 글을 읽고 제가 나름대로 이해해서 쓴 것입니다. 따라서, 여기 있는 글에 대한 모든 저작권은
제가 아니라, 바로 그 "원 저자" 에게 있습니다. 혹시나, 여기 있는 번역글을 다른 곳에 쓰신다면, 반드시 그 출처에
"원 저자" 의 이름을 밝혀주시기 바랍니다. 저는... ^^ 넣지 않으셔도 좋습니다. 아울러, 이 글을 시작으로 해서 많은
분들이, 틈나는 데로 이러한 번역을 해서 "웹" 상에 공개를 하신다면, 우리나라의 S/W 발전에 많은 도움이 되리라 생각해
봅니다. 서문... 이만 줄입니다.

* 이 문서에서 링크되어져 있는 표는 이 문서의 맨아래에
나열되어져 있습니다.

[번역 문서 Version 1.0: 마지막 수정일 2002.07.03]

지난 2달간의 MSDN 기사에서, Client/Server 의 전통적인
방식으로 웹상에서의 데이터 교환을 위한 기술을 다뤄봤습니다. 그리고, Remote Scripting (RS) 과
Remote Data Services ( RDS ) - 둘 다 모두 Microsoft® Data Access
Components(MDAC)2.x 의 일부분 - 로 작업을 할 때 필요한 툴과 그 원리를 살펴봤습니다.
대부분의 기사에서, 나는 동일한 Application 의 일부분으로 동작하면서 구조적 정보의 교환을
필요로 하는 분산모듈을 검토해왔습니다. 여러분의 운영체제가 Windows 기반인 경우, ActiveX® Data
Objects (ADO) - 특히 recordset 객체 - 는 좋은 선택일 수 있습니다.

만약, 여러분이 웹상에서의 데이터를 주고받기 위한 수단으로 ADO Recordset 기술을 적용시킨다면,
몇가지 해결해야할 문제가 있습니다. 우선, 레코드셋은 데이터를 Package 하는 방법만을 정의한다는
것입니다. 달리 말하면, 하나의 RecordSet 객체는 데이터를 주고받을 동안 그 데이터를 감싸서 보호하는
일종의 외부막 역할을 할 뿐입니다. 여전히 Recordset 은 Data 전송자와 수신자 사이에서의 물리적 연결을
제공하는 저수준의 기술을 필요로 합니다. ( 역주: 또한, ADO 를 쓰는 경우, 포트를 80 으로 사용하지 않기
때문에, 일반적인 방화벽을 통과할 수 없습니다. )
RDS, RS, 그리고 Data Biding 은 현재의
웹 페이지를 "새로고침" 하거나 떠나지 않고 서버에 대한 데이터를 받는 3가지 접근 방법이 있습니다.
RS 가 이러한 해결책에 대한 가장 간단한 방법인 반면, 그것 자체가 완전히 Script 이기 때문에, 일일이 라인단위의
컴파일을 거쳐야 하므로 가장 낮은 성능을 보입니다. 반면에, RDS 와 Data Binding 은 Compile
된 COM 객체로 제공이 되어지므로, 좀더 빠른 실행성능을 보여줍니다. 하지만, COM 은 현재 Internet
Explorer 에서 기본제공이 되어질 뿐, 그 이외의 클라이언트 브라우저에서는 아직 제공이 되지 않고
있습니다. ( 물론, Netscape 의 경우 COM 지원 Plug-In 을
제공한다는 소식이 있긴 하지만 ) 어쨌든, RDS 를 사용하기에는 Client 브라우저에 따라서 동작이
안될 수가 있는 단점이 있습니다.
이번 컬럼에서, 나는 현재의 웹페이지를 "새로고침" 하거나
떠나지 않고 서버에 대한 데이터를 받을 수 있는 그 4번째 방법을 소개할 것입니다. 그것은, XML
데이터를 다루는 COM 객체를 기반으로 합니다. - 물론, 이 기술도 client browser 선택에 제약을
가하기는 합니다. 해당 COM 객체는 Microsoft Internet
Explorer 5.0 과 함께 제공되는 XML COM 객체의 하나인 XMLHttpRequest
입니다.  XMLHttpRequest 객체에 대해 깊이있게 알아보면서, 여러분은 이 기사에서 XML 과
관련해서 향후 웹 Application 에 대한 가장 중요한 영향력을 행사하게 될, 2가지 주요 기술인 "BizTalk"
와 "Web Services" 를 알아 볼 것입니다. 비록, 본주제에 비해서 깊이있게 다루지는 못하겠지만, 그 중요성을
인식하고, 나중에라도 꼭 배워두기를 바랍니다.

XML
개요
XML 이 바로 Component 기술의 결정체입니다. ( 역주: 원문에서는 "XML
is an emerging component technology" 라고 되어 있습니다. 번역이 좀 애매하더군요.
어쨌든, Don Box 는 기존 component 기술들에 대한 많은 부작용이 있으며, 그에 대한 모든
것을 일소에 해결하는 것이 바로, XML 이라고 말하고 있습니다. 그래서 제 나름대로 그렇게 번역을 한
것입니다. 좀 더 나은, 번역이 있다면 의견주십시오. ) 이 사실에 대해서 의심이
된다면, Don Box 의 "XML Manifesto" 라는 기사를 일러보십시오. MSDN™ Online (http://msdn.microsoft.com/library/en-us/dnxml/html/xmlmanifesto.asp) 기사에
전문이 실려있으며, MSJ 2000 년 1월호 기사에 (http://www.microsoft.com/msj/0100/com/com0100.asp)
간략하게 요점정리가 되어 있습니다.  또한, Aaron Skonnard 의 기사인 MIND 2000 년
1월호 "SOAP: The Simple Object Access Protocol,"  (http://msdn.microsoft.com/isapi/gomscom.asp?TARGET=/mind/0100/soap/soap.asp
) 에서는 미래의 분산시스템에서의 XML 에 대한 역할을 이해하는 데에 도움을 줄 기사를 실었습니다.
component 기술의 입장에서, XML 의 설계목적은 서로 다른 시스템간에 관계된 서로다른 모듈간의
보다 더 쉬운 상호동작을 가능케 하는 것입니다. XML 은 상대적으로 component 분야에서는 신참에
속합니다. XML 이 알려지기 이전에 이미, COM, DCOM, CORBA 등의 기술이 사용자와 시스템을
연결하는 기술로서 나와 있는 상태였습니다.
그렇다면, 어떻게 XML 이 그토록 빠르게 기존 기술들을 제치고 유명해 질 수 있었을까요? 대답은
"단순함" 에 있습니다. XML 은 단지 평문 텍스트 로 이루어져 있지만, 그 사실이 XML 을 강력한 도구가 되도록
만들었습니다. 그 구조가 "단순" 하기 때문에, 마크업 언어는 쉽게 특정 태그에서 특정 정보를 가져올 수가 있는 것입니다.
일반 텍스트로 이루어져 있다는 것과, 일반적인 방법으로 분석가능한 문법으로 이루어져 있기
때문에, 다양한 분산환경에서 쉽게 구현이 될 수 있는 것입니다. 기존 기술들에 비해서, 이것은
상당한 이점입니다. ( 사실, Unix 에서 COM 을 구현하는 것보다는 XML 문장을 인식하는 것이 훨씬 쉬울
수 밖에 없습니다. ) 어떠한 가공없이 전달되어진 "문자열" 은 목적지 플랫폼에서 쉽게 다루어질 수 있습니다.
오늘날, XML 의 가장 큰 장점이 곧 단점으로 적용됩니다. XML 은 너무 일반적이어서, 어떤 한
문서에 대한 확실한 문법체계를 소홀히 해서 사용되어지고 있습니다. 그런 상태에서의 XML 표현 문서가 단일한 조직
및 여러 하드웨어 및 플랫폼에서 잘 동작할 것이기 때문에, 단일한 조직내에서 쓰기에는 좋을 수 있습니다. 하지만,
한 조직내에서 결정한 어떤 문서의 포맷이 다른 조직내에서 동일한 문서에 대해서 정의한 XML 포맷과 같다는 장담은
못합니다.그러한 좀더 광범위한 환경에서 동일한 결과를 얻기 위해서는, 어떤 표준을 정하는 데에 있어서 많은 노력을
필요로 하게 됩니다. 이런 절차는 아마도 수년이 걸릴 수도 있을 것입니다.
불행히도, 서로 다른 조직에서의 시스템을 통합하는 경우, 특히 개방환경에서는, XML 은 약간의 제약을
보입니다. XML 은 데이터 기술형식이기 때문에, 그 데이터를 어떻게 표현할지에 대한 동일한 의견을 갖는 경우에만 유용할
뿐입니다. 예를 륻어서, "송장(送狀)" 은 그것을 다루는 어떤 과정에서든지 논리적으로 동일한 형식을 가지고 있습니다.
하지만, 다른 주제들에서는 각각 다른 이진 포맷으로 표현할 수 있습니다. 물리적으로 저장되는 포맷에도 불구하고,
문서는 모든 플랫폼에서 사용가능하도록 인식되어지는 포맷으로 전송되거나 받을 필요가 있습니다. 바로 그때, XML 이 그런
포맷으로 사용되어질 수 있습니다.
BizTalk (http://www.biztalk.org/ )  는
XML 기반의 문서포맷의 데이터 베이스를 생성하는 것을 목표로 하는 선두주자입니다. 100 개 이상의 관련 업체들이
BizTalk 에 참여하고 있으며, 이미 30 여개 이상의 XML Schemas 가 관심을 가진 업체들이 참조할
수 있도록 제공되어져 있습니다.
BizTalk 기반의 문서는, 특정 용어집로부터 태그를 전개할 수 있고, 해당 단체가 문서의
유형을 정의한 규칙을 따르는 XML 파일입니다. ( 아! 번역은 너무 어렵습니다. 그냥 영어로 읽으면 무슨
소리인지는 알 것 같은데, 같은 의미의 한글을 찾기가 너무 어렵습니다. ) 하나의
BizTalk 기반의 문서는 실제로 BizTalk 서버들에 의해서 네트워크를 통해서 교환되어집니다. [표 1] 에
보면, 전반적인 BizTalk 의 설계를 볼 수 있습니다. 상업적인 파트너 관계에서 데이터를 주고 받는 데에 있어서 XML
이 어떠한 역할을 하는지를 보여줍니다. 양쪽 모두, 문서를 그들만의 플랫폼에서, 그들만의 원시 포맷으로 다루고 있지만,
XML 덕분에 구조적인 차이점에도 불구하고 서로 데이터를 주고받고 있습니다.

표 1 BizTalk Architecture

BizTalk 는 Windows DNA 2000 의 중심에 있으며,
E-Commerce 솔루션을 개발하는데에 도움을 주는 주된 "키" 역할을 해낼 것입니다. 종종, 오늘날의
E-Commerce 솔루션은 기존의 호스트 기계( 주로 mainframe 으로 알려진 )에 놓여진
데이터와 정보를 새로운 정보 시스템에 통합시킬 것을 요구합니다. Windows DNA 2000
기술은 코드네임 "Babylon" 으로 알려진 제품을 통해서 "Legacy" 데이터와의 통합에 대한
해결책을 제시합니다. Babylon 은 XML 트랜잭션 통합 (XMLTI) 이라 불리는 기능을 제공하는
서버입니다. 만약, COMTI 라는 용어자체에 익숙하다면, 이미 XMLTI 의 반은 이해한 것과 다름없습니다. XMLTI
는 어떤 메인프레임 기계에서 동작되어지는 CICS 또는 IMS 프로시져를 포함하는 COMTI 기반의 component 를
감싸는 XML 코드를 생성해 주는 Component 입니다.

XML 속으로.
지금까지, 나는 Web Application, 특히 Windows DNA
2000 설계구조의 차세대 주자라는 입장에서 XML 이 차지하고 있는 위치에 대해서
설명했습니다. 세계적인 데이터 교환을 해결하기 위한 키가 바로 XML 이라는 것을 인정하고, 자 이제 어떠한
소프트웨어 또는 Component 기술이 오늘날, XML 을 이용하고 있는지 알아봅시다.  ( 표 2 ) 에 위에서 언급한 BizTalk,
Babylon 을 포함해서  Windows 2000 DNA 기반기술을 이루는 다른 제품들을 보이고 있으며, 아직
Windows 2000 DNA 의 통합된 기술 자체는 계속 개발중에 있습니다. Windows DNA 2000 은 조만간
완성될 것이지만, 아직 현업에서는 그리 광범위하게 사용되어지고 있지는 않습니다.
Microsoft 의 XML Document Object Model ( XMLDOM ) 은 XML
영역에서 중요한 요소로 자리매김하고 있습니다. XMLDOM 은 COM 객체이며, Dual
Interface 로 되어 있어서 Script 에서도 사용할 수 있으며, XML 문서내용을 "객체모델" 로 다룰
수 있도록 하고 있습니다. 이 XMLDOM 을 구현한 COM 객체는 Internet Explorer 5.0 이상이
설치된 컴퓨터나, Windows 2000 과 IIS 5.0 이 설치된 컴퓨터라면 이미 자동으로 설치가 되어 있는
상태입니다. XMLDOM COM 객체는 DOM 구조의 문서를 다중 쓰레드에서 동시에 액세스 가능하도록
FreeThreaded 버전을 포함하고 있습니다. 기존 Single-Threaded Model 의 XMLDOM
객체의 "ProgID" 는 "Microsoft.XMLDOM" 이고, FreeThreaded Model 의 XMLDOM
객체의 "ProgID" 는 "Microsoft.FreeThreadedXMLDOM" 입니다. 쓰레딩 모델이
다르다는 것만 제외하고는 두 객체는 동일한 역할을 수행합니다. 선택은, DOM 문서를 접근하는 쓰레드의 수에
따라서 하면 됩니다.
Internet Explorer 5.0 에는 "XMLHttpRequest" 라는 흥미로운 객체가
하나 더 있습니다. 이 객체 역시, Dual Interface 이고, 따라서 스크립트에서도 자유로이 사용이 가능합니다. 그
역할은 HTTP 프로토콜을 이용해서 XML 을 주고 받을 수 있도록 해줍니다. 우와... 이 기능은
여러분들에게 또다른 가능성을 보여줍니다. 즉, 여러분들은 Client 측에서 XMLHttpRequest
객체를 통해서 WebServer 에 GET/POST/PUT 등의 방식을 이용한 데이터를 주고 받을 수 있도록
해줍니다.

XMLHttpRequest Object
표 3 에서는 인터넷 환경에서, 다양한 시스템을 통합하기 위한
전형적인 동작을 보여줍니다. Win32® 기반 플랫폼( WinCE 를 제외하고 ) 에서는 여러분들은
XML 파일을 처리하기 위한 Parser 로 XMLDOM 객체를 사용할 수 있습니다. 물론, 다른 플랫폼에서는 여러분들이
선호하는 적당한 XML Parser 를 구해서 적용할 수 있습니다. 물론, 이 경우, 서로의 XML 문서는 협의된 포맷 -
동일한 태그와 속성의 규칙으로 이루어진 - 이어야 할 것입니다. 그렇게만 된다면, 서로의 시스템에서 그 문서가 어떻게
해석될 것인지는 자유재량에 맡기면 그만입니다.

표 3 XML as a Universal Glue

[표 4] 는 Win32 기반의 서버와 클라이언트인 경우를
보여줍니다. 어떤 경우든지, 이미 XML 을 다루는 객체가 기본제공이 되기 때문에, 여타의 객체를 제작할
필요는 없습니다. 실제로, XMLHttpRequest 객체는 이러한 작업을 대신해줄 것입니다. 또한,
XMLHttpRequest 객체는 XMLDOM 객체를 파일에 저장하는 과정없이 직접 서버로 전송할 수가 있습니다. 간단한
예제를 통해서, 이러한 과정이 어떻게 구현되어지는지를 보겠습니다.

표 4 Using XMLHttpRequest

다음은 VBScript 파일입니다.클라이언트 Application ( 대표적으로 Internet
Explorer 안의 HTML 내에 존재하는 Script ) 이 웹서버 ( IIS 에 있는 Asp 페이지 ) 와 어떻게
상호작용을 하는지를 보여줍니다.

' MS 의 XMLHTTP 객체를 생성
Set xmlhttp = CreateObject("Microsoft.XMLHTTP")
' Open 메소드를 통해서, HTTP 프로토콜의 "GETP" 방식으로
' 서버의 test.asp 를 호출을 동기방식으로 호출할 것임을 명시
xmlhttp.open "GET", "http://expoware/test.asp", False

xmltext = "<magazine>MIND</magazine>"

' MS 의 XMLDOM 객체를 생성
Set xmldom = CreateObject("Microsoft.XMLDOM")
' xmltext 에 저장된 텍스트를 XML DOM 구조로 로딩합니다.
xmldom.loadXML xmltext
' XML DOM 구조로 해석된 문서를 직접 XMLHTTP 객체를 통해서 서버에 전송합니다.
xmlhttp.send xmldom '
이때, 이전의 open
에 지정된 URL 로

호출이 됩니다.
MsgBox xmlhttp.responseText '
test.asp 에서
response 시킨

텍스트를 출력합니다.

위의 예에서 XML 문자열이 일단, XMLDOM 객체에 로드된
이후에 전송이 된 것을 볼 수 있는데, 꼭 그렇게 할 필요는 없습니다. 그냥 바로 xmlHTTP.send 의 파라미터로
XML 형식의 문자열을 보내도 상관없습니다. 어쨌든, 위의 예를 통해서 XMLHTTP 객체가 XMLDOM 객체의
내용을 그대로 전송할 수 있음을 보여줍니다.
XMLHTTP 의 Open 메소드에서 첫번째 인자는 HTTP 프로토콜에 지정된 메소드 중에 하나의
문자열을 기록하면 됩니다. 두번째 인자는 실제 호출이 이루어질 Web Server 의 URL 입니다. 세번째는 그 호출이
동기/비동기로 이루어지는 것을 지정합니다. False 인 경우, 동기로 이루어집니다. Open 메소드는 부가적인 정보를
제시할 뿐이며, 실제 통신이 발생하는 시점은 XMLHTTP 의 Send 메소드 호출시점에 이루어집니다. Send 메소드의
파라미터로 지정된 내용은 지정된 URL 에 전송이 되어집니다. Send 메소드의 파라미터는 XML 문자열 자체이거나,
XMLDOM 객체일 수 있습니다.
Open 메소드의 3번째 인자로 지정이 되는 비동기/동기 호출은 Send 메소드의 작동을 구분시킵니다.
False, 즉 동기방식인 경우, Send 메소드를 호출하면 웹서버로부터 응답이 완전히 끝날 때까지, 실행이 멈추게
되지만, True, 즉 비동기 방식인 경우는, Send 메소드를 호출하면, 웹서버로부터의 응답이 모두 올때까지 기다리지
않고 바로 실행을 재개합니다. 2가지 경우 모두, 동작이 완전하게 끝나는 시점에서 서버로부터 전송되어진 결과를
확인할 수 있습니다. 이 경우, XML 문자열 자체로도 가능하고, XML DOM 객체로 직접 받을 수도 있습니다.
또한, HTTP 프로토콜로 전달된 HTTP Header 도 확인할 수 있습니다. [표5] 에서 전달되어진 HTTP
Header 를 확인하는 것을 볼 수 있습니다. XML 문자열, XMLDOM 객체 이외에도 IStream
인터페이스를 통한 Stream 객체로도 서버로부터의 전송되어진 데이터를 반환받을 수 있습니다. 위의 예제의 마지막 라인에
보여지는 responseText 속성은 서버로부터 전송된 문자열을 그대로 반환해주는 기능을
합니다.

표 5 XMLHttpRequest Headers

클라이언트 코드는 위와 같이 작성을 하면 되고, 이제 서버의 코드를 보겠습니다.
만약, 클라이언트와 서버 모두에서 XML 의 장점을 충분히 살려서 프로그램을 작성하고 싶다면,
XMLHttpRequest 객체는 양쪽의 XML 기반의 통신을 완벽하게 도와줄 것입니다. DCOM 의
경우, 자료 전송을 위해 마샬링을 통하게 되지만, 이 경우에는 그러한 마샬링 코드가 전혀 필요없습니다.
XMLHttpRequest 객체를 이용해서 XMLDOM 객체를 자유로이 서버와 클라이언트간의 자료전송에 사용할 수
있습니다.
서버의 ASP 페이지에서는, 클라이언트의 XMLHttpRequest Send 메소드가 보낸 데이터를
Requset 객체를 통해서 받을 수 있습니다. 이 경우, XML 문자열을 바로 XMLDOM 객체에 로드시켜서 작업할 수
가 있으며, 클라이언트에는 새로운 XML 형식의 문자열을 보낼 수가 있습니다.
다음에 간단한 예제를 보입니다. 아래와 같은 경우, 클라이언트의
HttpRequest 객체의 responseText 속성으로 Response 로 씌여진 문자열을 그대로 받을 수
있습니다.

<%
Response.Write "<xml>Hello</xml>"
%>

다음은 클라이언트에서 전달된 데이터를 받은 다음에, 보내져온
데이터를 그대로 클라이언트에 보내주는 예제입니다.

<%
set xmldom = Server.CreateObject("Microsoft.XMLDOM")
xmldom.Load(Request)
strText = "You sent me: " & xmldom.xml
Response.Write strText
%>

Request 객체가 XMLDOM 객체의 인스턴스로 씌여진 것이
눈에 뜨입니다. XMLHttpRequest 객체의 중요한 속성과 메소드는 [ 표
6] 에 나열해 놓았습니다.

XMLDOM 다루기

위의 예제에서 보듯이, HTTP 프로토콜을 통해서 서버와 클라이언트간에 교환된 것은 XML 데이터가
담겨있는 XMLDOM 의 인스턴스입니다. 이것은 곧, ASP 페이지에서 XMLDOM 객체를 받아서 필요하다면, 그것을
조작할 수 있다는 것을 뜻합니다. (역주: 사실, 너무나 당연한 얘기이긴 하지만 ) 클라이언트가 보내준 XML
데이터를 변형해서 Response 객체로 ASP 페이지에서 클라이언트로 써준다면, 클라이언트측의 XMLHttpRequest
Send 메소드 호출이 끝난 시점에서 그 변경된 데이터를 조작할 수 있게 되는 것입니다. ASP 페이지내에서, Request 메소드는 입력으로 들어온 XMLDOM 을 액세스 할 수 있도록
해주면, XMLDOM 객체의 메소드를 통해서 XML 데이터를 간단하게 조작할 수 있습니다. 예를 들어서, 다음의 예제
코드에서, 입력으로 들어온 XML 데이터에서 <magazine> 노드에 있는 내용을 "MSDN Magazine"
으로 변경시켜서 클라이언트에 내려보내는 것을 볼 수 있습니다.

<%
set xmldom = Server.CreateObject("Microsoft.XMLDOM")
xmldom.load(Request)
set myNode = xmldom.selectSingleNode("magazine")
myNode.text = "MSDN Magazine"
strText = "You sent me: " & xmldom.xml
Response.Write strText
%>

selectSingleNode 메소드는
XMLDOM Tree 에서 특정 노드를 지정하는 역할을 합니다.

Web Services 의 세계로.
XMLHttpRequest 객체로 인해서, 여러분들은 이제 Win32 플랫폼에서 쉽게 Web
Service 를 구현할 수 있습니다. 일반적인 용어로, Web Service 는 웹을 통해서 프로그램적으로, 상호작용할
수 있는 함수를 의미합니다. 현존하는 수많은 웹사이트에서 그들의 웹컨텐츠를 프로그램적으로 쉽게 접근할 수 있는 방식을
노출시켜 놓는 다는 것이, 과연 잘하는 걸가요? 실제로 Active Channel™ 서버는 이와 같은 기능을 제공하고
있습니다. 하지만, 그것들은 HTML 페이지를 반환해주고 있습니다. 약간의 코드를 추가해서, 여러분들은 그런 기능들을
Web 계층에서의 라이브러리로 제공할 수 있습니다. Client 에서는 HTTP 프로토콜을 이용해서 그 Web
Service 를 호출할 것이고, 그것들은 XML 데이터를 받고, 역시 클라이언트에 XML 데이터를 보내면
그만입니다.
[표
7]  의 코드에 보여지는 ASP 페이지는 특정한 세미나 토픽에 관해서 Database 로부터
가져온 다음에, XML 포맷으로 바꿔서 클라이언트에 보내주는 것을 볼 수 있습니다. 다음의 코드는 [표7] 의 서비스를
클라이언트에서 어떻게 이용할 수 있는지를 VBScript 로 보여줍니다.

url = "http://expoware/xmlhttp/seminars.asp?classID=1"
set xmlhttp = CreateObject("Microsoft.XMLHTTP")
xmlhttp.open "GET", url, false
xmlhttp.send ""
MsgBox xmlhttp.responseText

이제,
여러분은 XML 과 Recordset 중에 어느것을 선택하시겠습니까?
지난
호 에서, 나는 언제, 어떻게 네트워크 상에서 여러분의 데이터를 포장할 "주 구조체"로서 ADO 객체를
써야 하는 하는 지를 설명하였습니다. RDS 는 클라이언트와 서버간에 recordset 을 교환할 수 있도록 하는
코드층입니다. Recordsets 은 XML 문자열 보다 보다 더 정교하며 강력한 기능을 제공합니다. 하지만,
그것들은 ADO 가 설치된 상태에서 작동이 되어집니다. 즉, 이것은 다양한 플랫폼과 관계된 환경에서는 RDS 를 쓸수는
없다는 것입니다.
그러나, XML 은 언어독립적인 순수한 텍스트 자료일뿐입니다. 만약, 여러분이 다양한 플랫폼에서의
자료교환을 위한 protocol 을 구현해야 하는 상황에 있다면, 명백히 XML 을 고려해 볼 수 있습니다. 마지막으로,
여러분은 Recordset 을 XML 로 변경할 수 있다는 것을 기억해 두십시오. 하지만, 특별한 부가 코드 없이, 텍스트
기반의 XML 은 Recordset 보다 용량면에서 더 커진다는 것을 염두에 두십시오.

Dino Esposito is a senior trainer and
consultant based in Rome. He has recently written Windows Script
Host Programmer's Reference (WROX, 1999). You can reach Dino at
[email-masked].

Figure 2 Windows DNA 2000 Components

Tool

Purpose

Visual
Studio

콤포넌트
제작

AppCenter
Server

Web Farm 과
같은 서버배열

Commerce
Server 4.0

E-commerce

BizTalk
Server

Business

Babylon

Legacy
data

SQL Server
7.5 (Shiloh)

Database
server

Windows
2000

System
services ( COM+ )

Figure 6 XMLHttpRequest Methods and Properties

Methods

Description

Abort

현재 이루어지고
있는 HTTP 요청을 취소합니다.

GetAllResponseHeaders

HTTP
Header 의 모든 문자열을 반환

GetResponseHeader

지정된 HTTP
Header 키에 대한 값을 반환

Open

지정된 URL 및
HTTP Method 로 서버와의 통신을 열기

Send

HTTP 요청을
보내고, 서버로부터의 응답을 기다립니다.

SetRequestHeader

HTTP
Header 에 특정값을 설정합니다.

Properties

Description

onreadystatechange

상태 변경을 알리는
이벤트 핸들러

readystate

객체의 준비상황을
나타내주는 속성

responseBody

Unsigned
Bytes 의 배열로 서버로부터의 HTTP Body 를 반환

responseStream

HTTP Body
를 IStream Pointer 로 반환

responseText

HTTP Body
내용을 Raw 텍스트 문자열로 반환

responseXML

HTTP Body
내용을 XMLDOM 에 넣어서 반환

status

HTTP 요청에
대한 상태 코드

statustext

현재 HTTP
요청에 대한 부가설명을 포함한 문자열

Figure 7 An XML-based Web Service

<%
Function Quote(s)
Quote = Chr(34) & s & Chr(34)
End Function

classID = Request.QueryString("ClassID")
strSQL = "select * from topics where class=" & classID
Set rs = CreateObject("ADODB.Recordset")
rs.CursorLocation = 3
rs.Open strSQL,"DSN=Seminars"

' Scan topics
while Not rs.EOF
strTopic = rs("Topic")
topicID = rs("TopicID")
Response.Write "<TOPIC name=" + Quote(strTopic) + ">" & vbCrLf

' Get subtopics
strSQL1 = "select * from subtopics where " & _
"class=" & classID & " and " & _
"topicID=" & topicID

Set rsSub = CreateObject("ADODB.Recordset")
rsSub.CursorLocation = 3
rsSub.Open strSQL1,"DSN=Seminars"

while Not rsSub.EOF
strName = rsSub("SubTopic")
Response.Write "<SUBTOPIC name=" & Quote(strName) & ">" &
vbCrLf
Response.Write rsSub("Description") & vbCrLf
Response.Write "</SUBTOPIC>" & vbCrLf
rsSub.MoveNext
wend

rsSub.Close
Set rsSub = Nothing

' New topic
Response.Write "</TOPIC>" & vbCrLf
rs.MoveNext
wend
Response.Write text
%>

From the April
2000 issue of MSDN Magazine.
Get it at your local newsstand, or
better yet, subscribe.

ⓒ 2001 Microsoft Corporation. All rights reserved. Terms
of Use. Privacy
Policy.