U E D R , A S I H C RSS

코바예제/시계


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....(�당히 긴 숫�임.)

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);
}
}
}
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:31:19
Processing time 0.0064 sec