1. 프로그램ì�˜ 목ì � ¶
CORBA ì• í”Œë¦¬ì¼€ì�´ì…˜ì�´ ì–´ë–¤ 것ì�¸ì§€ë¥¼ ì„¤ì •í•˜ê¸° 위한 단순한 ì˜ˆì œì�´ë‹¤. ê·¸ë ‡ê¸° 때문ì—� ì�´ 코드를 그대로 사용해서는 올바르게 ë�™ìž‘하지 않는다. 구체ì �ì�¸ 코드는 í•„ìš”ì—� ë”°ë�¼ì„œ 추가해야한다. ìž�ì‹ ì�´ ì‚¬ìš©í• ORBì�˜ 종류ì—� ë”°ë�¼ 혹ì�€ ì‚¬ìš©í• ì–¸ì–´ì—� ë”°ë�¼ì„œ 다르게 구성ë� 것ì�´ë‹¤.
2. 프로그램 소개 ¶
CORBA FRAMEWORK를 ì�´í•´í•˜ê¸° 위한 것으로 단순히 타임 서버로부터 현재 시간ì�„ 알아보는 간단한 ë¶„ì‚° ì• í”Œë¦¬ì¼€ì�´ì…˜ì�´ë‹¤.
3. 프로그램ì—� 대한 구체ì � 설명 ¶
시간 ê°�ì²´ì—� 대한 ì�¸í„°íŽ˜ì�´ìŠ¤ëŠ” ObjTimeServerì�´ë©° getTime()ì�´ë�¼ëŠ” 메소드를 ê°€ì§€ê³ ìžˆëŠ”ë�° getTime()는 문ìž� 형ì‹�으로 현재ì�˜ 시간ì�„ 반환해 준다. CORBA ê°�체를 작성하는 첫번째 단계는 ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ 만드는 것ì�´ë‹¤. ì�¸í„°íŽ˜ì�´ìŠ¤ëŠ” IDL로 작성ë�˜ë©° ì�¸í„°íŽ˜ì�´ìŠ¤ëŠ” IDL 컴파ì�¼ëŸ¬ë¡œ 컴파ì�¼ë�œë‹¤. ì�´ IDL 컴파ì�¼ëŸ¬ëŠ” 기본ì �으로 사용ìž�ê°€ ì�´ìš©í•˜ëŠ”(예를들면 VisiBroker) ORBì—� í�¬í•¨ë�˜ì–´ 있는 것ì�´ë‹¤. IDL로 작성ë�œ ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ 컴파ì�¼í•˜ë©´ 컴파ì�¼ëŸ¬ëŠ” ë‘� ê°œì�˜ 코드 파ì�¼ì�„ ìƒ�성해 준다. ì�´ 코드 파ì�¼ë“¤ì�€ ê°� IDL 컴파ì�¼ëŸ¬ê°€ 사용하ë�„ë¡� ì•½ì •ë�œ 프로그래ë°� 언어로 ë�˜ì–´ 있다. 여기ì—�서 사용하는 ORB는 Java ORBì�´ë¯€ë¡œ 코드 파ì�¼ì�€ Java(Stub, Skeleton)로 ë�˜ì–´ 있ì�„ 것ì�´ë‹¤. IDL 컴파ì�¼ëŸ¬ì—� ì�˜í•´ ìƒ�성ë�˜ëŠ” 코드는 프ë¡�시 ê°�ì²´(proxy object) ë°� ìŠ¤ì¼ˆë ˆí†¤ 코드ì�´ë‹¤. í�´ë�¼ì�´ì–¸íŠ¸ëŠ” 프ë¡�시 ê°�체를 사용하여 IDL로 표현ë�œ ì�¸í„°íŽ˜ì�´ìФ 타입ì�˜ ê°�ì²´ ë ˆí�¼ëŸ°ìФì—� 대한 호출ì�„ ìƒ�성한다. 바꾸어 ë§�하녀 프ë¡�시 ê°�체는 í�´ë�¼ì�´ì–¸íŠ¸ê°€ 작업ì�„ 위해 사용하는 대리("stand-in") ê°�ì²´ì�¸ë�° ì›�격 ê°�ì²´ê°€ 마치 ì§€ì— ê°�체처럼 ë³´ì�´ê²Œ 해준다는 것ì�´ë‹¤. ìŠ¤ì¼ˆë ˆí†¤ 코드는 ì�´ëŸ¬í•œ ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ ì§€ì›�하는 ê°�ì²´ì—� 액세스하기 위해 사용ë�œë‹¤. ìƒ�성ë�˜ëŠ” 코드는 위치 투명성ì�„ 구현한다. 위치 투명성ì�„ 통해 ê°�ì²´ ë ˆí�¼ëŸ°ìŠ¤ë¥¼ 변환하여 네트ì›� ì—°ê²°ì�„ í‰�í•´ ì›�격 서버로 ë³´ë‚´ë©°, ê°�ì²´ ë ˆí�¼ëŸ°ìФì—� 대한 오í�¼ë ˆì�´ì…˜ì—� 따르붙는 파ë�¼ë¯¸í„°ë¥¼ 마샬ë§�í•˜ê³ , ì�´ë¥¼ ê°�ì²´ ë ˆí�¼ëŸ°ìŠ¤ê°€ 지시하는 ê°�ì²´ì�˜ 현재 메소드ì—� ì „ë‹¬í•˜ì—¬ 메소드를 ìˆ˜í–‰í•˜ê³ ê·¸ 결과를 ë°˜í™˜í•˜ë ¤ê³ í•˜ëŠ” 것ì�´ë‹¤. 바꾸어 ë§�하면 í�´ë�¼ì�´ì–¸íŠ¸ëŠ” IDL 컴파ì�¼ëŸ¬ì—� ì�˜í•´ ìƒ�성ë�œ 프ë¡�시 ê°�체를 ê°€ì§€ê³ ìž‘ì—…ì�„ 하는ë�°, 그것ì�´ 마치 ì§€ì— ê°�체로 작업하는 것처럼 ë³´ì�¼ 것ì�´ë�¼ëŠ” ì�˜ë¯¸ì�´ë‹¤. ORB와 í†µì‹ í•˜ëŠ” 것ì�´ 프ë¡�시 ê°�ì²´ì�˜ 임무ì�´ë©° ORB는 네트ì›� ì—°ê²°ì�„ ê´€ë¦¬í•˜ê³ íŒŒë�¼ë¯¸í„°ë¥¼ ì‹¤ì œ 서버 함수ì—� 넘겨주며 결과를 리턴한다. ì�´ëŸ° ì‹�으로 수행ì—� 대한 투명성ì�„ ìœ ì§€í•œë‹¤.
4. IDL ì •ì�˜ ¶
~cpp
//TestTimeServer
module TestTimeServer {
interface ObjTimeServer {
string getTime();
};
};
ì�´ IDLì�„ 컴파ì�¼í•˜ë©´(idl2java) 스í…�ê³¼ ìŠ¤ì¼ˆë ˆí†¤ 코드가 ìƒ�성ë�œë‹¤.
5. 구현 ê°�ì²´(implementation object) ìƒ�성 ¶
위ì�˜ IDLì�„ 컴파ì�¼í•˜ë©´ 스í…�ê³¼ ìŠ¤ì¼ˆë ˆí†¤ 코드가 ìƒ�성ë�œë‹¤. 컴파ì�¼ëŸ¬ê°€ ObjTimeServer_Skeleton.javaë�¼ëŠ” ì�´ë¦„ì�˜ 파ì�¼ì�„ ìƒ�성하였으며, 여기ì—�는 서버 쪽ì—�서 사용ë�˜ëŠ” ìŠ¤ì¼ˆë ˆí†¤ 코드가 들어 ìžˆë‹¤ê³ ê°€ì •í•˜ìž�. ì�´ì œ ì�´ IDLì—�서 ì§€ì •ë�œ ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ 갖는 ê°�체를 구현해야만 한다. ì�´ ë§�ì�€ 서버 코드, 즉 구현ì�„ 작성해야 한다는 것ì�´ë‹¤. 그러한 구현 ê°�ì²´ í�´ëž˜ìŠ¤ë¥¼ 작성하기 위해서는 IDL 컴파ì�¼ëŸ¬ì—� ì�˜í•´ 만들어진 ìŠ¤ì¼ˆë ˆí†¤ í�´ëž˜ìŠ¤ì™€ 결합해야 한다. ì�´ ê²°í•©ì�€ ìƒ�ì†� ë˜�는 위임ì�„ 사용해서 ì�´ë£¨ì–´ì§ˆ 수 ì�´ë‹¤.
~cpp
//구현 �래스� 대한 가� 코드
//TestTimeServerImpl.java
import CORBA.*;
class ObjTimeServerImpl extends TestTimeServer.ObjTimeServer_Skeleton {
//변수 ì„ ì–¸
//�성�
public ObjTimeServerImpl() { }
//메소드
public String getTime() throws SystemException {
return ("The current time is : " + current_time);
}
}
6. 서버 구현 ¶
ì�´ í�´ëž˜ìŠ¤ëŠ” 환경ì�„ ì´ˆê¸°í™”í•˜ê³ , 구현 ê°�체를 ìƒ�성하며, í�´ë�¼ì�´ì–¸íŠ¸ê°€ 구현 ê°�체를 ì‚¬ìš©í• ìˆ˜ 있ë�„ë¡�í•˜ê³ , ì�´ë²¤íŠ¸ë¥¼ 받아들ì�´ëŠ” ì�¼ì�„ 한다.
~cpp
//서버 �체� 대한 가� 코드
import CORBA.*;
public class TimeServer_Server {
public static void main(String [] args) {
try {
// ORB 초기화
ORB orb = ORB.init();
.
.
// 구현 �래스 �성
ObjTimeServerImpl time_server_obj = new ObjTimeServerImpl(args[0]);
.
.
} catch(SystemException e) {
System.err.println(e);
}
}
}
위ì�˜ 서버 코드를 컴파ì�¼í•˜ê³ 실행하게 ë�˜ë©´ 문ìž�ì—´í™”ë�œ IORì�„ ë°˜í™˜í• ê²ƒì�´ë‹¤. ì�´ê²ƒì�€ 단지 ì�¸ìˆ˜ ì „ë‹¬ìš©ìœ¼ë¡œ 사용ë�œë‹¤.
IOR : 00000012346121112444232....(�당히 긴 숫�임.)
IOR : 00000012346121112444232....(�당히 긴 숫�임.)
7. í�´ë�¼ì�´ì–¸íЏ 구현 ¶
í�´ë�¼ì�´ì–¸íЏ 구현ì�€ 기본ì �으로 다ì�Œ 세 가지 단계를 통해 ì�´ë£¨ì–´ì§„다. ë¨¼ì € CORBA 환경, 즉 ORB를 초기화한다. ORB를 초기화한다는 것ì�€ ORB ì�˜ì‚¬ ê°�ì²´(pseudo-object)ì—� 대한 ê°�ì²´ ë ˆí�¼ëŸ°ìŠ¤ë¥¼ 얻게 ë�œë‹¤ëŠ” 것ì�„ ì�˜ë¯¸í•œë‹¤. ORBê°€ 'ì�˜ì‚¬ ê°�ì²´'ë�¼ 불리는 ì�´ìœ 는 ê·¸ 메소드가 런타임 시스템과ì�˜ í†µì‹ ì�„ 통해 ë�¼ì�´ë¸ŒëŸ¬ë¦¬ì�˜ 형태로 ì œê³µë�˜ë©°, ì�˜ì‚¬ ê°�ì²´ ë ˆí�¼ëŸ°ìŠ¤ëŠ” CORBA ì�¸í„°íŽ˜ì�´ìФ 오í�¼ë ˆì�´ì…˜ì—� 대한 파ë�¼ë¯¸í„°ë¡œ ì „ë‹¬ë� 수 없기 때문ì�´ë‹¤. ê·¸ 다ì�Œ 단계는 ê°�ì²´ ë ˆí�¼ëŸ°ìŠ¤ë¥¼ 얻는 것ì�´ë‹¤. ê°�ì²´ ë ˆí�¼ëŸ°ìŠ¤ëŠ” 불투명한 ë�°ì�´í„° 구조ì�´ë‹¤. 그러나 ê°�ì²´ ë ˆí�¼ëŸ°ìŠ¤ë¥¼ 문ìž�열로 바꿈으로ì�¨ ì§€ì†�성ì�„ 가지게 ë� 수 있다. ì�´ê²ƒì�€ 'ê°�ì²´ ë ˆí�¼ëŸ°ìФì�˜ 문ìž�ì—´í™”'ë�¼ 불리며, ê·¸ ê²°ê³¼ 얻어지는 문ìž�ì—´ì�„ ì�¼ì»¬ì–´ '문ìž�ì—´í™” ê°�ì²´ ë ˆí�¼ëŸ°ìФ'ë�¼ê³ 한다.(IOR) ì�´ 문ìž�ì—´í™” ê°�ì²´ ë ˆí�¼ëŸ°ìŠ¤ëŠ” ì›�래ì�˜ "ìœ íš¨í•œ" ê°�ì²´ ë ˆí�¼ëŸ°ìŠ¤ë¡œ 다시 바뀔 수 있다. ì�´ ê³¼ì •ì�€ CORBA, 즉 ORB ì�¸í„°íŽ˜ì�´ìФì—�서 ì •ì�˜ë�œ ë‘� 가지 오í�¼ë ˆì�´ì…˜ object_to_string()ê³¼ string_to_object()를 ì�´ìš©í•˜ì—¬ ì�´ë£¨ì–´ì§„다. ëª¨ë“ CORBA 2.0 호환 ORB는 ìƒ�호 ìš´ìš© 가능한 문ìž�ì—´í™” ê°�ì²´ ë ˆí�¼ëŸ°ìŠ¤ë¥¼ ì‹¤ì œ ë�Œì•„가는 ê°�ì²´ ë ˆí�¼ëŸ°ìŠ¤ë¡œ 바꿀 수 있다. ì �ì ˆí•œ 타입으로 ê°�ì²´ì�˜ 범위를 줄ì�´ë©´ 그러한 결과를 ì–»ì�„ 수 있다. ì�´ëŸ¬í•œ 오í�¼ë ˆì�´ì…˜ì�„ 'narrow'ë�¼ 한다. ORB를 ì´ˆê¸°í™”í•˜ê³ ê°�ì²´ ë ˆí�¼ëŸ°ìŠ¤ë¥¼ ì–»ì�€ 후ì—�야 CORBA 프로그래ë°�ì�€ ì›�래 ì�˜ë�„한 표준 ê°�ì²´ 지향 프로그래ë°�처럼 ë�™ìž‘하게 ë�œë‹¤. í�´ë�¼ì–¸íŠ¸ê°€ ê°�ì²´ì�˜ 메소드를 호출하게 ë�˜ë©´, ì‹¤ì œë¡œ ê·¸ 메소드는 ì›�격 ê°�체와 함께 ë�™ìž‘하지만 í�´ë�¼ì�´ì–¸íŠ¸ê°€ 보기ì—�는 ì§€ì— ê°�체와 함께 ë�™ìž‘하는 것처럼 ë³´ì�¸ë‹¤.
~cpp
//위 단계� 해당하는 �사 코드
//TimeServer_Client.java
import java.io.*;
import CORBA.*;
public class TimeServer_Client {
public static void main(String [] args) {
try{
//ORB 초기화
ORB orb = ORB.init();
.
.
// ê°�ì²´ ë ˆí�¼ëŸ°ìŠ¤ë¥¼ 얻어내는 부분, 여기ì—�서는 í�´ë�¼ì�´ì–¸íЏ 프로그램ì�˜ 첫번째 ì�¸ìˆ˜ë¡œ 문ìž�ì—´í™” ê°�ì²´ ë ˆí�¼ëŸ°ìŠ¤ê°€ ì£¼ì–´ì§„ë‹¤ê³ ê°€ì •í•œë‹¤.
object myObj = orb.string_to_object(args[0]);
.
.
//ì�´ì œ ê°�ì²´ ë ˆí�¼ëŸ°ìФì�˜ 범위를 ì �ì ˆí•œ 타입으로 줄ì�¸ë‹¤.(narrow down)
TestTimeServer.ObjTimeServer TimeServer = TestTimeServer.ObjTimeServer_var.narrow(obj);
} catch(SystemException e) {
System.err.println(e);
}
}
}










