공통 객체 요구 매개자 구조
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
공통 객체 요구 매개자 구조(CORBA)는 분산 객체 간의 상호 운용을 위한 통신 미들웨어로, 분산 환경에서 애플리케이션 개발을 지원하는 기술이다. 1991년 CORBA 1.0 발표 이후, C++, Java 등 다양한 언어 매핑을 지원하며 발전해왔고, 2002년 CORBA 3.0에서는 컴포넌트 기반 개발을 위한 CORBA 컴포넌트 모델(CCM)이 도입되었다. CORBA는 언어 및 운영체제 독립성, 기술로부터의 자유, 데이터 형식화, 높은 튜닝 가능성 등의 특징을 가지며, IDL, ORB, 객체 어댑터, 서번트, 인터셉터 등의 구조로 이루어져 있다. 주요 프로토콜로는 GIOP, IIOP 등이 있으며, 위치 투명성, 표준화 과정, 부실한 구현 등의 비판도 존재한다.
더 읽어볼만한 페이지
- 컴포넌트 기반 소프트웨어 공학 - 컴포넌트 오브젝트 모델
컴포넌트 오브젝트 모델(COM)은 마이크로소프트에서 개발한 소프트웨어 컴포넌트 기술로, 서로 다른 애플리케이션이 객체를 통해 통신하고 기능을 공유할 수 있도록 하는 이진 인터페이스 표준을 제공하며, 다양한 프로그래밍 언어로 작성된 객체들의 상호 운용을 지원한다. - 컴포넌트 기반 소프트웨어 공학 - 제어 반전
제어 반전은 프로그램의 제어 흐름을 프레임워크나 컨테이너가 관리하도록 하는 프로그래밍 원칙으로, 코드 결합도를 낮추고 유연성을 높이지만, 복잡성을 증가시킬 수 있다는 비판도 존재한다. - 프로세스 간 통신 - Ajax
Ajax는 웹 페이지 전체를 새로고침하지 않고 비동기적으로 서버와 통신하여 웹 애플리케이션의 일부를 업데이트하는 웹 개발 기술로, XMLHttpRequest 객체의 등장으로 가능해졌으며 HTML, CSS, DOM, JavaScript, JSON 등의 기술을 통합하여 동적인 사용자 인터페이스를 구현한다. - 프로세스 간 통신 - D-Bus
D-Bus는 2002년에 시작된 프로세스 간 통신 시스템으로, 시스템 버스와 세션 버스를 통해 정보 공유, 모듈성, 권한 격리를 제공하며, 일대일 요청-응답 및 발행/구독 통신 방식을 지원한다. - 객체 지향 프로그래밍 - Is-a
Is-a 관계는 객체 지향 프로그래밍에서 한 유형이 다른 유형의 하위 유형임을 나타내는 관계로, 상속, 서브타이핑, 리스코프 치환 원칙과 관련되며, C++, Python, Java 등에서 표현된다. - 객체 지향 프로그래밍 - 객체 (컴퓨터 과학)
객체는 객체 지향 프로그래밍에서 데이터와 조작을 묶어 메시지를 수신하고, 프로그램의 개념을 표현하며 가시성과 재사용성을 높이는 실체이다.
공통 객체 요구 매개자 구조 | |
---|---|
일반 정보 | |
이름 | 공통 객체 요청 브로커 아키텍처 |
원어 이름 | Common Object Request Broker Architecture |
약칭 | CORBA |
개발 시작 | 1991년 |
최신 버전 | 3.4 |
최신 버전 날짜 | 2021년 2월 |
조직 | 객체 관리 그룹 |
웹사이트 | CORBA 공식 웹사이트 |
2. 역사
분산 시스템은 원격 시스템 간의 자원 공유, 개방성, 병렬성, 확장성, 내구성, 투명성 등을 제공해야 한다. 또한 1980년대부터 대두되었던 객체지향 기술의 객체는 데이터와 그 데이터를 조작할 수 있는 메소드(method)로 구성되어 있으며, 프로그램은 메시지에 의한 객체 간의 상호 작용을 기술함으로써 여러 문제를 해결할 수 있게 됐다.
분산 객체 기술은 이러한 두 기술의 장점을 효과적으로 통합하는 기술이며, 개발자에게 애플리케이션 개발의 생산성을 향상시켜주고, 사용자에게 분산 환경에 투명하게 통합된 정보를 제공한다.
이를 위해 객체 관리 그룹(OMG, Object Management Group)에서는 분산 컴퓨팅과 객체지향 기술을 하나로 합친 표준 아키텍처를 제안하게 되는데, 그것이 바로 CORBA이다.
CORBA는 1991년 10월에 1.0 버전이 처음 발표된 이후 지속적으로 발전해왔다.[2][3][4]
2. 1. 초기 버전 (1.x ~ 2.x)
CORBA 표준 버전의 역사는 다음과 같다.[2][3][4]버전 | 버전 날짜 | 주요 특징 | CORBA IDL 버전 |
---|---|---|---|
1.0 | 1991년 10월 | 최초 버전, C 매핑 | - |
1.1 | 1992년 2월 | 상호 운용성, C++ 매핑 | - |
1.2 | 1993년 12월 | - | |
2.0 | 1996년 8월 | 표준의 첫 번째 주요 업데이트, CORBA 2라고도 함 | - |
2.1 | 1997년 8월 | - | |
2.2 | 1998년 2월 | Java 매핑 | - |
2.3 | 1999년 6월 | - | |
2.4 | 2000년 8월 | - | |
2.5 | 2001년 9월 | - | |
2.6 | 2001년 12월 | - |
2. 2. 발전 (3.x 이후)
2002년 7월, CORBA 3.0이 발표되었다. CORBA 3.0은 표준의 두 번째 주요 업데이트로, '''CORBA 3'''이라고도 불린다.[2][3][4] CORBA 컴포넌트 모델(CCM)을 도입하여 컴포넌트 기반 개발을 지원한다. 이후로도 지속적인 개선을 통해 안정성과 기능성이 향상되었다.CORBA 표준 버전의 역사는 다음과 같다.
버전 | 버전 날짜 | 주요 특징 | CORBA IDL 버전 |
---|---|---|---|
3.0 | 2002년 7월 | 표준의 두 번째 주요 업데이트, CORBA 3이라고도 함, CORBA 컴포넌트 모델(CCM) | - |
3.0.1 | 2002년 11월 | - | |
3.0.2 | 2002년 12월 | - | |
3.0.3 | 2004년 3월 | - | |
3.1 | 2008년 1월 | - | |
3.1.1 | 2011년 8월 | ISO/IEC 19500의 2012년 판으로 채택됨 | - |
3.2 | 2011년 11월 | - | |
3.3 | 2012년 11월 | ZIOP 추가 | - |
3.4 | 2021년 2월 | 어노테이션 | 4.2 |
CORBA는 분산 컴퓨팅 환경에서 서로 다른 프로그래밍 언어, 운영 체제, 하드웨어 플랫폼에서 동작하는 애플리케이션 간의 상호 운용성을 지원하기 위해 설계되었다.
IDL 변경 사항은 일부 프라그마를 대체하는 어노테이션(예: @unit, @topic)으로 진행되었다.
3. 특징
주요 특징:
CORBA는 객체 관리 그룹(OMG)에서 제안한 표준 아키텍처로, 분산 객체 간의 상호 운용을 위한 통신 미들웨어 역할을 한다. 이를 통해 개발자는 분산 환경에서 응용 소프트웨어를 쉽게 개발하고, 사용자는 분산 환경에 투명하게 통합된 정보를 제공받을 수 있다.
CORBA는 언어 및 OS 독립성, 기술 종속적인 구현으로부터의 자유, 강력한 데이터 형식화, 높은 수준의 튜닝 가능성, 분산 데이터 전송 세부 사항으로부터의 자유 등 여러 장점을 제공한다.
4. CORBA의 구조
CORBA 아키텍처는 객체 요청 브로커(ORB, Object Request Broker)를 중심으로 구성되며, ORB는 클라이언트와 서버 간의 통신을 중재한다.
CORBA 클라이언트에서 스텁은 서버에 실제로 구현된 객체에 대한 프록시(proxy) 역할을 한다. 클라이언트는 인터페이스를 구현한 객체와 직접 상호 작용하듯이 스텁에 접근하여, ORB 소프트웨어를 통해 인터페이스를 호출한다.[1]
CORBA 서버에서 ORB 소프트웨어는 인터페이스 호출을 생성된 스켈레톤에 자동으로 넘겨준다. 스켈레톤은 Portable Object Adapter(POA)를 통해 ORB 소프트웨어와 통신하며, POA를 사용해 객체를 등록하고, 객체의 범위와 객체가 인스턴스화되어 클라이언트에 반응할 수 있게 되는 시기 등을 결정한다.[1]
클라이언트의 요구 메시지는 클라이언트 스텁(또는 DSI)을 통해 ORB 코어를 지나 서버 측의 객체 어댑터로 전달되며, 객체 어댑터는 구현 저장소에서 요구한 서버의 위치를 확인한 후 서버를 활성화한다. 서버 실행이 끝나면 생성된 결과 값은 요구가 전달된 역순으로 클라이언트에게 전달된다.[1]
''서번트''는 원격 메서드 호출을 처리하기 위한 메서드를 포함하는 호출 대상이다. 최신 CORBA 버전에서 원격 객체(서버 측)는 ''객체''(원격 호출에 노출됨)와 ''서번트''(전자가 메서드 호출을 전달하는 대상)로 나뉜다. 원격 ''객체''당 하나의 ''서번트''가 있을 수 있으며, 동일한 서번트가 주어진 POA와 관련된 여러 (아마도 모든) 객체를 지원할 수 있다. 각 ''객체''에 대한 ''서번트''는 "영원히 한 번" 설정되거나(서번트 활성화) 해당 객체에 대한 메서드가 호출될 때마다 동적으로 선택될 수 있다(서번트 위치). 서번트 로케이터와 서번트 액티베이터는 모두 다른 서버로 호출을 전달할 수 있다. 이 시스템은 여러 컴퓨터 간에 요청을 분산하여 부하를 분산하는 강력한 수단을 제공한다. 객체 지향 언어에서 원격 ''객체''와 해당 ''서번트''는 객체 지향 프로그래밍 관점에서 모두 객체이다.[1]
''화신''은 요청을 처리할 수 있도록 서번트를 CORBA 객체와 연결하는 행위이다. 화신은 가상 CORBA 객체에 대한 구체적인 서번트 형태를 제공한다. 활성화 및 비활성화는 CORBA 객체에만 해당하며, 화신 및 무형화라는 용어는 서번트를 지칭한다. 그러나 객체와 서번트의 수명은 독립적이다. 항상 activate_object()를 호출하기 전에 서번트를 화신시키지만, 그 반대도 가능하다. create_reference()는 서번트를 화신시키지 않고 객체를 활성화하며, 서번트 화신은 나중에 서번트 매니저를 사용하여 필요에 따라 수행된다.[1]
4. 1. 클라이언트 측
IDL 스텁은 클라이언트 측에서 정적인 통신을 담당하며, 서버 객체에 대한 프록시 역할을 한다.[1] 동적 호출 인터페이스(DII, Dynamic Invocation Interface)는 동적인 통신을 지원하며, 런타임에 객체의 인터페이스를 검색하고 호출할 수 있다.[1] 인터페이스 저장소(Interface Repository)는 인터페이스 정보를 저장하고, 동적 호출 시 참조된다.[1] ORB 인터페이스는 클라이언트와 서버 측 모두에서 사용 가능한 의사 객체 관련 서비스를 제공한다.[1]4. 2. 서버 측
- 객체 어댑터(Object Adapter): 디스크에 적재된 응용 서버의 활성화 및 비활성화 등을 담당한다.[1]
- IDL 스켈레톤: 서버 측에서의 정적 통신을 담당한다.[1]
- 동적 스켈레톤 인터페이스(DSI: Dynamic Skeleton Interface): 동적 통신을 담당한다.[1]
- 구현 저장소(Implementation Repository): 서버 측 객체와 관련한 각종 정보를 저장한다.[1]
Portable Object Adapter(POA)는 서버 측 원격 호출 처리기를 원격 ''객체''와 해당 ''서번트''로 분할하는 역할을 하는 CORBA 객체이다. 객체는 원격 호출에 노출되는 반면, 서번트는 실제로 요청을 처리하는 메서드를 포함한다. 각 객체에 대한 서번트는 정적으로(한 번) 또는 동적으로(각 원격 호출마다) 선택할 수 있으며, 두 경우 모두 다른 서버로의 호출 전달을 허용한다.[1]
서버 측에서 POA는 트리 구조를 형성하며, 각 POA는 하나 이상의 객체를 처리한다. 이 트리의 분기는 독립적으로 활성화/비활성화될 수 있으며, 서번트 위치 또는 활성화를 위한 다른 코드를 가지고 있으며, 서로 다른 요청 처리 정책을 가진다.[1]
4. 3. ORB 코어
ORB 코어는 객체 레퍼런스의 생성 및 해석 등 객체의 기능적인 표현 기능을 제공한다.[1] 또한 클라이언트와 객체 구현 사이의 요청(Request) 통신 기능을 제공한다.[1] ORB 서비스는 보안 콘텍스트를 요청과 함께 전송하는 기능을 제공한다.[1]5. 주요 개념
분산 시스템과 객체지향 기술의 장점을 결합한 CORBA는 분산 환경에서 소프트웨어 간의 통신을 가능하게 하는 표준 아키텍처이다. CORBA의 주요 개념은 다음과 같다.
CORBA는 인터페이스 정의 언어(IDL)를 사용하여 객체의 인터페이스를 지정하고, IDL은 C++(C++), 자바 등 다양한 프로그래밍 언어로 매핑된다. 객체 요청 브로커(ORB)는 응용 프로그램이 다른 객체와 상호 작용하는 방식을 규정하며, 객체 어댑터는 생성된 코드 클래스의 인스턴스를 등록하는 데 사용된다.[1]
CORBA 기반 시스템을 구축하려면 개발자는 시스템이 사용하거나 구현할 논리에 대한 객체 지향 인터페이스를 정의하는 IDL 코드를 작성해야 한다. ORB 구현에는 IDL 인터페이스를 대상 언어로 변환하는 IDL 컴파일러가 포함되어 있다.
CORBA는 언어 및 플랫폼 중립적인 원격 프로시저 호출(RPC) 사양을 제공하며, 트랜잭션, 보안, 이벤트 등과 같은 일반적인 서비스도 정의한다.
5. 1. 객체 참조 (Object Reference)
CORBA 객체는 객체 참조를 통해 식별되고 접근된다. 객체 참조는 네트워크 상에서 객체의 위치를 나타내는 일종의 주소 역할을 한다. 이 참조는 문자열화된 URL 또는 DNS와 유사한 이름 서비스 조회를 통해 획득되거나, 호출 중 메서드 매개변수로 전달된다.객체 참조는 실제 객체(원격 또는 로컬)의 인터페이스와 일치하는 가벼운 객체이다. 참조에 대한 메서드 호출은 ORB에 대한 후속 호출로 이어지며, 응답, 성공 또는 실패를 기다리는 동안 스레드에서 블로킹된다. 매개변수, 반환 데이터(있는 경우) 및 예외 데이터는 ORB에 의해 로컬 언어 및 OS 매핑에 따라 내부적으로 마샬링된다.
5. 2. 인터페이스 정의 언어 (IDL, Interface Definition Language)
인터페이스 정의 언어(IDL, Interface Definition Language)는 CORBA 객체의 인터페이스를 정의하는 데 사용되는 언어 중립적인 언어이다. IDL을 통해 객체의 메서드, 매개변수, 반환 값 등을 정의할 수 있다.[1]CORBA는 IDL을 사용하여 객체가 외부 세계에 제공하는 인터페이스를 지정한다. 그런 다음 CORBA는 IDL에서 C++, 자바 등 특정 구현 언어로의 '매핑'을 지정한다. 에이다, C, C++, C++11, 코볼, 자바, 리스프, PL/I, 오브젝트 파스칼, 파이썬, 루비, 스몰토크에 대한 표준 매핑이 있다. C#, 얼랭, 펄, Tcl, 비주얼 베이직에 대한 비표준 매핑은 해당 언어로 작성된 객체 요청 브로커(ORB)에 의해 구현된다.[1]
CORBA 인터페이스 정의 언어는 언어 및 OS에 독립적인 객체 간 통신 정의를 제공한다. CORBA 객체는 참조로 전달되는 반면, 데이터(정수, 실수, 구조체, 열거형 등)는 값으로 전달된다. 객체 참조와 값에 의한 데이터 전달의 조합은 클라이언트와 서버를 컴파일하는 동안 강력한 데이터 형식을 적용하는 수단을 제공하며, CORBA 문제 공간에 내재된 유연성을 유지한다.[1]
원격 객체와는 별도로, CORBA와 RMI-IIOP는 OBV(Objects by Value, 값에 의한 객체)의 개념을 정의하고 있다. 객체 내 메서드의 코드는 기본적으로 로컬에서 실행된다. OBV를 원격에서 수신하는 경우, 필요한 코드가 양쪽에 미리 준비되어 있거나, 송신 측으로부터 동적으로 다운로드해야 한다. 이 때문에, 코드를 다운로드할 수 있는 URL군의 (공백으로 구분된) 목록인 Code Base가 OBV를 정의하는 레코드에 포함되어 있다. OBV는 원격 메서드를 가질 수도 있다.[1]
OBV는 전송될 때 함께 전송되는 필드를 가질 수 있다. 해당 필드에는 OBV 자체, 구성 목록, 트리 구조나 그래프 등이 포함된다. OBV에는 클래스 계층이 있으며, 다중 상속이나 추상 클래스도 있다.[1]
5. 3. 서번트 (Servant)
서번트(Servant영어)는 서버 측에서 실제 객체의 기능을 구현하는 코드이다. 클라이언트의 요청은 ORB를 통해 서번트로 전달되어 처리된다.[6][7]최신 CORBA 버전에서 원격 객체(서버 측)는 객체(원격 호출에 노출됨)와 서번트(전자가 메서드 호출을 전달하는 대상)로 나뉜다. 원격 객체당 하나의 서번트가 있을 수 있으며, 동일한 서번트가 주어진 POA와 관련된 여러 (아마도 모든) 객체를 지원할 수 있다. 각 객체에 대한 서번트는 "영원히 한 번" 설정되거나(서번트 활성화) 해당 객체에 대한 메서드가 호출될 때마다 동적으로 선택될 수 있다(서번트 위치). 서번트 로케이터와 서번트 액티베이터 모두 다른 서버로 호출을 전달할 수 있다. 이러한 시스템은 여러 컴퓨터 간에 요청을 분산하여 부하를 분산하는 강력한 수단을 제공한다. 객체 지향 언어에서 원격 객체와 해당 서번트는 객체 지향 프로그래밍 관점에서 모두 객체이다.
화신은 요청을 처리할 수 있도록 서번트를 CORBA 객체와 연결하는 행위이다. 화신은 가상 CORBA 객체에 대한 구체적인 서번트 형태를 제공한다. 활성화 및 비활성화는 CORBA 객체에만 해당하며, 화신 및 무형화라는 용어는 서번트를 지칭한다. 그러나 객체와 서번트의 수명은 독립적이다. 항상 `activate_object()`를 호출하기 전에 서번트를 화신시키지만, 그 반대도 가능하다. `create_reference()`는 서번트를 화신시키지 않고 객체를 활성화하며, 서번트 화신은 나중에 서번트 매니저를 사용하여 필요에 따라 수행된다.
5. 4. 인터셉터 (Interceptor)
인터셉터는 클라이언트와 서버 간의 통신 과정에 개입하여 메시지를 가로채거나 수정할 수 있는 기능이다. 보안, 로깅, 모니터링 등 다양한 용도로 활용될 수 있다.[5] 포터블 인터셉터는 CORBA와 RMI-IIOP에서 CORBA 시스템의 가장 중요한 기능을 중재하는 데 사용되는 "훅"이다. CORBA 표준은 다음과 같은 유형의 인터셉터를 정의한다.- IOR 인터셉터는 현재 서버에서 제공하는 원격 객체에 대한 새 참조의 생성을 중재한다.
- 클라이언트 인터셉터는 일반적으로 클라이언트(호출자) 측에서 원격 메서드 호출을 중재한다. 객체 서번트가 메서드가 호출되는 동일한 서버에 존재하는 경우 로컬 호출도 중재한다.
- 서버 인터셉터는 서버(처리자) 측에서 원격 메서드 호출의 처리를 중재한다.
인터셉터는 전송되는 메시지와 생성되는 IOR에 특정 정보를 첨부할 수 있다. 이 정보는 나중에 원격 측의 해당 인터셉터에서 읽을 수 있다. 인터셉터는 또한 전달 예외를 발생시켜 요청을 다른 대상으로 리디렉션할 수 있다.
6. 프로토콜
CORBA는 객체 간 통신을 위해 다양한 프로토콜을 지원한다. 대표적으로 GIOP와 GIOP를 인터넷 환경에서 구현한 IIOP가 있다. 또한, 보안 통신을 위한 SSL 상호 객체 프로토콜(SSLIOP영어), HTTP를 통한 통신을 지원하는 하이퍼텍스트 상호 객체 프로토콜(HTIOP영어), 압축을 통해 대역폭 사용량을 줄이는 ZIOP (Zipped IOP영어)등이 있다.[1]
6. 1. 일반 상호 ORB 프로토콜 (GIOP, General Inter-ORB Protocol)
GIOP는 객체 요청 브로커(ORB) 간의 통신을 위한 추상 프로토콜이다.[1] 이 프로토콜에 대한 표준은 객체 관리 그룹(OMG)에서 관리하고 있다.[1] GIOP 아키텍처는 몇 가지 실제 프로토콜을 제공한다.[1]프로토콜 | 설명 |
---|---|
IIOP | 인터넷에서 GIOP를 구현한 것으로, GIOP 메시지와 TCP/IP 간의 브리지 역할을 하는 CORBA ORB 간의 통신 프로토콜이다.[1] |
SSL 상호 객체 프로토콜 (SSLIOP) | SSL 상의 IIOP로, 암호화와 인증 기능을 제공한다.[1] |
하이퍼텍스트 상호 객체 프로토콜 (HTIOP) | 하이퍼텍스트 전송 프로토콜 상의 IIOP로, 프록시를 투명하게 우회하는 등의 기능을 가지고 있다.[1] |
기타 | ZIOP 등[1] |
6. 2. 인터넷 상호 ORB 프로토콜 (IIOP, Internet Inter-ORB Protocol)
GIOP의 구현체 중 하나인 인터넷 상호 객체 프로토콜(IIOP)은 인터넷을 통해 사용하기 위한 프로토콜이다. IIOP는 GIOP 메시지와 TCP/IP 계층 간의 매핑을 제공하여, 객체 요청 브로커(ORB) 간의 통신 프로토콜 역할을 수행한다. 즉, IIOP는 CORBA ORB 간 통신에서 GIOP를 인터넷 환경에서 구현한 것이며, GIOP 메시지와 TCP/IP 간의 다리(bridge) 역할을 한다.[1]일반적으로 서버 측에는 포터블 객체 어댑터(POA)가 존재하여 호출을 로컬 서번트로 전달하거나, 부하 분산을 위해 다른 서버로 전송한다.[1]
6. 3. 기타 프로토콜
SSLIOP영어 (SSL Inter-ORB Protocol영어)는 SSL을 통해 보안 통신을 지원하며, HTIOP영어 (HyperText Inter-ORB Protocol영어)는 HTTP를 통한 통신을 지원한다. ZIOP영어 (Zipped IOP영어)는 압축을 통해 대역폭 사용량을 줄이는 기능을 제공한다.[1]분산 컴퓨팅 환경에서 객체 간의 상호 운용성을 위한 표준인 CORBA는 다양한 프로토콜을 지원하는데, 그 중 대표적인 프로토콜은 다음과 같다.
프로토콜 | 설명 |
---|---|
SSLIOP영어 (SSL Inter-ORB Protocol영어) | SSL을 통한 IIOP로, 암호화 및 인증 기능을 제공한다. |
HTIOP영어 (HyperText Inter-ORB Protocol영어) | HTTP를 통한 IIOP로, 투명한 프록시 우회 기능을 제공한다. |
ZIOP영어 (Zipped IOP영어) | 대역폭 사용량을 줄이는 GIOP의 압축 버전이다. |
7. 비판 및 문제점
CORBA는 코드 작성 및 소프트웨어 구축에 기여했지만, 여러 비판을 받았다.[8]
CORBA에 대한 비판은 표준 자체의 결함보다는 부실한 구현에서 비롯된 경우가 많았다. 그러나 표준 자체의 문제점도 있었는데, 이는 CORBA 사양을 만드는 과정과 여러 경쟁적인 구현자들이 참여하여 공동 표준을 작성하는 데 따른 정치적, 사업적 타협 때문이었다.
; 초기 구현 비호환성
: 초기 CORBA 사양은 IDL만 정의하고 전송 중 형식은 정의하지 않았다. 이 때문에 몇 년 동안 소스 코드 호환성이 최선이었다. CORBA 2 이후 이 문제는 해결되었다.
; 위치 투명성
: CORBA의 위치 투명성 개념은 비판을 받았다.[9] 즉, 동일한 주소 공간에서 함수 호출로 접근 가능한 객체와 다른 곳(동일 머신의 다른 프로세스 또는 다른 머신)에 있는 객체를 동일하게 취급한다는 것이다. 이는 근본적인 설계 결함으로,[9] 모든 객체 접근을 가장 복잡한 경우(예: 로컬 호출에서는 불가능한 광범위한 실패가 있는 원격 네트워크 호출)만큼 복잡하게 만들었다. 또한, 두 클래스 간의 차이점을 숨겨 애플리케이션이 적절한 사용 전략을 선택하는 것을 불가능하게 했다(예: 1μs 지연 시간과 보장된 반환이 있는 호출은 1초 지연 시간과 전송 실패 가능성이 있는 호출과는 매우 다르게 사용되며, 이 경우 전달 상태를 알 수 없고 시간 초과까지 30초가 걸릴 수 있다).
; 설계 및 프로세스 결함
: CORBA 표준은 위원회에 의한 설계 과정으로 인해 비난받았다. 상충되는 제안을 중재하거나 문제의 우선 순위를 결정하는 절차가 없었다. 그래서 표준은 모든 제안의 특징을 통합하여 만들어졌고, 그 일관성은 고려되지 않았다.[10] 이 때문에 사양은 복잡하고, 구현 비용이 많이 들고, 모호해졌다.
: 구현 공급업체와 고객이 혼합된 설계 위원회는 다양한 이해 관계를 만들었다. 이러한 다양성은 일관된 표준을 만들기 어렵게 했다. 표준 및 상호 운용성은 경쟁을 증가시키고 고객이 대안 구현 간에 이동하는 것을 용이하게 했다. 이 때문에 위원회 내에서 많은 정치적 다툼이 발생했고, 일부 ORB 구현자가 독점 확장을 사용하지 않으면 사용하기 어렵게 만든 CORBA 표준의 개정판이 자주 출시되었다.[8] 덜 윤리적인 CORBA 공급업체는 고객 종속성을 장려하고 단기적으로 강력한 결과를 얻었다. 시간이 지나면서 이식성을 장려하는 ORB 공급업체가 시장 점유율을 차지했다.
; 구현 문제
: CORBA는 역사적으로 부실한 ORB 구현으로 인해 어려움을 겪었다. CORBA를 표준으로 비판하는 많은 논문은 단순히 나쁜 CORBA ORB 구현에 대한 비판이었다.
: CORBA는 많은 기능을 가진 포괄적인 표준이었다. 일부 구현에서는 모든 사양을 구현하려고 시도했고,[10] 초기 구현은 불완전하거나 부적절했다. 참조 구현을 제공해야 한다는 요구 사항이 없었기 때문에, 구성원들은 유용성 또는 구현 가능성이 테스트되지 않은 기능을 자유롭게 제안할 수 있었다. 구현은 표준의 전반적인 경향으로 인해 더욱 어려움을 겪었으며, 모든 제출된 제안의 합을 채택하는 일반적인 관행으로 인해, 개별 제안이 완벽하게 합리적이라 할지라도 종종 일관성이 없고 사용하기 어려운 API가 생성되었다.
: 과거에는 CORBA의 강력한 구현을 확보하기가 매우 어려웠지만, 현재는 훨씬 쉽게 찾을 수 있다. SUN Java SDK에는 CORBA가 내장되어 있다. 일부 부실하게 설계된 구현은 복잡하고, 느리고, 호환되지 않고, 불완전한 것으로 밝혀졌다. 강력한 상용 버전이 나타나기 시작했지만 상당한 비용이 들었다. 양질의 무료 구현이 제공되면서 부실한 상용 구현은 빠르게 사라졌다.
; 방화벽
: CORBA (더 정확하게는 GIOP)는 특정 통신 전송에 얽매이지 않는다. GIOP의 전문화는 인터넷 Inter-ORB 프로토콜(IIOP)이다. IIOP는 데이터를 전송하기 위해 원시 TCP/IP 연결을 사용한다.
: 클라이언트가 포트 80을 통해 외부로의 HTTP 연결만 허용하는 매우 제한적인 방화벽 또는 투명 프록시 서버 환경 뒤에 있는 경우, 해당 프록시 서버가 HTTP CONNECT 메서드 또는 SOCKS 연결을 허용하지 않으면 통신이 불가능할 수 있었다. 한때, 구현이 단일 표준 포트를 사용하도록 강제하는 것조차 어려웠다. 대신 여러 개의 임의 포트를 선택하는 경향이 있었다. 오늘날까지, 현재의 ORB는 이러한 결함을 가지고 있다. 이러한 어려움으로 인해, 일부 사용자는 CORBA 대신 웹 서비스를 점점 더 많이 사용하고 있다. 이들은 XML/SOAP를 사용하여 포트 80을 통해 통신하며, 이는 일반적으로 HTTP를 통한 웹 브라우징을 위해 조직 내부의 HTTP 프록시를 통해 열어두거나 필터링된다. 그러나 최신 CORBA 구현은 SSL을 지원하며 단일 포트에서 작동하도록 쉽게 구성할 수 있다. TAO, omniORB 및 JacORB와 같은 일부 ORB는 양방향 GIOP도 지원하며, 이는 웹 서비스 구현의 폴링 방식과 달리 CORBA가 콜백 통신을 사용할 수 있다는 이점을 제공한다. 또한, 대부분의 최신 방화벽은 GIOP & IIOP를 지원하므로 CORBA 친화적인 방화벽이다.
8. CORBA 구현체 목록
CORBA 구현체는 상용과 오픈 소스로 나뉜다.
구분 | ORB 이름 | 프로그래밍 언어 | 비고 |
---|---|---|---|
상용 | e\*ORB | Ada, C, C++ | |
인터스테이지(Interstage) | 후지쯔 | ||
ORBLink | Allegro Common LISP | ||
SANKHYA Varadhi | C++ | ||
TPBroker | VisiBroker의 히타치 제작소 개조 버전 | ||
Xtradyne I-DBC | CORBA 보안 구현, by Xtradyne | ||
Systemν[nju:] | 분산 트랜잭션 지원 ORB, 일본 유니시스 | ||
오픈 소스 | GNU Classpath | 자바 | 자유 소프트웨어 구현 (GPL+linking exception, org.omg 패키지 포함) |
Combat | Tcl | C++ ORB의 Tcl 계층 | |
Universe | PHP4 |
8. 1. 상용
다음은 CORBA를 지원하는 상용 ORB(Object Request Broker) 제품들이다.- 오라클 턱시도(Oracle Tuxedo) - CORBA 2.5를 지원하는 상용 ORB (자바, C++용) 오라클(오라클(기업))
- 볼랜드 엔터프라이즈 서버, VisiBroker 에디션 - CORBA 2.6을 지원하는 상용 ORB (자바, C++용) 볼랜드
- Orbacus - 소규모 임베디드 급 C++ ORB (Progress Software사 개발)
- Orbix - 엔터프라이즈 급 ORB (Progress Software사 개발)
- ORB''express'' - Objective Interface Systems사 개발
- J-Integra Espresso - 닷넷 기반의 ORB (Intrinsyc J-Integra사 개발)
8. 2. 오픈 소스
ORB 이름 | 프로그래밍 언어 | 라이선스 | 비고 |
---|---|---|---|
http://phporb.sourceforge.net/ CORBA for PHP | PHP | PHP 허가권 | PHP5용 ORB 구현체 |
http://iiop-net.sourceforge.net/ IIOP.NET | 마이크로소프트 닷넷 | LGPL | ![]() |
http://www.jacorb.org/ JacORB | 자바 | LGPL | |
http://openorb.sourceforge.net/ OpenORB | 자바 | BSD | -- |
http://www.mico.org/ MICO | C++ | LGPL | -- |
http://omniorb.sourceforge.net/ omniORB | C++, 파이썬 | LGPL | ![]() |
http://www.gnome.org/projects/ORBit2/ ORBit2 | C, C++, 파이썬 | LGPL | -- |
http://sf.net/projects/perlorb/ Perl ORB | 펄 | Artistic License | ![]() |
[https://libre2.adacore.com/polyorb/ PolyORB] | 에이다 | MGPL | -- |
상호 언어 통일(ILU) | 제록스 팔로알토 연구소의 오픈 소스 객체 인터페이스 시스템 | ||
IIOP.NET | 마이크로소프트 .NET | LGPL | |
JacORB | 자바 | LGPL | |
MICO | C++ | LGPL | |
omniORB | C++, 파이썬 | LGPL | |
OpenORB | 자바 | BSD | |
ORBit2 | C, C++, 파이썬 | LGPL | |
Perl ORB | 펄 | Artistic License | |
PolyORB | 에이다 | MGPL | |
TAO | C++ | 오픈 소스 | |
VBOrb | 비주얼 베이직 | LGPL |
9. 관련 기술
- 컴포넌트 기반 소프트웨어 공학
- 분산 컴퓨팅
- 이식 가능한 객체
- 서비스 지향 아키텍처(SOA)
- 공통 언어 인프라 - 현재의 .NET 상호 언어, 상호 플랫폼 객체 모델
- 구성 요소 객체 모델(COM) - 마이크로소프트 윈도우 전용 상호 언어 객체 모델
- DCOM (분산 COM) - 네트워크에서 작동하도록 COM을 확장
- Freedesktop.org D-Bus - 현재의 개방형 상호 언어, 상호 플랫폼 객체 모델
- GNOME Bonobo - 사용이 중단된 GNOME 상호 언어 객체 모델
- IBM 시스템 객체 모델 SOM 및 DSOM - OS/2 및 AIX에서 사용되는 IBM의 구성 요소 시스템
- 인터넷 통신 엔진 (ICE)
- Java Platform, Enterprise Edition (Java EE)
- 자바 원격 메서드 호출 (Java RMI)
- JavaBean
- KDE DCOP - 사용이 중단된 KDE 프로세스 간 및 소프트웨어 구성 요소 통신 시스템
- KDE KParts - KDE 구성 요소 프레임워크
- OpenAIR
- 원격 프로시저 호출 (RPC)
- 소프트웨어 통신 아키텍처 (SCA) - 임베디드 시스템용 구성 요소, 상호 언어, 상호 전송, 상호 플랫폼
- Windows Communication Foundation (WCF)
- XPCOM (Cross Platform Component Object Model) - Mozilla Application Suite, SeaMonkey 1.x 등 이를 기반으로 하는 애플리케이션을 위해 Mozilla에서 개발
- 응용 프로그램 바이너리 인터페이스 - ABI
- 응용 프로그래밍 인터페이스 - API
- 호출 규약
- 애플리케이션 가상 머신 비교
- 동적 호출 인터페이스
- 외부 함수 인터페이스
- 언어 바인딩
- 이름 맹글링
- SWIG는 여러 언어에서 여러 언어로의 오픈 소스 자동 인터페이스 바인딩 생성기이다.
CORBA는 프로그램 코드를 해당 기능 및 호출 방식에 대한 정보와 함께 일종의 캡슐화를 수행한다. 이 캡슐화된 객체는 컴퓨터 네트워크를 통해 다른 프로그램 (또는 CORBA 객체)에서 호출할 수 있다.
CORBA는 인터페이스 기술 언어 (IDL)를 사용하여 이러한 객체의 외부 인터페이스를 기술한다. 그리고 IDL에서 다른 특정 구현 언어 (C++나 Java)로의 "매핑"을 수행한다. CORBA로 매핑이 표준적으로 제공되는 것은 Ada, C, C++, LISP, Smalltalk, Java, COBOL, PL/I, Python이다. 표준에 포함되어 있지는 않지만, Perl, PHP, Ruby, Visual Basic, Tcl, Delphi에 대한 매핑을 구현한 객체 요청 중개자가 존재한다.
이 그림은 매우 단순화되어 있다. 일반적으로 서버 측에는 Portable Object Adapter가 있으며, 호출을 로컬 서번트로 전달하거나 (부하 분산을 위해) 다른 서버로 전송한다. 또한 서버 측과 클라이언트 측 모두에 후술할 인터셉터가 존재하는 경우가 많다.
사용자에게 언어 및 플랫폼에 의존하지 않는 원격 프로시저 호출 (RPC) 사양을 제공하는 것 외에도, CORBA는 트랜잭션과 보안에 필요한 일반적인 서비스를 정의하고 있다.
참조
[1]
웹사이트
The Rise and Fall of CORBA
https://cacm.acm.org[...]
[2]
웹사이트
History of CORBA
http://www.omg.org/g[...]
Object Management Group
2017-03-12
[3]
웹사이트
History of CORBA
https://www.corba.or[...]
Object Management Group
2017-06-04
[4]
웹사이트
OMG IDL Corba Version
https://www.omg.org/[...]
Object Management Group
2023-12-04
[5]
웹사이트
The CORBA Component Model
https://www.drdobbs.[...]
Dr. Dobb's Journal
2017-03-13
[6]
웹사이트
ORBexpress: An Overview
https://www.ois.com/[...]
[7]
웹사이트
omniORB: Free CORBA ORB
https://omniorb.sour[...]
2024-10-10
[8]
웹사이트
Trouble with CORBA
https://davidchappel[...]
davidchappel.com
2024-10-10
[9]
간행물
A Note on Distributed Computing
https://sites.cc.gat[...]
2024-10-10
[10]
논문
The Rise and Fall of CORBA
Association for Computing Machinery
2006-06-30
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com