Contents
- 1. ���언트
- 2. 구현 �체
- 3. ���언트 스�(Stub)
- 4. ë�™ì � 호출 ì�¸í„°íŽ˜ì�´ìФ(DII : Dynamic Invocation Interface)
- 5. �체 어댑터(Object Adapter)
- 6. 구현 ìŠ¤ì¼ˆë ˆí†¤(implementation skeleton)
- 7. ë�™ì � ìŠ¤ì¼ˆë ˆí†¤ ì�¸í„°íŽ˜ì�´ìФ(DSI : Dynamic Skeleton Interface)
- 8. ORB �터페�스
1. í�´ë�¼ì�´ì–¸íЏ ¶
ê°�ì²´ì�˜ 참조를 ìœ ì§€í•¨ìœ¼ë¡œì�¨ ì›�격 ê°�체를 ì•¡ì„¸ìŠ¤í• ìˆ˜ 있는 node(단어 ì„ íƒ�ì�´ ë¶€ì �ì ˆí•œ 것 같군 --;;)ì�´ë‹¤. 즉 ê°�ì²´ ë ˆí�¼ëŸ°ìŠ¤ë¥¼ 사용하여 í�´ë�¼ì�´ì–¸íŠ¸ëŠ” ê°�ì²´ì�˜ 오í�¼ë ˆì�´ì…˜ì�„ ìˆ˜í–‰í• ìˆ˜ 있게 ë�œë‹¤. ì›�격 ê°�체를 액세스 하는 ê³¼ì •ì—� 대해 구체ì �으로 ê¸°ìˆ í•˜ë©´ 다ì�Œê³¼ 같다. í�´ë�¼ì�´ì–¸íŠ¸ëŠ” 언어 맵핑ì�„ 통해 ê°�체와 ORB ì�¸í„°íŽ˜ì�´ìФì—� ì•¡ì„¸ìŠ¤í• ìˆ˜ 있다. ORB는 구현 ê°�체와 í�´ë�¼ì�´ì–¸íЏ 사ì�´ì�˜ 커트롤 ì „ë‹¬ ë°� ë�°ì�´í„° ì „ë‹¬ 관리를 ì±…ìž„ì§€ê³ ìžˆë‹¤. ê²°êµ í�´ë�¼ì�´ì–¸íŠ¸ëŠ” 언어 맵핑ì�„ 통해서 ORB와 ìƒ�호 ìž‘ìš©í• ìˆ˜ ìžˆê³ , ORB는 ì›�격 ê°�ì²´ì—� 대한 ë ˆí�¼ëŸ°ìŠ¤ë¥¼ ì–»ì�„ 수 있게 ë�œë‹¤. ì�´ëŸ° ë°©ì‹�으로 í�´ë�¼ì�´ì–¸íŠ¸ëŠ” ë¶„ì‚° 환경하ì—�서 ê°�체를 ì�´ë¦„ê³¼ ì�¸í„°íŽ˜ì�´ìŠ¤ë§Œìœ¼ë¡œ 마ì�ŒëŒ€ë¡œ ì°¸ì¡°í• ìˆ˜ 있는 것ì�´ë‹¤. ORB를 버스ë�¼ê³ ìƒ�ê°�하면 쉽게 ì�´í•´í• 수 있ì�„ 것ì�´ë‹¤.
2. 구현 ê°�ì²´ ¶
í�´ë�¼ì�´ì–¸íЏì�˜ 반대쪽ì—�는 구현 ê°�ì²´ë�¼ê³ ì•Œë ¤ì§„ ì‹¤ì œ ê°�ì²´ê°€ 있다. '구현 ê°�ì²´(Object Implementation)'는 ì‹¤ì œ ìƒ�태(state)와 ê°�ì²´ì�˜ ë°˜ì�‘ ì–‘ìƒ�(behavior)ì�„ ê·œì •í•˜ë©° 다양한 ë°©ì‹�으로 구성ë� 수 있다. 구현 ê°�체는 ê°�ì²´ì�˜ 메소드와 ê°�ì²´ì—� 대한 활성화 ë°� 비활성화 í”„ë¡œì‹œì €ë¥¼ ì •ì�˜í•œë‹¤. 구현 ê°�체는 ê°�ì²´ 어댑터ì�˜ ë�„움ì�„ 받아 ORB와 ìƒ�호 작용한다. ê°�ì²´ 어댑터는 구현 ê°�체를 íŠ¹ì •í•˜ê²Œ 사용하는 ë�°ì—� 편리하ë�„ë¡� ORB 서비스ì—� 대한 ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ ì œê³µí•˜ê²Œ ë�œë‹¤. 구현 ê°�체는 ORB와 ìƒ�호 작용하여 ê·¸ ì •ì²´ë¥¼ í™•ë¦½í•˜ê³ ìƒˆë¡œìš´ ê°�체를 ìƒ�성하며 ORBì—� 따르는 서비스를 íš�ë“�í• ìˆ˜ 있ë�„ë¡� 한다. 새로운 ê°�ì²´ê°€ ìƒ�성ë�˜ë©´ ORBì—�게 통보ë�˜ê³ ì�´ ê°�ì²´ì�˜ 구현ì�´ ì–´ë””ì—� 위치하는가를 알게 ë�œë‹¤. 호출ì�´ ë°œìƒ�하면 ORB, ê°�ì²´ 어댑터, ìŠ¤ì¼ˆë ˆí†¤ì�€ 구현ì�˜ ì �ì ˆí•œ 메소드ì—� 대한 호출ì�´ ë�˜ë�„ë¡� 만들어야 한다.
3. í�´ë�¼ì�´ì–¸íЏ 스í…�(Stub) ¶
CORBA는 C++ê³¼ Java ê°™ì�€ ê°�ì²´ 지향 언어와 C와 ê°™ì�€ ì ˆì°¨ì � 언어 양쪽 모ë‘�ì—�서 사용ë� 수 있다. ê°�ì²´ 지향 언어ì—�서는 사용ìž�ê°€ ê°�ì²´ì�˜ 특성ì�„ ì •ì�˜í•˜ê³ ê·¸ 프로í�¼í‹°ì—� ì•¡ì„¸ìŠ¤í• ìˆ˜ 있게 해주는 메소드와 ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ ì œê³µí•œë‹¤. ì�´ê²ƒì�€ 비ê°�ì²´ 지향 언어ì—�는 없는 기능ì�¸ë�°, ì�´ê²ƒë“¤ì�€ ê°�ê°�
ì�˜ ì�¸í„°íŽ˜ì�´ìФ 타입ì—� 대해 스í…�ì—� 대한 프로그래ë°� ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ 필요로 한다. 보통 스í…�ì�€ OMG-IDL로 ì •ì�˜ë�˜ì–´ 있는 ê°�ì²´ 오í�¼ë ˆì�´ì…˜ì—� 대한 액세를 하게 해주는ë�°, ì�¼ë‹¨ 프로그래머가 OMG-IDL ë°� íŠ¹ì • 프로그래ë°� 언어ì—� 대한 언어 매핑ì—� 친숙해지면 ì†�쉽게 예ìƒ�ì�´ 가능한 ë°©ì‹�으로 액세르를 하게 해준다. 해당 스í…�ì�€ ORB 코어ì—� ì „ìš©ì�´ë©° 최ì �í™”ë�œ ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ 사용해서 나머지 ORB들ì�„ 호출하게 ë� 것ì�´ë‹¤. 만약 여러 ê°œì�˜ ORB를 사용하게 ë�œë‹¤ë©´ ê°�ê°�ì�˜ 스í…�ì�€ ì œ ê°�기 해당하는 ORB를 호출하게 ë� 것ì�´ë‹¤. ì�´ 경우ì—� ORB와 언어 맵핑ì�€ 공조하여 ê°�ê°�ì�˜ 스í…�ì�´ íŠ¹ì • ê°�ì²´ ë ˆí�¼ëŸ°ìŠ¤ì™€ ì œëŒ€ë¡œ ì—°ê²°ë� 수 있ë�„ë¡� 해야 í• ê²ƒì�´ë‹¤.
ì�˜ ì�¸í„°íŽ˜ì�´ìФ 타입ì—� 대해 스í…�ì—� 대한 프로그래ë°� ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ 필요로 한다. 보통 스í…�ì�€ OMG-IDL로 ì •ì�˜ë�˜ì–´ 있는 ê°�ì²´ 오í�¼ë ˆì�´ì…˜ì—� 대한 액세를 하게 해주는ë�°, ì�¼ë‹¨ 프로그래머가 OMG-IDL ë°� íŠ¹ì • 프로그래ë°� 언어ì—� 대한 언어 매핑ì—� 친숙해지면 ì†�쉽게 예ìƒ�ì�´ 가능한 ë°©ì‹�으로 액세르를 하게 해준다. 해당 스í…�ì�€ ORB 코어ì—� ì „ìš©ì�´ë©° 최ì �í™”ë�œ ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ 사용해서 나머지 ORB들ì�„ 호출하게 ë� 것ì�´ë‹¤. 만약 여러 ê°œì�˜ ORB를 사용하게 ë�œë‹¤ë©´ ê°�ê°�ì�˜ 스í…�ì�€ ì œ ê°�기 해당하는 ORB를 호출하게 ë� 것ì�´ë‹¤. ì�´ 경우ì—� ORB와 언어 맵핑ì�€ 공조하여 ê°�ê°�ì�˜ 스í…�ì�´ íŠ¹ì • ê°�ì²´ ë ˆí�¼ëŸ°ìŠ¤ì™€ ì œëŒ€ë¡œ ì—°ê²°ë� 수 있ë�„ë¡� 해야 í• ê²ƒì�´ë‹¤.
4. ë�™ì � 호출 ì�¸í„°íŽ˜ì�´ìФ(DII : Dynamic Invocation Interface) ¶
í�´ë�¼ì�´ì–¸íŠ¸ê°€ 호출ë� ê°�체와 ìˆ˜í–‰í• ì˜¤í�¼ë ˆì�´ì…˜ì�„ ì§€ì •í•˜ê³ ìž� í• ë•Œ, íŠ¹ì • ê°�ì²´ Aì�˜ íŠ¹ì • 오í�¼ë ˆì�´ì…˜ì�„ ì§€ì •í•˜ëŠ” ëŒ€ì‹ ê°�ì²´ 호출ì�„ ë�™ì �으로 ìƒ�성하ë�„ë¡� 허용하는 ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ ì�´ìš©í• 수 있다. ì�´ëŸ¬í•œ 경우 í�´ë�¼ì�´ì–¸íЏ 코드ì—�서는 수행ë�˜ëŠ” 오í�¼ë ˆì�´ì…˜ê³¼ ì „ë‹¬ë�˜ëŠ” 파ë�¼ë¯¸í„°ì�˜ 타입ì—� 대한 ì •ë³´ë¥¼ ì œê³µí•´ì•¼ 한다. ì�´ ì •ë³´ëŠ” 대개 ì�¸í„°íŽ˜ì�´ìФ ì €ìž¥ì†Œì™€ ê°™ì�€ 런타입 소스ì—�서 얻어진다. 실행 시간 중ì—� 해당 ì •ë³´ë¥¼ ì–»ì�€ 후, í�´ë�¼ì�´ì–¸íЏ 코드는 ì�´ë¥¸ë°” ë�™ì � 호출 ì�¸í„°íŽ˜ì�´ìФ(DII)를 ì�´ìš©í•´ì„œ ë�™ì �으로 호출ì�„ í• ìˆ˜ 있게 ë�œë‹¤.
5. ê°�ì²´ 어댑터(Object Adapter) ¶
구현 ê°�ì²´ê°€ ORBì—� ì�˜í•´ ì œê³µë�˜ëŠ” 서비스를 ì�´ìš©í•˜ëŠ” 주ë�œ 방법ì�€ ê°�ì²´ 어댑터를 통하는 것ì�´ë‹¤. ê°�ì²´ 어댑터는 CORBA ë�¼ì�´ë¸ŒëŸ¬ë¦¬ì�¸ë�° ORB 코어 í†µì‹ ì„œë¹„ìŠ¤ì�˜ 맨 위쪽ì—� ìœ„ì¹˜í•˜ê³ ìžˆìœ¼ë©° 서버 ê°�체를 ëŒ€ì‹ í•˜ì—¬ 리퀘스트를 받아들ì�¸ë‹¤. ê°�ì²´ 어댑터는 서버 ê°�체를 ì�¸ìŠ¤í„´ìŠ¤í™”í•˜ê¸° 위한 실행 환경ì�„ ì œê³µí•œë‹¤. 즉, 서버 ê°�ì²´ì—� 리퀘스트를 ì „ë‹¬í•˜ë©° ê°�ì²´ ID를 부여하는 등ì�˜ 작업ì�„ 하게 ë�œë‹¤ëŠ” 것ì�´ë‹¤. ë˜�한, ê°�ì²´ 어댑터는 구현 ì €ìž¥ì†Œì—� 어댑터가 ì§€ì›�하는 í�´ëž˜ìŠ¤ì™€ 런타임 ì�¸ìŠ¤í„´ìŠ¤ë¥¼ 등ë¡�한다. CORBAì—�서는 ê°� ORBê°€ 기본 ê°�ì²´ 어댑터(BOA)ë�¼ 불리는 표준 어댑터를 ì§€ì›�하ë�„ë¡� ê·œì •í•œë‹¤. 하나ì�˜ 서버가 여러 ê°œì�˜ ê°�ì²´ 어댑터를 ì§€ì›�í• ìˆ˜ 있다.
ê°�ì²´ 어댑터를 통하여 ORBê°€ ì œê³µí•˜ëŠ” 서비스ì—�는 í�”히 ê°�ì²´ ë ˆí�¼ëŸ°ìФì�˜ ìƒ�성과 í•´ì„�, 메소드 구현, 보안과 ìƒ�호 작용, 구현 ê°�ì²´ì�˜ 활성화/비활성화, 구현으로ì�˜ ê°�ì²´ ë ˆí�¼ëŸ°ìФ 맵핑, ê·¸ë¦¬ê³ êµ¬í˜„ ê°�ì²´ì�˜ 등ë¡� 기능 등ì�´ í�¬í•¨ë�œë‹¤. ê°�ì²´ 어댑터를 통하게 ë�˜ë©´, ORBì—�서 비슷한 요구 사í•ì�„ 가진 íŠ¹ì • 그룹ì�˜ 구현 ê°�ì²´ë§Œì�„ í•œì •í•˜ì—¬ 다루는 것ì�´ 가능해진다.
ê°�ì²´ 어댑터를 통하여 ORBê°€ ì œê³µí•˜ëŠ” 서비스ì—�는 í�”히 ê°�ì²´ ë ˆí�¼ëŸ°ìФì�˜ ìƒ�성과 í•´ì„�, 메소드 구현, 보안과 ìƒ�호 작용, 구현 ê°�ì²´ì�˜ 활성화/비활성화, 구현으로ì�˜ ê°�ì²´ ë ˆí�¼ëŸ°ìФ 맵핑, ê·¸ë¦¬ê³ êµ¬í˜„ ê°�ì²´ì�˜ 등ë¡� 기능 등ì�´ í�¬í•¨ë�œë‹¤. ê°�ì²´ 어댑터를 통하게 ë�˜ë©´, ORBì—�서 비슷한 요구 사í•ì�„ 가진 íŠ¹ì • 그룹ì�˜ 구현 ê°�ì²´ë§Œì�„ í•œì •í•˜ì—¬ 다루는 것ì�´ 가능해진다.
6. 구현 ìŠ¤ì¼ˆë ˆí†¤(implementation skeleton) ¶
ê°�ê°�ì�˜ 언어 매핑ì—� 대해(아마ë�„ ê°�ì²´ 어댑터ì—�ì�˜ ì�˜ì¡´í•˜ê²Œ ë�˜ê² 지만) ê°�ê°�ì�˜ 타입ì�˜ ê°�체를 구현하ë�„ë¡� 해주는 메소드ì—� 대한 ì�¸í„°íŽ˜ì�´ìŠ¤ê°€ ì¡´ìž¬í• ê²ƒì�´ë‹¤. ì�´ ì�¸í„°íŽ˜ì�´ìŠ¤ëŠ” ì�¼ë°˜ì �으로 업콜(up-call) ì�¸í„°íŽ˜ì�´ìФì�¼ 것ì�´ë‹¤. 구현 ê°�ì²´ì�˜ 개발ìž�는 ê·¸ ì�¸í„°íŽ˜ì�´ìФì—� ë”°ë�¼ 루틴ì�„ 작성하게 ë�˜ê³ ORB는 ìŠ¤ì¼ˆë ˆí†¤ì�„ 통해서 ê·¸ 루틴ì�„ 호출하게 ë� 것ì�´ë‹¤. 그러나 ìŠ¤ì¼ˆë ˆí†¤ì�˜ 존재가 ê·¸ì—� 사ì�‘하는 í�´ë�¼ì�´ì–¸íЏ 스í…�ì�˜ 조재를 ì�˜ë¯¸í•˜ì§€ëŠ” 않는다는 것ì�´ë‹¤. ì�´ë§�ì�€ í�´ë�¼ì�´ì–¸íŠ¸ê°€ DII를 통해서 리퀘스트를 만들 수ë�„ 있다는 것ì�´ë‹¤. ë˜�한, ì–´ë–¤ 언어 맵핑ì�€ ìŠ¤ì¼ˆë ˆí†¤ì�„ 사용하지 않는ë�°, ì�´ê²ƒì�€ Smalltalkì—�시는 대체ì �으로 맞는 ë§�ì�´ë‹¤.
7. ë�™ì � ìŠ¤ì¼ˆë ˆí†¤ ì�¸í„°íŽ˜ì�´ìФ(DSI : Dynamic Skeleton Interface) ¶
ë�™ì � ìŠ¤ì¼ˆë ˆí†¤ ì�¸í„°íŽ˜ì�´ìŠ¤ëŠ” IDLì—� 기초하지 않는 ìŠ¤ì¼ˆë ˆí†¤/스í…�ì�„ 가진 ê°�ì²´ì�˜ 메소드 호출ì�„ 처리해야 하는 서버ì—� 대해 런타임 ë°”ì�¸ë”© 메커니즘ì�„ ì œê³µí•œë‹¤. ë�™ì � ìŠ¤ì¼ˆë ˆí†¤ì�€ ìˆ˜ì‹ ë�œ 메시지ì�˜ 파ë�¼ë¯¸í„°ê°’ì�„ 참조하여 ì–´ë–¤ ê°�ì²´ê°€ 호출ë�˜ì—ˆëŠ”ì§€ ì–´ë–¤ 메소드가 호출ë�˜ì—ˆëŠ”ì§€ë¥¼ 알게 ë�œë‹¤. ì�´ê²ƒì�€ ì�¼ë°˜ì �으로 컴파ì�¼ë�œ ìŠ¤ì¼ˆë ˆí†¤ì�„ 사용하는 것과는 비êµ�ë�˜ëŠ”ë�° ì�´ëŸ¬í•œ ìŠ¤ì¼ˆë ˆí†¤ì—�서는 메소드ì�˜ 구현ì�´ IDL로 ì •ì�˜ë�œë‹¤. 구현 코드는 ëª¨ë“ ì˜¤í�¼ë ˆì�´ì…˜ 파ë�¼ë¯¸í„°ì—� 대한 ìƒ�세한 설명ì�„ ORBì—� ì œê³µí•´ì•¼ 하며, ORB는 오í�¼ë ˆì�´ì…˜ì�„ ìˆ˜í–‰í• ë•Œ 사용ë�˜ëŠ” ìž…ë ¥ 파ë�¼ë¯¸í„°ê°’ì�„ ì œê³µí•œë‹¤. 오í�¼ë ˆì�´ì…˜ì�´ 수행ë�œ 후, 구현 코드는 ì¶œë ¥ 파ë�¼ë¯¸í„° ë˜�는 ì�µì…‰ì…˜ì�„ ORBì—�게 넘겨준다. ë�™ì � ìŠ¤ì¼ˆë ˆí†¤ ì�¸í„°íŽ˜ì�´ìФì�˜ 특성ì�€ 프로그래ë°� 언어 맵핑ì—� ë”°ë�¼ ë˜�는 ê°�ì²´ 어댑터ì—� ë”°ë�¼ 실질ì �으로 달ë�¼ì§ˆ 수 있지만, ì�¼ë°˜ì �으로는 업콜 ì�¸í„°íŽ˜ì�´ìФì�´ë‹¤. ë�™ì � ìŠ¤ì¼ˆë ˆí†¤ì�€ í�´ë�¼ì�´ì–¸íЏ 스í…� ë˜�는 DII를 통해서 호출ë� 수 있다. ì�´ ë‘� 가지 ë°©ì‹�ì�˜ í�´ë�¼ì�´ë„ˆíЏ 리퀘스트 ìƒ�성 ì�¸í„°íŽ˜ì�´ìŠ¤ëŠ” ë�™ì�¼í•œ 결과를 ì œê³µí•œë‹¤.
8. ORB ì�¸í„°íŽ˜ì�´ìФ ¶
ORB ì�¸í„°íŽ˜ì�´ìŠ¤ëŠ” ì• í”Œë¦¬ì¼€ì�´ì…˜ì—� 중요한 ì§€ì— ì„œë¹„ìŠ¤ì—� 대한 API들로 구성ë�˜ì–´ 있지 않다. ì�´ê²ƒì�€ 곧바로 ORB로 가는 ì�¸í„°íŽ˜ì�´ìФì�´ê³ ëª¨ë“ ORB들ì—� 대해 ë�™ì�¼í•˜ë‹¤.ORB ì�¸í„°íŽ˜ì�´ìŠ¤ëŠ” ê°�ì²´ 어댑터 ë˜�는 ê°�ì²´ ì�¸í„°íŽ˜ì�´ìФì—� ì�˜ì¡´í•˜ì§€ 않는다. 대부분ì�˜ ORBì�˜ 기능ì�´ ê°�ì²´ 어댑터, 스í…�, ìŠ¤ì¼ˆë ˆí†¤ ë˜�는 ë�™ì � 호출 등ì�„ 통해서 ì œê³µë�˜ë¯€ë¡œ 몇몇 오í�¼ë ˆì�´ì…˜ë§Œì�´ ëª¨ë“ ê°�체들ì—� 대해 공통ì�´ë‹¤. 공통 오í�¼ë ˆì�´ì…˜ì—�는 get_interface와 get_implementation ê°™ì�€ 함수가 í�¬í•¨ë�˜ì–´ 있는ë�°, ì�´ê²ƒë“¤ì�€ ìž„ì�˜ì�˜ ê°�ì²´ ë ˆí�¼ëŸ°ìФì—� 작용하며 ê°�ê°� ì�¸í„°íŽ˜ì�´ìФ ì €ìž¥ì†Œ ê°�체와 구현 ì €ìž¥ì†Œ ê°�체를 얻는 ë�° 사용ë�œë‹¤.









