개요
COM이 생겨난 배경과 정의에 대해 간단하게 설명합니다.
컴포넌트 프로그래밍
베이직을 아시나요? 마이크로소프트사에서는 GW-Basic, Quick-Basic등 제품명에 Basic을 붙여서 텍스트 기반 운영체제인 DOS(Disk-Operating System) 환경에서 사용되어 오다가 운영체제가 윈도우 환경으로 옮겨오면서 윈도우 버전인 Visual Basic 1.0을 1991년에 발표하였습니다. 상업용전의 베이직(BASIC:Beginner's All-purpose Symbolic Instruction Code)은 1964년 미국 다트머스 대학에서 전산학을 전공하지 않은 비전공 학생들의 프로그래밍 교육을 목적으로 제작한 대화형 언어였습니다. MS의 Visual Basic역시 초보자들이 쉽게 프로그래밍을 할 수 있도록 한다는 취지는 그대로 였습니다. 이러한 Visual Basic에서는 VBX라는 것을 사용할 수 있었는데요. 예를 들면 옵션그릭스 계산기를 VBX로 만들었다면 초보자는 이 VBX를 추가하는 작업만으로 자신의 프로그램안에서 옵션그릭스 계산기를 활용할 수 있었지요. 굳이 자신도 옵션그릭스 계산기를 만들 필요가 없습니다. MS나 또는 다른 써드파티 개발회사에서 VBX를 개발해주면 사용하기만 하면 되었죠. 이런 VBX가 OCX(OLE Cntrolextensions)라는 것으로 대체되었습니다. 왜 변해갔을 까요? VBX처럼 컴포넌트화 시켜서 이를 Visual Basic에서만이 아니라 다른 언어, 또는 엑셀이나 워드에서도 재활용성을 극대화하기 위해서입니다. 또한 기술적으로는 16bit 기준에서 32bit기준으로 작성된다는 것이죠. Windows3.X에서 Windows95로 윈도우즈 플랫폼의 커다란 변화와 맞물린 겁니다.

① OCX는 무엇일까요?
이야기 되었듯이 OCX는 기존의 16비트의 VBX 대신 32비트로 구성됩니다. 이 새로운 컨트롤 표준 방식은 기존에는 비주얼 베이직 프로그램에만 국한되어 있던 것을 윈도우 시스템 리소스로 서로 공유할 수 있도록 OLE 기능이 추가된 방식이라고 이해하시면 됩니다. 이처럼 OCX가 윈도우 시스템 리소스의 공유를 기반으로 서로의 공유가 가능함으로 비주얼 베이직에서 만든 컨트롤을 다른 프로그램에서도 동일하게 사용할 수 있게 되었습니다. 자기가 필요한 부분의 컨트롤을 직접 제작하고, 다른 프로그램에서 이 컨트롤을 사용하는 것입니다. 이는 또한 윈도우뿐만이 아니라 인터넷이라는 거대한 망을 통해서도 공통으로 사용할 수 있는 길을 만들어 주는 방식이 되었습니다. 이것이 OCX가 만들어지게 된 가장 중요한 이유라고 할 수 있습니다.

② ActiveX란 무엇일까요?
ActiveX는 단지 OCX의 이름을 변경한 것에 불과합니다. 마이크로소프트에서 공식 발표한 ActiveX라는 것은 기존의 OCX와 별반 차이를 가지고 있지 않습니다. 다만 인터넷의 표준안에 해당하는 개념적인 의미에서 개명하면서 마이크로소프트의 목표를 알리기 위한 방법인거죠.

③ OLE(Object Linking Embedding)란?
OLE(Object Linking Embedding) : 대상이 되는 파일이나 프로그램을 연결하여 끼워 넣는 방법을 가리킵니다. 워드 프로그램에서 다른 프로그램에 있는 도표나 그림들을 개체 삽입을 통해서 끼워 넣는 방식이 OLE의 한 대표적인 예입니다. 윈도우 3.1로부터 표준 기능으로 제공되었습니다. OLE에는 크게 링크와 임베딩의 기술이 있는데 이 중 링크는 원정보가 변경되면 그것을 사용한 문서에도 변경이 반영되는 것을 말하며, 임베드는 문서를 편집하는 경우 자동으로 데이터를 작성하는 프로그램이 실행되는 것을 말합니다.

[그림 1-1] MS 워드에서의 개체 삽입

[그림 1-2] MS 워드에서 엑셀챠트삽입

OLE는 객체(Object)또는 어플리케에션이라고도 할 수 있는데 이 객체간의 데이타 교환문제를 해결하기 위한 노력의 결과물입니다. 기본적으로 어플리케이션과 어플리케이션은 각자가 독립적인 공간에서 독립적으로 실행되도록 되어 있습니다. 이러한 어플리케이션들간에 Ctrl+C와 Ctrl+V로 문자열을 서로 주고 받는 기술은 마법에 해당되는 일입니다. 어쨌거나 이처럼 어플리케이션간의 데이터 교환문제를 해결하기 위하여 Clipboard와 DDE(Dynamic Data exchange)를 이용하였는데 Clipboard는 사용하기가 간편해서 널리 사용되고 있지만, DDE기술은 OLE기술의 등장과 함께 점차 자취를 감추게 되었습니다. 1990년대 후반에 나온 OLE기술은 응용프로그램간의 Object를 삽입하는 기술로서 현재까지도 광범위하게 사용되고 있으며 OLE를 흡수하여 만들어진 것이 COM입니다. COM기술이 눈에 보이지 않는 아키텍쳐적인 성격이 강하다면, ActiveX기술은 COM기술을 비주얼한 환경으로 구체화시킨 것이라고 말할 수 있습니다.

④ 컴포넌트 프로그래밍
컴포넌트의 사전적인 의미는 '구성요소'를 이야기합니다. 그러면 컴포넌트 프로그래밍이란 무엇일까요? 예를 들어 자동차는 여러 가지 부품들이 모여서 하나의 자동차가 완성되듯이 프로그램의 여러 가지 부품의 역할을 하는 컴포넌트를 이용하여 하나의 프로그램을 제작하는 방법을 가리키는 것입니다. 현재와 같은 기능이 상당히 많은 프로그램을 제작할 경우 기간과 비용의 여러 가지 문제가 산재해 있기 때문에 프로그래머가 처음부터 모든 것을 제작할 수 없으므로 이런 문제들을 해결하는 방법이 바로 컴포넌트를 이용하는 프로그래밍인 것입니다. 조각조각 부품처럼 컴포넌트화하여 서로 합체하면 되니깐요. 그러기에 컴포넌트는 서로간의 상호 교류가 가능한 장점을 지니고 있습니다. 각각 다른 컴포넌트간의 교류와 하나의 컴포넌트 안에 다른 컴포넌트를 포함할 수도 있으며 외부에 있는 다른 컴포넌트와의 교류가 가능합니다. 그리고 기능이 변경될 경우에는 사용된 컴포넌트만 변경하면 구축되어져 있는 프로그램에 그 결과가 반영되는 여러 가지 장점을 가진 것이 컴포넌트를 이용한 프로그래밍의 장점인 것입니다. 컴포넌트는 단순히 재사용할 수있게 했다고 해서 컴포넌트화했다고 할 수는 없습니다. 예를 들면 DLL에 오픈되어 있는 API를 사용하면 DLL을 로드만 하면 DLL에 들어있는 기능을 재이용할 수 있지만 단순하게 이렇게 API를 공유하는 방법은 컴포넌트라고 보기는 힘듭니다. 그 이유는 재이용 가능성이 떨어지기 때문입니다.부품화가 진행되려면 먼저 부품을 만든 이와 부품을 사용하는 이를 포함한 시장에서의 규격화가 진행되어야 합니다. 만약 그렇지않고 DLL로 코드만 분리되는 정도라면 서브루틴을 다른파일로 저장했다는 것과 별반 다를 것이 없습니다. 컴포넌트가 되기위해서는 컴포넌트 사용자와 컨센서스가 이루어져야 합니다. 그러므로 컴포넌트라고 불리기 위해서는 MS사가 제안하는 규격에 맞게 DLL을 제작하거나 혹은 그러한 DLL을 사용하여야합니다. 그 규격은 VBX, OCX, ActiveX컴포넌트등으로 기술적 발전을 거듭하여 현재는 COM으로 통일되었습니다. 이렇듯 오피스 프로그램끼리의 문서를 결합하기 위한 기술에서 시작하여 지금의 컴포넌트는 네트워크, 언어, 하드웨어상관없이 조립가능한 부품으로 거듭나고 있습니다. 컴포넌트의 조건 CBD의 개념은 오브젝트 지향 프로그래밍, 즉, OOP에서 왔습니다. 모듈설계, 캡슐화, 사양과 구현의 분리등의 OOP의 기본개념은 CBD에 그대로 계승되었습니다. 따라서 이 두 개념은 혼돈하기 쉽습니다만 컴포넌트는 오브젝트보다도 더 독립적이고 교환가능한 부품을 말합니다. 컴포넌트 프로그래밍에 대한 개념적인 이해를 돕기 위해서 OOP(Object Oriented Programming)에 대한 개념을 참고하세요.

COM
① COM의 탄생
기본적으로는 멀티태스킹과 프로세스간의 통신을 위해 제안된 것들이 바로 DLL, RPC, DDE와같은 개념입니다.

DLL(dynamic Link Library) 동적라이브러리를 이용한 프로세스간의 공유를 구현하는 방법으로 UNIX에서 사용하는 공유라이브러리와 공유메모리와 같은 기능을 수행합니다, 현재의 윈도우를 구성하는 파일들의 상당부분을 차지하고 있으며 사용자가 직접 제작하여 사용할 수도 있습니다.
RPC(Remote Process Communication) 프로세스간의 원격호출을 구현하는 방법으로 다른 운영체제에서도 사용되고 있습니다, 요즘 분산환경기술의 발전과 더불어 개념적인 향상을 이루고 있습니다.
DDE(Dynamic Data Exchange) 프로세스간의 데이타를 동적처리를 구현하는 방법으로 기존의 제작되어 있는 프로그램의 프로세스와 새로운 응용프로그램간의 데이타 교환에 주로 사용되었습니다.

COM에 대해서 이야기 하자면 먼저 DDE와 OLE를 말하지 않을 수 없습니다. DDE는 클립보드를 사용하는 것처럼, Windows에서 일부 데이터를 직접 교환할 수 있도록 하는 것으로 DDE 프로그래밍을 해본 경험이 있는 사람들은 알 수 있지만 윈도우에서 제공하고 있는 DDE를 통해 데이터의 교환을 수행하면 속도와 데이터의 손실의 문제가 발생합니다. 이에 OLE로 발전되는데 이는 OLE 서버 프로그램의 데이터를 OLE 클라이언트 프로그램으로 복사할 수 있는 것입니다. 간단하게 설명하자면 OLE 컨트롤을 저장할때 서버 애플리케이션측에 링크모드데이타가 저장되고 데이터의 링크 정보만이 삽입될 곳의 파일에 보관됩니다. 임베드 모드 데이터는 OLE 컨테이너 컨트롤측에서 관리되는데 작성된 모든 데이터는 삽입될 파일에 보관됩니다. 서버 애플리케이션에 있는 데이터는 여러 애플리케이션에서 참조할 수 있지만 컨테이너 컨트롤측의 데이타는 다른 애플리케이션에서 참조할 수 없습니다. MS사는 Windows3.1 OLE를 OLE2로 업데이트하면서 OLE Automation과 OLE Controls의 기능을 추가했으며, Windows95의 Shell 프로그램인 탐색기(Explorer.exe)는 OLE2 기술을 기반으로 해서 구현했습니다. 그리고 OLE Controls는 인터넷 확장 가능하도록하면서 ActiveX Controls로 변경합니다. 최근에 OLE기술은 MS사의 DNA프로젝트와 함께 COM으로 명명되면서 sinks, in-place activation, structured storage등이 추가되며, Windows2000에 가서는 COM의 서비스와 기능을 확장한 COM+로 진화하게 됩니다.

② COM의 구조
COM의 일반적인 구조는 Win32 DLL 형식과 EXE 형식으로 구성됩니다. DLL과 EXE로 구성되기 때문에 특정언어에 국한되는 것이 아닌 언어 독립적이며, 바이너리 형태로 여러 가지 프로그램과 프로그래밍 툴에서 사용할 수 있다. COM의 실제 사용에서는 COM에 포함되어 있는 클래스 메서드를 실행시키기 위한 인터페이스의 사용이 가장 중요한 부분이 됩니다. 이런 COM은 윈도우 레지스트리에서 서버로 등록되어 외부 프로그램에서 클라이언트로 COM을 불러들여 사용할 수 있는 서버의 기능을 수행하는 것입니다.

③ COM 인터페이스
컴포넌트는 여러 객체로 구성이 됩니다. 이 컴포넌트를 사용하기 위해서는 속해있는 객체가 어떤 데이타를 가지고 있고 어떤 함수가 있는지를 알아야 합니다. COM에 속해있는 객체마다 프로퍼티와 메쏘드를 알리기 위한 방법으로 사용자에게 인터페이스(Interface)를 제공합니다. 사용자는 사용자의 프로그램에 COM에서 제공되는 인터페이스를 Import하고 인터페이스를 통하여 COM 내부의 객체를 사용합니다. COM의 개체간 통신에는 기본적으로 두 가지의 인터페이스인 IUnknown과 IDispatch가 사용됩니다.

IUnknown 모든 COM개체는 IUnknown 인터페이스를 반드시 구현해야 합니다. IUnknown 인터페이스는 세 가지 기본적인 메서드인 QueryInterface, AddRef, Release를 정의하는데 AddRef와 Release 메서드는 개체의 생성, 소멸을 관리하며 COM 개체 자신의 참조회수를 증가시키거나 감소시키는 기능을 가지고 있습니다. 참조 회수가 0으로 되면 그 개체는 소멸하게 되는 것입니다. QueryInterface는 특정 인터페이스에 관하여 그 개체에 질의를 던지는 역할을 하고 있습니다. 사용하고자 하는 컴포넌트의 인터페이스의 정보를 알아낼 수 있는데 이 메서드는 질의된 인터페이스에 대한 식별자를 인자로 받아서 그 인터페이스에 대한 간접포인터를 리턴 값으로 돌려주게 됩니다. 만약 요청된 인터페이스가 그 개체가 제공하지 않는 것이라면 에러가 발생합니다.
IDispatch IDispatch 인터페이스는 자동화(Automation)을 지원하기 위해 IUnknown 인터페이스로부터 파생된 인터페이스입니다. 메서드나 속성에 해당하는 디스패치 식별자를 알아내어 자동화 컴포넌트에서 제공하는 속성이나 메서드에 접근하는 등의 작업을 할 수 있습니다. 초기의 바인딩을 사용하여 개체에 접근하고자 할 때에는 IUnknown 인터페이스가 사용되며, 후기의 바인딩을 사용하여 개체에 접근하고자 할 때에는 IDispatch 인터페이스가 사용됩니다.


④ Automation
Automation은 사용자들이 기존의 프로그램의 내용과 기능의 장점을 이용할 수 있게 하는 기술로써 인터페이스에 기반을 둔 표준 소프트웨어 아키텍처인 COM(Component Object Model)에 기반을 두고 있습니다. 그리고 Automation은 서버와 클라이언트로 구성되는데 Automation 클라이언트를 흔히 Automation 컨트롤러라고도 합니다. Automation 서버는 서비스를 제공하고 Automation 컨트롤러는 서버에 연결하여 서버의 기능을 사용하게 됩니다. 고수Plus는 서비스를 제공하는 Automation 서버가 되고 여러분이 작성하시게 될 GOM 클라이언트는 Automation 컨트롤러가 됩니다.

Automation에서 객체들의 속성과 메소드를 사용하는 방법에는 두가지 방법이 있습니다. 하나는 dispatch 인터페이스를 이용하는 것이고 하나는 vtable을 이용하는 것입니다. 이 둘은 바인딩(binding)의 차이인데요. 바인딩은 사전적인 의미로 "동여매는 묶는"의 의미로 컴포넌트를 언제 동여묶어서 그들을 사용할 수 있는가 입니다. dispatch 인터페이스를 사용하는 후기바인딩(late binding)과 vtable을 이용하는 초기바인딩(Early Binding)이라고 합니다.

초기바인딩(Early Binding) vTable바인딩, 반드시 타입라이브러리 제공

dim obj As AddBack
Set obj = New AddBack
obj.someMethod

인터페이스 주소는 인터페이스가 지원하는 함수들에 대한 주소값 테이블을 가리킵니다. 이 테이블을 vtable이라고 합니다. COM 객체는 클라이언트에 객체의 vtable를 제공함으로써 객체에 대한 직접적인 접근을 제공 합니다. 쉽게 말하자면 클라이언트를 작성하는 단계에서 컴포넌트 정보를 내포(import)하여 클라이언트 내부객체처럼 사용하는 방식을 Early Binding 이라 합니다.
후기바인딩(Late Binding) IDispatch 인터페이스 지원

dim obj As Object
Set obj = CreateObject("AddBack.AddBack.1") :
obj.someMethod

dispatch interface (dispinterface)는 구성 메소드와 속성은 DispID 라고 부르는 고유한 ID로 식별 됩니다. 사용자는 IDispatch 인터페이스의 GetIDOfNames를 통해 메소드나 속성의 DispID를 구하고 이를 이용 Invoke를 호출하여 메소드나 속성을 호출합니다. 이 방식을 Late Binding 이라 합니다. Late Binding 방식은 실행시 타입을 결정할 수 있는 장점이 있으나 속도가 늦어지는 결점이 있고 vtable은 속도가 빠르고 컴파일 시 문법 체크가 가능하나 실행시 타입을 결정할 수 없는 단점이 있습니다. 그래서 Microsoft 에서는 이 두 가지 방식인 Early Binding, LateBinding 모두를 지원하도록 하는 것을 권하고 있습니다. 이러한 방식을 dual interface라 합니다. 모든 고수Plus의 GOM 객체들은 이 dual interface를 지원하고 있으므로 사용자는 사용언어가 지원한다면 Early Binding, Late Binding 방식 모두 사용할 수 있습니다.


⑤ 타입 라이브러리(Type Libraries)
타입 라이브러리는 COM 객체의 기능에 관한 정보를 제공하는 파일 입니다. 자세하게 말하면 객체를 구성하는 클래스들의 정보를 포함한 파일입니다. 타입 라이브러리는 실제 객체들을 저장하는 것이 아니고 객체들의 정보만을 저장합니다. GOM 에서도 p2.tlb라는 타입 라이브러리를 제공하며 이 파일은 자료실에서 다운 받으실 수 있습니다. 타입 라이브러리를 보는 방법은 각 개발툴에서 제공하고 있습니다. VB에서는 Object Browser, VC에서는 OLE/COM Object Viewer, Delphi는 Delphi IDE 자체에서 TLB 파일을 보실 수 있습니다.

[그림 2-1] Delphi에서 보는 타입라이브러리

지금까지 COM에 대한 간략한 소개로 이야기처럼 읽어보시면 됩니다. 초보자에게는 생소한 컴퓨터용어이고 어려운 개념임에는 틀림없습니다만 충분히 습득하셔서 자신의 노하우를 담은 전략을 만드시길 바랍니다. 다음은 GOM에 대한 이야기입니다.