CORBA 의개념과활용 (II) OMG(Object Management Group) 라는비영리단체는 1989 년 4 월에설립되었다. 이단체는현재존재하는객체지향기술을밑바탕으로하여프로그램들을결합하기위한산업표준안을제정하기위해 600 개이상의컴퓨터단련단체및기업의연합체로구성되어있다. 여기에서객체지향기술을기반으로이기종의분산환경을지원하기위한표준기술을제정하였는데이표준이 OMA(Object Management Architecture) 이다. 이기능중에서 CORBA 는컴퓨터 H/W 의내부버스처럼프로그램사이에서도서로의위치에관계없이서로를사용할수있는기능을제공한다. 그러므로, CORBA 는 OMA 중에서도가장중요한요소이다. 이번장에서는 CORBA 에대해더깊이알아볼것이다. OMA 와 ORB (Object Request Broker) CORBA 에서는 ORB 가가장중요하다. 바로이 ORB 때문에만들어진 CORBA 간의호환성문제가있다. 델파이 4 에서는비지제닉에서제작한비지브로커 (Visibroker) 를 ORB 로사용한다. 대표적인 ORB 로는비지제닉의비지브로커이외에도아이오나의오빅스가있다. 그밖에도 CORBAPLUS, FNORB, OMNI-ORB2, JTRADER, MICO, JOE, JYLU, JACORB, ELECTRA, ILU, OAK, DOME, CHORUS/COOL ORB 등의여러회사에서도 ORB 를제작하고있다. OMA 는객체를작성하는구조인데, 이 OMA 에는분산환경에서통신을담당하는 CORBA 와객체를조작하는기본기능을정의한 COSS(Common Object Service Specification), 그리고기타기본기능과개발자가작성한각종응용객체들로구성된다. 이중에서 CORBA 서비스는객체들이연결하기위한기본기능을제공하는데이기능에는객체의생명주기서비스 (Object Lifecycle Service), 명명서비스 (Naming Service), 디렉토리서비스 (Directory Service) 등이있고, 객체지향의접근방법인온라인트랜잭션처리 (On-line Transaction Processing) 과트레이더서비스 (Trader Service) 등을포함하고있다. 이러한 CORBA 서비스는객체의통신과연결에필요한서비스를제공하고, CORBA Facilities 는필요한서비스를제공한다. 대표적인복합문서관리 (Compound Document Management) CORBA Facility 는복합문서의컴포넌트를접근할때표준화된방법을지원한다. 이러한 CORBA Facilties 는크게두가지로구분될수있는데, 하나는 Horizintal Facilties 로복합문서서비스가이에준하는것으로전반적인영역에서사용할수있는서비스이고, 또다른하나는 Vertical Facilties 로특정한곳에만사용하는서비스를말한다. 다음의그림은 OMA 의구조를나타내고있다.
OMG 는 1990 년 OMA 를발표한이래, 1997 년에 CORBA 스펙 2.1 을발표했으며현재 CORBA 3 규격까지나와있다. CORBA 의동작원리 이번에는 CORBA 의동작원리에대해서자세히살펴보자. 먼저 CORBA 의구조는전체적 으로다음그림과같이표현할수있다.
해당그림을살펴보면서 CORBA 로구현된시스템의호출순서에대해알아보자. 클라이언트프로그램은 OMG IDL 로정의된객체들의동작들에대한요청을 ORB 를통하여호출한다. 이때호출하는형태는 Stub-style invocation( 스텁호출 ), Dynamic invocation( 동적호출 ) 이있는데, 2 가지방식을혼용할수도있다. 1. 스텁호출 (Stub style) 클라이언트프로그램이미리만들어진인터페이스를통해정의된오퍼레이션에대하여링크 하는방법이다. 2. 동적호출 (Dynamic style) 클라이언트프로그램이인터페이스저장소를통하여동작하도록실행시간에만들어질것을요구한다. 클라이언트와서버는 ORB(Object Request Broker) 를사용하여통신하므로서로간의정보는필요가없게된다. 클라이언트는 ORB 에서필요한요청을하고 ORB 는필요한요청을서버의구현에서선택해서해당되는메소드를구현부에보낸다.
컨텍스트객체 (Context Object) 는해당행위로전달되지않는정보나서버에대한선택, 환경등의정보를가지고있다. 보통클라이언트어플리케이션에서서버를호출할경우에컨텍스트객체를참조하게된다. 인터페이스저장소는네트워크상에있는프로그램들과데이터객체에대한인터페이스를모두가지고있다. 이인터페이스저장소는동적호출시에필요한정보를제공한다. CORBA 의서버프로그램구조 그구조는클라이언트객체에서요구를할경우, 이요구를받아들여동작하기위한구현부 (Implementation) 를하나이상가지고있다. 이러한요구를클라이언트는 ORB 를통해서하게되므로, ORB 는 BOA(Basic Object Adapter) 를사용하여필요한구현내용을선택하고해당구현내용을요구한다. 이때 BOA 는해당구현부내부의메소드들을호출하기위해서버스켈레톤 (Server Skeleton) 을사용한다. 객체어댑터 (Object Adapter) 는서버의객체를관리하는중요한도구인데, 이역할은구현부를 ORB 에서호출할수있도록만들어주는것이다. 일반적으로이러한객체어댑터를 BOA 라고부른다. 그러므로, 모든 CORBA 제작사는그들의시스템일부분에서 BOA 를지원해야한다. 그러므로, 서버는이러한 BOA 와객체의작업에대한메소드들과의연결을제공하며각각의연결에필요한정보를가지고있는것이다. 이상의설명을다음그림과같이표현할수있다. IDL 에대하여 IDL 은 Interface Definition Language 의약자인데, 말그대로객체의인터페이스를정의하는언어라는뜻이다. 쉽게이야기해서델파이에서만들어진클래스를 CORBA 에서호출할수있도록중간에서연계해주는언어이다. 델파이에서는타입라이브러리에디터를이용해서이러한 IDL 을간단하게만들수있다.
다만, 다른언어에서사용한다면이러한 IDL 의코딩방법쯤에대해서는알고있어야한다. IDL 문법 IDL 의문법은 C++, 자바와유사하다. 직접에디터를사용해서만들수있으며, 이렇게직접제작한텍스트파일을이용하여스텁과스켈레톤을생성하려면델파이 4 의 BIN 디렉토리의 TLIBIMP.EXE 파일을이용하여 IDL 코드를컴파일할수있다. 1. 주석 (Comment) 기본주석은 //, /*.. */ 로한줄주석과여러줄주석을사용할수있다. 2. 예약어 보통은알고있는일반적인 C, 자바등의예약어와동일하지만약간다른부분만설명하도 록하겠다. any 예약어 내용 C 나 C++ 의 void* 나오브젝트파스칼에서의 Variant 데이터형처럼데이터타입만받 아들이는것이아니라객체를포함한모든타입의변환이가능한데이터형을말한다. in 클라이언트에서구현부로만전달되는매개변수를지칭한다. out 구현부에서클라이언트로만전달되는매개변수를지칭한다. inout 양방향전달이가능한매개변수를지칭한다. oneway 보통메소드가동기적으로수행되는반면에비동기적으로수행할수있는메소드를지 칭하는것으로결과를기다리지않고나중에처리할수있는메소드이다. 데이터형 (data type) IDL 에서만들어내는인터페이스에서해당작업의매개변수나반환되는값의데이터형태 를지정하는데사용한다. - 기본데이터타입 (char, short, long, float) - 구조체타입 (struct, union, enumeration) - 템플릿타입 (sequence, array, string) 물론앞에서설명한 any 데이터형도가능한데, 이를사용하면수행속도가느려지는것은
두말할나위도없다. 1. 구조체데이터형 (Constructed Types) 구조체데이터형에는 3 가지가있다. struct, union, enumeration 의 3 가지가있다. - structure 일반적인구조체와동일하다. struct 구조체명 { 데이터타입변수명 ; 데이터타입변수명 ; } - union 일반적인공용체와동일하다. 서로다른데이터형과크기를공유하기위한방법이있을 경우에사용한다. C(++) 와다르게각데이터멤버는 case 라벨과함께선언한다. union token switch (long) { case1: char 변수명 ; case2: float 변수명 ; default: long 변수명 ; }; - enumeration 데이터멤버를순서적으로나열할경우에사용한다. enum workday {Monday, Tuesday, Wednesday, Thursday, Friday}; 2. 템플릿데이터형 (Template types) enumeration 과 string 두종류의템플릿타입을제공한다.
- enumeration 일차원배열을선언하는데이터형이며최대크기가지정되어있으면바운드 (bounded) 시퀀스라하고, 최대크기가없으면언바운드 (unbounded) 시퀀스라고한다. 해당길이는동적으로변경되며선언할수있는데이터형은 IDL 의모든데이터형이가능하다. - string 시퀀스와동일한방법으로사용하는데, 시퀀스와다른점은문자형만을사용할수있다는 점이다. 3. 배열 (array) 다차원배열을선언하는경우에사용한다. 4. 상수형 (constant type) 일반적으로사용되는상수와동일하다. 사용할수있는데이터형으로는 boolean, short, char, string, double, float, long, unsigned long, unsigned short 등이있다. 5. 인터페이스 (interface) 클라이언트에서서버객체에서비스를요청할때에처리해주는속성과작업을정의한세트 를말한다. 작업 (operation) 인터페이스의몸체에선언되는것으로구성은작업매개변수, 예외처리 (exception), 반환 값의형태, 매개변수전달방향등으로구성된다. 1. 예외처리 서비스요청시에예외상황이발생할경우클라이언트에전달하는자료구조로보통은시스템이미리정한예외처리와개발자가설정한예외처리의두가지종류가있다. 주의할점은이예외처리에는사용자가정한작업의매개변수나데이터형이될수없다. 그리고예외처리를위한 raises 라는키워드가있다.
2. 컨텍스트 구현객체의 (implemantation object) 의작업에영향을줄수있는클라이언트의환경요소와관련된리스트를컨텍스트라한다. 이컨텍스트를사용하기위해서는 raises 문장바로뒤에 context(context1, context2,...) 형태로선언하여주기만하면된다. 그러나이문법은가능한사용하지않는것이좋다. 3. Oneway 작업 (operation) Oneway 란작업을호출하고결과를기다리지않는것을선언하는것으로, 클라이언트에서 호출만하고결과에대해서는책임지지않는호출방법을의미한다. 다만, 이 Oneway 작업 은다른작업보다다먼저선언되어야하는점만주의하자. 4. 속성 (Attribute) 속성은클라이언트가어떤변수에값을설정하거나검색할때에쉽게 IDL 로표현하기위해서만들어진형식이다. 속성은 readonly 를사용할수있고, 해당값을설정하고읽어오는두가지형태의일만수행한다. 간단히보면변수선언하는것과비슷하나실제로는일종의작업 (operation) 이다. 상속 (Inheritance) 일반적인객체지향언어 (?) 라면상속이지원되는것이당연할것이고, 이상속개념을사용 하면한번만들어진 IDL 을사용하여새로운파생인터페이스를만들어낼수있다. 이때파생되는인터페이스는간접 (indirect) 과직접 (direct) 기반인터페이스로구분된다. 1. 간접기반인터페이스 만들어진파생인터페이스의기반인터페이스가다른기반인터페이스에서파생된인터페이 스일경우를말한다. 2. 직접기반인터페이스 만들어진파생인터페이스의기반인터페이스가기본적으로만들어진인터페이스일경우를 말한다.
파생인터페이스를만들경우에동일한작업이나속성이름을가지고있는기반인터페이스 로부터상속받을수없고, 또한상속받은작업이나속성의이름을재정의할수없다. 이 점이일반적인상속과다른점이다. 모듈 (Module) 오브젝트파스칼의의유닛개념과동일한것으로, namespace 를제공하기위해 IDL 의범위를설정하는것이다. 이때외부의식별자를사용하기위해서는 '::'(name resolution operator) 앞에모듈이름을붙여사용한다. 비지브로커 (Visibroker) 델파이 4 에서지원되는 CORBA 의 ORB 는비지제닉사의비지브로커이다. 현재개발된 CORBA 의 ORB 중다양한지원과강력한성능을기대할수있는 ORB 이다. 현재지원되는언어는자바와 C++, 그리고델파이이다. 그리고자바표준의 JDBC 와연결하기위한 Visichannel for JDBC 도지원한다. 그리고여러가지서버도지원하는데 VisiBroker Event Service, VisiBroker Naming Service, VisiBroker Productivity Tools 등의다양한서비스도지원하며새롭게 VisiBroker ITS ( 트랜잭션서비스 ) 도지원한다. 넷스케이프사에서는인터넷에서의강력한 C/S 기반어플리케이션을위해 CORBA 자바기술이용에관한인증체결에대한기술을지원한다. 그리고, 오라클사에서는비지제닉의 CORBA 관련분산객체기술인증을체결하여, 이기술과함께객체, 자바기술, 인트라넷에적용하여어플리케이션을개발하고있으며, 노벨사에서는인트라넷웨어서버플랫폼에서비지브로커사용에관한인증을체결하였다. CORBA, IIOP 관련개발자지원과인트라넷웨어에서분산어플리케이션배치를가능하게하고있다. 사이베이스에서는비지제닉사의비지브로커와관련기술에관한인증을체결하여, 사이베이스의새로운트랜잭션서버에서자바, C++ 관련비지브로커제품군을지원한다. 델파이를설치하면다음의 4 가지유틸리티가설치된다. 프로그램명내용 Object Activation Daemon 클라이언트에서서버를호출할경우자동으로동작시켜주는프로그램 Visibroker Reg-Edit tool ORB 의설정및자바머신의환경등을등록한다. Visibroker SmartAgent 실제 ORB 를구성하는메인모듈, 이모듈이동작해야 CORBA 의 ORB 가동작한다. Visibroker SmartFinder 연결된 HOST 및네트워크에존재하는 CORBA 모듈을검색한다.
이중에서가장중요한 Smart Agents 는분산환경을지원하기위한 ORB 의기본적인구성을지원한다. 실제구동은 point-to-point 의 UDP 프로토콜을사용하므로일반적인 TCP/IP 환경이지원되는곳에서사용한다. CORBA 서버의제작과구동 ORB 에서클라이언트가서버를호출할경우에서버가자동으로동작하게하는유틸리티는비지브로커에서 OAD 를사용하여구동한다. 이 OAD 는네트워크의한서버에서만동작하고있으면자동적으로동작한다. 델파이에서 CORBA 서버를만드는방법은 CORBA 데이터모듈위저드를이용하거나, CORBA 객체위저드를사용하여만드는 2 가지방법이있다. File New 메뉴의 Multitier 탭에서 CORBA DataModule 을더블클릭하면다음의화면이나타난다. 여기서 Class Name 에데이터모듈의이름을입력한다음 OK 를선택하면기본적인 CORBA 데이터모듈을만들수있다. 여기서는 Test 로이름을입력하도록하자. 그리고, 만들어진데이터모듈의유닛을각각 U_ExamSvr1.pas, ExamSvr1_TLB.pas, U_ExamSvrImpl1.pas 로저장하고, 프로젝트파일을 ExamSvr1.dpr 로저장하도록하자. 이중에서 U_ExamSvr1 은일반적인어플리케이션을수행하기위한빈유닛이다. 이것은별다른점이없다. ExamSvr1_TLB.pas 유닛은 CORBA IDL 에해당되는파스칼소스코드이다. 실제코드를자동으로생성시켜주므로개발자는타입라이브러리에디터에서필요한메소드나모듈, 속성등을만들면자동적으로 IDL 로전환되며, 스텁과스켈레톤을지원하기위한코드를생성한다. U_ExamSvrImpl1 는타입라이브러리소스코드에해당되는클래스를구현하는유닛이다. 아마도다음과같은유닛이생성되었을것이다. unit U_ExamSvrImpl1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComObj, VCLCom, StdVcl, BdeProv, DataBkr, CorbaRdm, CorbaObj, ExamSvr1_TLB; type TTest = class(tcorbadatamodule, ITest) private { Private declarations } public { Public declarations } end; var Test: TTest; implementation {$R *.DFM} uses CorbInit, CorbaVcl; initialization TCorbaVclComponentFactory.Create('TestFactory', 'Test', 'IDL:ExamSvr1/TestFactory:1.0', ITest, TTest, imultiinstance, tmsinglethread); end. 만들어진 TTest 클래스는 TCorbaDataModule 를상속받아개발자가선언한 ITest 인터페이스를구현한 CORBA 데이터모듈이다. 이렇게만들어진인터페이스는인터페이스저장소에등록되며보통은해당서버어플리케이션을한번실행하면해당내용이자동으로등록된다. 이때만들어진 CORBA 서버가클라이언트에서호출할때에자동으로동작하게하려면 OAD 를사용하여등록하여야한다.
1. OAD 를사용하여등록하기 irep IRname 을 DOS 커맨드에서실행해보자. 이프로그램은인터페이스저장소역할을한다. 이곳에서 IDL 을로드하여필요한인터페이스를인터페이스저장소에저장할수있다. 지원되는것은일반 IDL 과자바, C++ 을지원한다. 단순히커맨드모드에서사용하려면 irep console IRname [file.idl] 을사용하여도무방하다. 델파이 4 의 Demo 중에 CORBA 서브디렉토리의 DataModule 서브디레토리에있는프로젝트를읽은다음 CORBAServer_TLB.pas 를 CORBAServer.idl 로출력하고, 해당 IDL 을등록해보자. irep IRname CORBAServer.idl 이라고 DOS 명령을사용하면인터페이스저장소에인터페이스가등록된다. 이렇게만들어진 IDL 을다시배치하려면 idl2ir 유틸리티를사용하게된다. 사용법은다음과같다. idl2ir ir IRname replace file.idl 그러므로 idl2ir ir IRname CORBARServer.idl 을수행하면다음의화면과같이인터페이스 저장소에등록될것이다. 이제 OAD 를살펴보자. OAD [ 옵션 ] 의형태로수행하는데, 대표적인옵션으로 C 옵션을 사용하면 NT 서비스로등록하여사용할수있다. 다음은 OAD 에서사용가능한옵션이다. 파라미터 내 용 -v verbose 모드로동작한다. -f 다른호스트로 OAD 가있는지확인하여동작한다. -t<n> 해당 n 초만큼지연된다음에수행한다. -C NT 서비스로구동된다. -k 연결된프로세스들의객체를해제한다. -? 도움말을살펴본다.
그러면, OAD 에해당서버인터페이스를등록하는방법에대해서알아보자. oadutil 이라 는프로그램을사용하는데다음과같은형태로실행하면된다. oadutil reg r IDL: 내서버 / 내객체 :1.0 o 내객체 cpp 내서버.exe p unshared 입력하는내용은 CORBAServer_TLB.Pas 의 initialization 부분을참고하면된다. 앞서등 록한 CORBA 서브디렉토리의 DataModule 서브디렉토리에있는 CORBAServer 프로젝트 의 initialization 섹션은다음과같다. initialization TCorbaVclComponentFactory.Create('DemoCORBAFactory', 'DemoCORBA', 'IDL:CORBAServer/DemoCORBAFactory:1.0', IDemoCORBA, TDemoCORBA, imultiinstance, tmsinglethread); 일단컴파일을하고만들어진 CORBAServer.exe 파일을적당한디렉토리로이동한뒤에, 다음과같이등록하도록하자. oadutil reg r IDL:CORBAServer/DemoCORBAFactory:1.0 o DemoCORBAFactory cpp 파일의위치 디렉토리 \CORBAServer.exe p unshared 제대로등록되었으면다음화면과같은내용이나타날것이다. 주의할점은이와같은등록을할때비지브로커스마트에이전트와 OAD 가동작하는상태에서등록하여주어야한다. CORBA 클라이언트
일단 CORBA 서버를만들었으면, 이를인터페이스에저장하여야한다. 그리고, 이를클라이언트에서사용하는방법은 CORBA 서버를만들때생성된 _TLB.pas 파일을 uses 절에추가해서사용하면된다. 예를들기위해서앞서사용한 CORBA 서버예제의클라이언트프로젝트를열어보도록하자. 그러면, CORBAServer_TLB.pas 유닛이서버에서와같이사용되었다는것을알수있는데, 개발자는이와같이필요한인터페이스를만든다음간단하게해당프로그램에등록하여사용하기만하면되는것이다. 실제 CORBAServer_TLB.pas 의 initialization 부분을살펴보자. initialization CorbaStubManager.RegisterStub(IDemoCORBA, TDemoCORBAStub); CorbaInterfaceIDManager.RegisterInterface(IDemoCORBA, 'IDL:DemoCORBA:1.0'); CorbaSkeletonManager.RegisterSkeleton(IDemoCORBA, TDemoCORBASkeleton); 해당코드는스텁과스켈레톤을정의하여주며 IDManager 에해당 CORBA 데이터모듈을 등록하는코드를자동으로만들어준다. 그렇다면 CORBA 의호출방법중에동적으로호출하는방법에대해서알아보자. 동적호출 DII(dynamic interface invocation) 를사용하는방법은해당서버의객체를호출하기위한스텁클래스를마샬링한인터페이스에서찾아와야한다. 이때찾을인터페이스는앞에서설명한데로인터페이스가인터페이스저장소에미리등록되어있어야한다. 보통호출하는경우에는 Any 를사용하여호출하는것이안전하다. var InCall : TAny; begin InCall := CorbaBind( IDL:MyServer/MyServerObject:1.0 ); 이렇게코딩을하면필요한인터페이스의스텁을알수있다. 실제 TAny 형을찾아보면델파이의 Variant 데이터형임을알수있다. 델파이도움말에서 CorbaBind 에대한예제를살펴보면, CorbaBind 를사용해서동적으로호출하는 DII 를잘알수있다. var HR, Emp, Payroll, Salary: TAny;
begin HR := CorbaBind('IDL:CompanyInfo/HR:1.0'); Emp := HR.LookupEmployee(Edit1.Text); Payroll := CorbaBind('IDL:CompanyInfo/Payroll:1.0'); Salary := Payroll.GetEmployeeSalary(Emp); Payroll.SetEmployeeSalary(Emp, Salary + (Salary * StrToInt(Edit2.Text) / 100)); end; CorbaBind 를통하여원하는 IDL 인터페이스를찾아서해당메소드를사용할수있다. 정리 (Summary) 이번장에서는 CORBA 의동작원리에대해서더깊숙히알아보고, IDL 문법과실제 CORBA 서버를제작한뒤에어떻게인터페이스를등록하고사용할수있는지에대해서알아보았다. 이것으로제 5 부의내용을마치게된다. 다음에이어지는제 6 부에서는인터넷과통신에대해서알아볼것이다.