CORBA로 이해하는 이기종 분산 객체 통신
CORBA의 ORB·IDL·IIOP·POA 구조와 호출 방식, 표준 서비스 및 현대적 대안 기술을 정리한 분산 객체 미들웨어 가이드
2026-08-14 · 최초 발행 2026-01-12
이기종 객체 호출을 연결한 CORBA
CORBA(Common Object Request Broker Architecture)는 OMG(Object Management Group)가 제정한 분산 객체 컴퓨팅 표준이다. 서로 다른 프로그래밍 언어, OS, 하드웨어에서 구현된 애플리케이션이 네트워크를 넘어 객체를 호출하도록 만드는 미들웨어 아키텍처다.
분산 컴퓨팅 환경에서는 시스템 통합이 필요하고, 객체지향 패러다임을 네트워크 환경까지 확장해야 한다. CORBA는 이 요구를 ORB(Object Request Broker)의 요청 중개와 언어·플랫폼 독립적 인터페이스 정의로 다룬다.
클라이언트와 서버 사이의 ORB 구조
클라이언트는 IDL Stub 또는 동적 호출 인터페이스를 통해 요청을 만들고, ORB는 이를 서버 측 Skeleton 또는 동적 Skeleton으로 전달한다. Object Adapter인 POA는 요청을 실제 Server Object에 연결한다.
| 구성요소 | 역할 |
|---|---|
| ORB | 객체 요청을 중개하고 위치 투명성을 제공 |
| IDL | 인터페이스를 정의하는 언어 |
| Stub | 클라이언트 측 프록시 |
| Skeleton | 서버 측 요청 처리 |
| POA | 객체 생명주기 관리 |
| IIOP | 인터넷 상호운용 프로토콜 |
IDL로 인터페이스를 먼저 고정한다
IDL(Interface Definition Language)은 서비스 인터페이스를 언어에 종속되지 않게 기술하는 명세 언어다. IDL 정의는 각 프로그래밍 언어로 매핑되며, 그 결과로 클라이언트 Stub과 서버 Skeleton을 만들 수 있다.
module Banking {
interface Account {
readonly attribute string accountNumber;
readonly attribute float balance;
exception InsufficientFunds {
float currentBalance;
};
void deposit(in float amount);
void withdraw(in float amount) raises (InsufficientFunds);
float getBalance();
};
interface Bank {
Account createAccount(in string name);
Account findAccount(in string accountNumber);
};
};
| 언어 | 표준 매핑 | 특징 |
|---|---|---|
| C++ | 표준 | 성능 중시 |
| Java | 표준 | 플랫폼 독립성 |
| Python | 표준 | 스크립팅 |
| COBOL | 표준 | 레거시 통합 |
| Ada | 표준 | 항공우주 |
ORB가 요청을 전달하는 방식
ORB는 클라이언트 요청을 적절한 서버로 전달하고, 객체의 물리적 위치와 무관하게 접근할 수 있도록 한다. 이 과정에서 데이터의 직렬화와 역직렬화를 수행하며 인증과 암호화도 지원한다.
GIOP 메시지와 IIOP 전송
GIOP(General Inter-ORB Protocol)는 ORB 간 통신을 위한 일반 프로토콜로, 메시지 형식·데이터 표현·전송 규약을 규정한다. IIOP(Internet Inter-ORB Protocol)는 TCP/IP 위에서 GIOP를 구현하며, 인터넷 환경의 ORB 상호운용에 사용된다. 기본 포트는 표준 683번이다.
| 메시지 | 방향 | 용도 |
|---|---|---|
| Request | 클라이언트→서버 | 메서드 호출 |
| Reply | 서버→클라이언트 | 호출 결과 |
| CancelRequest | 클라이언트→서버 | 요청 취소 |
| LocateRequest | 클라이언트→서버 | 객체 위치 확인 |
| LocateReply | 서버→클라이언트 | 위치 응답 |
POA가 객체 참조와 서번트를 연결한다
POA(Portable Object Adapter)는 객체 참조와 서번트의 매핑을 관리한다. 객체 활성화와 비활성화, 정책 설정을 담당하며, 이전에는 BOA(Basic Object Adapter)가 사용됐다.
객체 호출 외에 제공하는 표준 서비스
CORBA는 객체 호출만 정의하지 않는다. 이름으로 객체를 등록하고 조회하는 기능부터 속성 기반 검색, 비동기 이벤트, 분산 트랜잭션, 인증·권한·암호화, 동시성 제어까지 표준 서비스로 제공한다.
| 서비스 | 기능 |
|---|---|
| Naming Service | 객체 이름 등록/조회 |
| Trading Service | 속성 기반 서비스 검색 |
| Event Service | 비동기 이벤트 전달 |
| Transaction Service | 분산 트랜잭션 관리 |
| Security Service | 인증, 권한, 암호화 |
| Notification Service | 향상된 이벤트 서비스 |
| Concurrency Service | 동시성 제어 |
Naming Service는 계층적 Context 아래에 객체 이름을 배치할 수 있다.
정적 호출과 동적 호출의 차이
정적 호출은 컴파일 시점에 Stub과 Skeleton을 생성하는 방식이다. 타입 안전성과 성능을 얻는 대신 유연성은 부족하다.
동적 호출에서는 DII(Dynamic Invocation Interface)가 런타임의 인터페이스 탐색과 호출을 맡고, DSI(Dynamic Skeleton Interface)는 런타임 요청을 처리한다. IR(Interface Repository)은 인터페이스 메타정보 저장소다.
다른 원격 호출 기술과의 위치
| 항목 | CORBA | RMI | Web Services | gRPC |
|---|---|---|---|---|
| 표준 | OMG | Java | W3C | |
| 언어 | 다중 | Java | 다중 | 다중 |
| 프로토콜 | IIOP | JRMP | HTTP/SOAP | HTTP/2 |
| 데이터 형식 | CDR | Java 직렬화 | XML | Protocol Buffers |
| 복잡성 | 높음 | 중간 | 중간 | 낮음 |
| 현재 활용 | 레거시 | 제한적 | 감소 | 증가 |
CORBA는 언어와 플랫폼이 다른 시스템을 통합하고, 잘 정의된 스펙과 트랜잭션·보안·이벤트 서비스를 제공한다. 반면 학습 곡선이 가파르고 IIOP 포트는 방화벽 제약을 받을 수 있으며 오버헤드가 발생한다. 웹 서비스와 REST에 밀리면서 생태계도 위축됐다.
새 프로젝트에서는 gRPC, REST API, GraphQL, Apache Thrift가 대안으로 선택된다. 다만 CORBA는 금융·통신·국방 등 미션 크리티컬 시스템에서 레거시로 운영되고 있으며, 분산 객체 컴퓨팅의 개념적 토대를 마련한 기술이다.