C++Builder ADO Programming (1) ADO 의개념 ADO 란? 1. ActiveX Data Object 의줄임말로 Microsoft 사의최신데이터접근기술을말한다. 2. OLEDB 에기반한고수준인터페이스이다. 고수준의인터페이스이므로 OLEDB 보다훨씬간단한객체모 델을가지며 OLEDB 의복잡함을감추고기능들만을노출시킨일종의래퍼 (wrapper) 라할수있다. OLEDB 란? 1. Microsoft사의 UDA(Universal Data Access) 전략에핵심이되는아키텍쳐로 COM 기반의저수준프로그래밍인터페이스이다. 2. 조직의모든부분들로부터얻을수있는데이터에대한접근을제공한다. 좀더자세하게는데이터소비자와데이터공급자라는두가지구성요소를이용해서데이터원본에대한연결성, 접근성을제공한다. 3. 클라이언트 / 서버나웹기반어플리케이션들은데이터를사용하는입장에서데이터소비자가된다. 데이터공급자는데이터원본들로부터데이터를얻고정보를해석하고그것을공용인터페이스를통해데이터소비자에게제공하는역할을한다. 여기서데이터소비자는데이터가어떻게접근, 처리되는지를알필요가없으며그러한기능은 OLEDB 자체에숨겨져있다. 4. OLEDB에깔린개념은 ODBC에깔려있는것과비슷하다. 그러나 OLEDB는 ODBC보다훨씬더넓은범위의데이터원본에접근할수있게해준다. OLEDB는 ODBC를통한데이터연결을지원하므로 ODBC 의모든능력들을제공한다. 따라서하나의 OLEDB 층을만들어두고기존의 ODBC 연결들을통해서기존 Database들에연결할수도있다. 이말은데이터소비자인어플리케이션은 OLEDB 공급자로 ODBC 에접근할수있다는말이며이때가능하면단일한 OLEDB 층을통하는것이더효율적이라는것을말한다. 5. 여기서중요한것은 OLEDB는관계형데이터베이스뿐만아니라비관계형데이터원본들 ( 전자우편이나스프레드시트, 디렉터리서비스, 파일시스템등등 ) 을포함한모든종류에대한데이터에대한고성능접근방식을제공한다는점이다. 이는 ODBC만으로는얻을수없는능력이다. OLEDB를이용하면간단하고표준적인수단을이용해서다종다양한정보에접근하고정보를조회, 조작할수있기때문에 ( 이것이 Microsoft의 UDA전략이다 ), OLEDB는 Microsoft가이전에제시한 DAO나 RDO( 이미물건너간기술이다 ) 같은데이터접근기술및전략보다훨씬나은것이라고할수있다. 6. 아래의그림 1-1 은위에서설명한내용을요약하여잘보여주고있다.
여기서 RDBMS는흔히 ORACLE, MS-SQL Server 정도가될수있으나별말을하지않은경우앞으로계속 MS-SQL Server를대상으로설명하는것으로한다. ORACLE은 MS-SQL Server와는근본적으로다른 RDBMS이고그에대한내용또한방대하므로상황에맞게주를달거나별도의장에서설명하기로한다. 훌륭한로컬 Database중의하나인 Access의경우도그럴것이다. ADO 객체모델 일단위에서 ADO가개발자들에게 OLEDB를사용하여데이터베이스프로그래밍을하기위한효과적인인터페이스를제공하며 COM 기반의 ActiveX 데이터객체들의집합이라는것을알았을것이다. 이말은즉스크립트언어를사용하는웹환경에서의개발뿐만아니라 C++ Builder와같은 4GL RAD 툴들을사용하는전통적인개발환경에서도 ADO를사용할수있다는말이된다. 실제로 C++ Builder에서 OLEDB 기술을사용하기위해 ADO탭에총 7개의 VCL화된 Component가있다. ( 정식명칭은 ADO Express Component이다.) 여기서는 COM 에기반한 ADO 자체의객체모델과 C++ Builder 내에서 VCL 화된클래스구조를살펴보기로 하자. ADO 버전 2.5를기준으로했을때 ADO는위그림과같이총 5개의클래스 ( 직사각형이클래스이다 ) 와여러컬렉션들과 Property, Method, 또이그림에서는소개되지않았지만여러이벤트들로구성되어있다. 이것들은이후의장에서자세하게설명될것이며어떻게 C++ Builder 내에서 VCL화되어있으며서로어떤관련이있는지또어떻게사용해야하는지를필자의코드와개발경험을통해설명할것이다. ADO 2.5는 windows 2000 Server를설치할때자동적으로함께설치되고 MS-SQL Server 2000을설치하게되면 2.6 버전이설치된다. 필자가이강의를진행하는시점에서벌써 MDAC 2.7 버전이발표되었고 ADO 또한 2.7 버전으로업그레이드가되었다. 하지만여기서는버전 2.5를기본으로강의가진행될것이다. 업그레이드된내용과아울러추가된내용을알고싶은분들은 Microsoft의홈페이지를참고하길바란다.
관련링크는 http://www.microsoft.com/data/ 이며여기에서마이크로소프트의최신데이터접근기술들과각종기술지원및그들의 UDA 전략을알아볼수있을것이다. 위의직사각형들은본질적으로 COM의클래스모듈이므로그것들의 CLSID(Class Identifier) 또는 IID(Interface Identifier) 와 VCL화된 Component의상호관계를알아보는것도좋을것이다. 직사각형이름 CLSID or IID VCL Component Connection ADODB.Connection TADOConnection Command ADODB.Command TADOCommand Stream ADODB.Stream ADO 탭에존재하지않는다 Record ADODB.Record ADO 탭에존재하지않는다. Recordset ADODB.Recordset TADODataSet TADOTable TADOQuery TADOStoredProc 다음은 VCL 클래스계층구조이다. ( Developer s Guide 에서참조 ) 위의표와그림에서중요한부분은 ADODB.Recordset 클래스가 VCL Component에서는 4개의 Component 로각각사용될수있다는것이다. 그림을보면이중에서 TADOTable, TADOQuery, TADOStoredProc Component들은 C++ Builder의 Data Access 탭에있는 TTable, TQuery, TStoredProc 와기본적으로같은성격을가지는 Component들임을쉽게짐작할수있다. 이들은모두 TDataSet으로부터파생된클래스이기에당연한이야기이며 ( 실제로 TTable, TQuery, TStoredProc 들은각각 TDataSet --- TBDEDataSet --- TDBDataSet 의계층구조를가진다 ) 따라서그들은 TDataSet의모든특징들을공유한다. 이말은어플리케이션내에서 TTable, TQuery, TStoredProc를사용해프로그래밍을한것처럼이들 3개의 Component들도거의비슷하게별무리없이사용할수있다. (Data Controls 탭의 Component들과 TDataSource Component 를이용하여데이터를표현, 조작할수있다는말이다 ) 미리말해두지만이파트의강의에서는앞의 TTable, TQuery, TStoredProc 들과 TDataSource, Data Controls 탭들의 Component들을사용하는프로그래밍방법
을자세하게설명하지는않을것이다. ( 여러개의폼과데이터모듈을포함하는일반적인 Win32 Database Application을말하는것이다. 하지만중요한코딩기법은미리말을하고소개가될것이다 ) 이것은어떻게보면너무많이언급된문제와방법들로서대부분의책이나매뉴얼에아주자세하게설명되어있다. 그리고그것에대한사항은다른파트에서자세하게다룰것이다. 아무튼이파트는 Microsoft사의 Windows DNA라는하부구조와 Multi-tier 내에서 Enterprise급의어플리케이션을개발할때 C++ Builder로 ADO Programming 방법론을한번고찰해보고그것에초점을맞출것이다. 그리고또한가지중요한부분은 ADO 탭에 Component가존재하지않는 ADODB.Record 와 ADODB.Stream 객체이다. 이두가지객체는 ADO가비관계형이나반구조적데이터에접근, 조작, 관리하기위해버전 2.5부터추가된객체들이다. ADODB.Record 객체는주로파일시스템이나디렉터리구조들에대한접근성을제공하는객체이고 ADODB.Stream 객체는단순한파일 I/O 기능뿐만아니라말그대로데이터를영속화시키는작업들 ( 주로 VCL의 TPersistent나 TStream 객체들과비슷한일을한다 ) 을한다. 이객체들은아주막강해서별도의다른 Component 없이 ADO만으로도 Local 내지는 Remote 컴퓨터상의파일시스템에접근 ( 대체로 URL을통해서 ) 하고그파일시스템을관리 ( 파일시스템의내용을알아내거나파일의복사, 이동, 삭제 ) 할수있게해주며파일을읽고쓰며 ( 파일 I/O 기능 ) 데이터를영속화하거나메모리상에서의직접전송도가능하게하는아주막강한객체이다. 필자가생각하기에이 Component가 ADO Express에추가되지않은것은매우안타까운일이라고생각한다. (ADO Express Component를제작할때이전 ADO버전이반영되지않았나어설프게추측해보며다음버전의 ADO Express 와 C++ Builder 6 에는반드시두객체가추가되기를바란다. 그러나당장아쉬운대로 5에서변통할수있는방법은설명도할것이다. 또한이기능들은전통적인개발툴엔당연히존재하는장점이기도하다.) Database에연결하여데이터를관리조작하는작업들은나머지 Component들의몫이다. TADOConnection 와 TRDSConnection 객체는연결에관계하고 TADOCommand는명령을데이터베이스에전달하며, ADO 객체모델의핵심인제일중요한 TADODataSet은말그대로데이터레코드셋이다. ( 미리얘기한대로앞에서거론한 3개의레코드셋 Component들은자주사용하지않을것임을알려둔다 ) 그러면 ADO를 C++ Builder Database Application 의아키텍쳐모델로사용하게될경우어떤장점을얻게되며또불리한점은무엇이있는지알아보자. ADO 를사용할때장점 (Developer Guide 에서참조 ) 솔직히이 ADO라는데이터베이스접근아키텍쳐는인터넷과어플리케이션서버들, 그리고 COM을사용할때적합하다. 열거해보면, 1. BDE를대체할수있다. 즉어플리케이션작성시, Borland Database Engine을사용할필요가없다는것이다. 특히어플리케이션을배포할때상대적으로무거운부분을차지하는 BDE를추가하지않아도되는사실에공감하는개발자들도많이있으리라본다. 2. 인터넷에적합하고배포가쉽다. 단적으로 Microsoft의웹서버인 IIS 상에서돌아가는스크립트언어인 ASP에서같은회사의 Database(Access, MS-SQL) 를접근, 조작하는데많이사용되고있고설정도스크립트내에서직접사용되거나 include 되는방법으로또는간단한 ODBC DSN Setting으로이루어진다. 그사항은 C++ Builder Database Application들 ( 일반 Win32 Application, ISAPI, ActiveX Server, Asp Object등등 ) 에도같이적용된다. 3. 서류가방모델과 XML을지원한다. 이것들은이후의장에서아주비중있는이슈로서아주자세하고밀도있게구체적인코드와함께설명될것이다. XML의잠재력과가능성에대해서언급하는것은바보스러울정도이다. 이미이기술은거의모든벤더들에의해서채용되고있으며국제적인표준으로서광범위한지원을받고있다. 이후의장에서 ADO 레코드셋을 XML로영속화시키고 XML을레코드셋으로불러들여작업하는방법이나클라이언트에전송하는방법, 서류가방모델의핵심구조인단절된레코드셋에서 XML을사용하는방법이나서버객체내에서사용하는문제등, Multi-tier 환경에서 Enteprise급어플리케이션을작성할때유용한방법들을살펴볼것이다.
4. OLE Database( 예를들면 Access 나 MS-SQL) 에연결, 접근하는경우 BDE 보다나은성능을제공한다. 아마도같은회사에서만든것이니그럴것이라고생각할뿐이다. 흥미있는사람은테스트를해보아도좋을것이다. 적어도 Microsoft는그렇게떠들고있다. ADO 를사용할때단점 (Developer Guide 에서참조 ) 1. 단지 Windows 플랫폼에서만사용가능하다. 당연한얘기이다. 그리고 ADO는지나치게 Microsoft 제품지향적이다. 2. BDE 보다낮은제어성을제공한다. BDE Administrator의각 Database들의 Alias 설정들의세부사항들을한번본다면이말이쉽게이해될것이다. 3. MIDAS와같이작동하지않는다. 대신 ADO 내에는 RDS 기술이라는것이있다. RDS는 MIDAS와비슷한분산환경에서의개발기술로이후의장에서설명하기로한다. 4. OLE Database Provider들이항상신뢰성있고만능은아니라는점이다. 이것은 ADO를개발과정에아키텍쳐로도입하기전에항상그적합성을체크해보아야한다는이야기이다. ORACLE과 SYBASE등다른비 Microsoft 계의 RDBMS와 ADO와의궁합이대표적인사항이될것이다. 이것역시이후의장에서알아보기로하자. 이상 ADO의장점이나단점에대해서몇가지정도를알아보았다. 어느기술이더좋다또는어떤접근방법을채택하는것이더좋다라는사실에관한논의는이장의목적이아니다. 하지만그것은프로젝트나개발에들어가기앞서신중하게고려해야되며실제개발에들어갔을때의추가적인부담에관여한문제이다. 굳이자신의효과적인방법이있는데도불구하고무리하게새로운기술을배우고적용하는문제에욕심을낼필요는없으며또한반대로더나은방법이있는데에도불구하고그것에대해관심을가지지않는것도개발자의올바른태도가아니라고생각한다. 여기서중요한것은단지 ADO라는기술이있으며여러분은 아이런접근방식도있구나 하고한번보는것, 경험을늘려가는것이중요한것이라고생각한다. 최근에현실적으로업계의주도자인 Microsoft는 ADO의.Net 버전인 ADO.Net을소개했다. Microsoft는누군가는세상을이끌어야한다며개발자들을레밍처럼절벽으로막몰고있는데그런점에서본다면이강의는약간우울한결말이기대되는변주곡의시작일수있다. 하지만같이하다보면혹시알겠는가? 절벽에서점프해날아서다른땅에멋지게도달할수있을지! 시작은짧을수록좋다. 왜냐하면일의반을빨리해치울수있기때문이다. 자, 그럼어서빨리우리의레밍에게 Borland의딱지가붙은아주멋진날개달린신발을주도록하자 ~ = ㅅ =;; Mortalpain