• 검색 결과가 없습니다.

프록시 클라이 객체

문서에서 Object Request Broker (페이지 81-97)

언트 스텁 컴포넌트

보안

제공자 DCE RPC 프로토콜 스택

보안

제공자 DCE RPC 프로토콜 스택

DCOM

DCOM 네트웍네트웍 프로토콜프로토콜

OLE 32

SCM SCM

CoCreateInstance CoCreateInstance

((원격원격) ) 활성화활성화

CoCreateInstance CoCreateInstance

CORBA 의 전체 구조

ORB

기본 프로 그래밍 구조

원격 구조 클라이언트

CORBA 라이 브러리 클라이언트

스텁 ( 프록시 ) ORS(s) (orbixd) 와 구현 저장소

TCP TCP 소켓소켓

ORB

ORB

ORB

ORB

객체객체

서버

객체 스켈레톤

객체 어댑터(CORBA lib)

와이어 프로토콜

구조

클라이언트 컴퓨터

클라이언트 컴퓨터 서버 컴퓨터서버 컴퓨터

ORB

기본 프로 그래밍 구조

원격 구조

DCOM 의 전체 구조

클라이언트

COM 라이 브러리 객체

프록시

인터

프록시 SCM(s)

레지스트리

SCM 레지스트리

SCM 레지스트리

RPC RPC 채널채널

OXIDOXID

리졸버리졸버 OXIDOXID 리졸버리졸버

OXIDOXID 리졸버리졸버

OXIDOXID 객체객체

Ping client Ping server

인터 스텁

객체 스텁 클래스 팩토리

객체객체 서버

와이어 프로토콜

구조

클라이언트 컴퓨터

클라이언트 컴퓨터 서버 컴퓨터서버 컴퓨터

객체 익스포트

상위 계층

ORB

• 기본 프로그래밍 구조 – 프로그래머의 관점

• 차이점

– 클라이언트의 객체를 요청과 메소드 호출 방법 – 서버의 객체 생성과 초기화 방법

상위 계층 ( 계속… )

ORB

DCOM

– 클라이언트는 COM 라이브러리의 CoCreateInstance() 를 호출한다 . – COM 의 하부조직은 객체 서버를 시작한다 .

– 서버는 지원되는 모든 CLSID 마다 클래스 팩토리를 생성하고 등록한다 . 서버블럭은 더 이 상 필요없다는 신호가 올 때까지 기다린다 . 클라이언트로부터 들어오는 요청은 다른 쓰레 드가 처리한다 .

– COM 은 클래스 팩토리 포인터를 얻어 , CreateInstance() 를 호출한다 .

– CreateInstance() 에서 서버는 객체를 생성하고 , 인터페이스 포인터를 얻기위해 QueryInterface()를 호출한다 .

– COM 은 인터페이스 포인터를 클라이언트에게 되돌려준다 .

상위 계층 ( 계속… )

ORB

CORBA

– 클라이언트는 클라이언트 스텁의 정적 함수 ::bind() 를 호출한다 . – ORB 는 지원하는 객체를 포함하는 서버를 시작힌다 .

– 서버는 지원되는 모든 객체를 초기 활성화 시킨다 . ( 각 생성자에서 객체 레퍼런스를 생성하 고 등록될 수 있게 호출된다 .)

– 서버는 CORBA::BOA::implisready() 를 호출해 ORB 에게 클라이언트 요청을 받을 수 있다 는 것을 알린다 .

– ORB 는 객체 레퍼런스를 클라이언트에게 돌려준다 .

중간 계층

ORB

• 원격 구조

– 클라이언트와 서버가 마치 같은 주소 공간에 위치한 것처럼 보이게 하는 하부구조

• 차이점

– 서버객체 등록 방법

– 프록시 / 스텁 / 스켈레톤 인스턴스 생성 시점

중간 계층 ( 계속… )

ORB

DCOM

– CoCreateInstance() 를 호출을 받으면 COM 라이브러리는 SCM(Service Control Manager) 으로 넘긴다 .

– SCM 은 클래스 팩토리가 등록되어있는지 확인한다 . 등록돼 있지 않으면 SCM 은 레지스 트리를 뒤져서 해당 클래스의 서버 경로 이름을 찾아 서버를 활성화 한다 .

– 서버는 클래스 객체 테이블에 있는 모든 지원되는 클래스 팩토리를 등록한다 . – SCM 은 테이블에서 포인터를 얻고 , 그 클래스의 CreateInstance() 를 호출한다 .

– CreateInstance() 가 포인터를 돌려주면 , COM 은 새로 생성되는 객체 인스턴스를 위한 스텁 을 만든다 .

중간 계층 ( 계속… )

ORB

DCOM

– 객체 스텁은 인터페이스 포인터를 마샬링하고 레지스트리를 탐색해 인터페이스 스텁을 만 들고 , 서버객체의 실제 인터페이스와 연결한다 .

– SCM 이 마샬링된 포인터를 클라이언트쪽으로 보내면 , COM 은 그 객체 인스턴스를 위한 객체 프록시를 만든다 .

– 객체 프록시는 포인터를 언마샬링하고 레지스트리를 살펴 인터페이스 포록시를 만들고 스 텁에 연결돼 있는 RPC 채널객체에 연결한다 .

– COM 라이브러리는 클라이언트로 인터페이스 포록시에 대한 포인터를 돌려준다 .

중간 계층 ( 계속… )

ORB

CORBA

– ::bind() 호출을 받으면 , 클라이언트 스텁은 작업을 ORB 에 위임한다 . – ORB 는 구현 저장소에 서버경로 이름을 묻고 , 서버를 활성화한다 .

– 서버는 지원되는 모든 객체를 초기에 활성화한다 . CORBA::Object 의 생성자는 유일한 레퍼 런스 ID 로 BOS::create() 를 호출해 객체 레퍼런스를 얻는다 . 그 다음 obj_is_ready() 를 호 출해 객체 레퍼런스를 등록한다 .

– 클래스의 생성자는 스켈레톤 클래스의 인스턴스를 생성한다 .

– ORB 가 객체 레퍼런스를 클라이언트쪽에 보내면 , ORB 는 프록시 클래스의 인터페이스를 생성하고 해당 객체 레퍼런스와 함께 프록시 객체 테이블에 등록한다 .

– 클라이언트 스텁은 클라이언트에 객체 레퍼런스를 돌려준다 .

하위 계층

ORB

• 와이어 프로토콜 구조

– 서버와 클라이언트가 서로 다른 컴퓨터에 위치하고 있을 경우를 지원

• CORBA

– ORB 간의 통신은 전적으로 구현한 업체에 달려있다 .

• GIOP ( 다른 업체의 ORB 통신을 위해 )

• IIOP (TCP/IP 연결 지원 )

하위 계층 ( 계속… )

ORB

• DOCM

– OXID 객체

• IRemUnknowm 인터메이스 지원 – RemQueryInterface()

– RemAddRef() – RemRelease()

• 같은 객체 익스포터로 가는 여러 개의 원격 Iunknown 메소드 호 출을 묶어주어 성능 개선

– DCE RPC 명세에 기준

• IRemUnknown 친터페이스 , Pinging 프로토콜 추가

하위 계층 ( 계속… )

ORB

• 차이점

– 원격 인터페이스 포인터나 객체 레퍼런스가 서버측의 정보를 클라이 언트에게 전달하는 방법

– 다양한 환경에서의 전송을 위해 자료가 마샬링된 표준 포맷

하위 계층 ( 계속… )

ORB

DCOM

– 위임된 CoCreateInstance() 요청을 받았을 때 , 클라이언트측의 SCM 이 레지스트리를 찾아 그리드 객체가 다른 컴퓨터 상의 서버에 있으면 IRemoteActivation RPC 인터페이스의 메 소드를 호출한다 .

– 서버측의 SCM 이 서버를 활성화 시키면 객체의 익스포터와 연결되고 , OXID 를 받는다 . 서버에 접근하기 위한 RPC 바인딩과 OXID 사이의 맵핑은 서버측의 OXID 리졸버를 통 해 등록된다 .

– CreateInstance() 가 돌려주는 포인터를 객체스텁이 마샬링할 때 , 포인터는 서버에서 유일한 인터페이스 포인터 지시자 (IPID) 가 할당된다 . 또 포인터를 나타내는 객체 레퍼런스가 생 성된다 . 객체 레퍼런스에는 IPID, OXID, 프로토콜당 하나의 OXID 리졸버주소 등의 내용 이 담겨 있다 .

하위 계층 ( 계속… )

ORB

DCOM

– 서버측의 SCM 이나 클라이언트 측의 SCM 을 통해 마샬링된 인터페이스 포인터가 돌아오 면 , 객체 프록시는 객체 레퍼런그에서 OXID 와 OXID 리졸버 주소를 추출하고 지역 OXID리졸버의 IOXIDResolve::ResolveOxid() 메소드를 호출한다 .

– 클라이언트측 OXID 리졸버는 OXID 의 캐싱된 맵핑이 있는지 알아보고 , 없다면 서버측 OXID리졸버의 IOXIDresolve::ResolveOxid() 메소드를 호출한다 . 이 메소드는 등록된 RPC 바인딩을 되돌려준다 .

– 클라이언트측 리졸버는 맵핑을 캐시하고 객체 프록시에 RPC 바인딩을 돌려준다 . 이렇게 하면 객체 프록시는 자신과 새로 생성된 인터페이스 프록시들을 객체 인터페이스에 연결된 RPC 채널이 연결한다 .

하위 계층 ( 계속… )

ORB

CORBA

– 위임된 ::bind() 요청이 들어오면 , 클라이언트측 ORB 는 지원하는 서버 기계를 위치 파일 에 물어 찾는다 . 그 다음 TCP/IP 를 통해 서버측 ORB 에 요청을 전달한다 .

– 서버측의 ORB 가 서버를 활성화 시키면 , 객체는 서버에 의해 활성화 되고 ,

COEBA::Object 생성자가 호출된다 . 그 다음 BOA::Create() 안에서 BOA 는 단말 소켓을 만들고 , 객체는 객체 ID 를 얻는다 . 그리고 인터페이스와 구현 이름 , 레퍼런스 ID, 단말 주소를 갖는 객체 레퍼런스도 만들어진다 . IIOP 프로토콜을 알고 있는 클라이언트를 위해 서버는 기계의 이름 , TCP/IP 포트번호 , object_key 를 포함하는 상호 작동 가능한 객체 레퍼 런스를 만든다 . BOA 는 ORB 에 객체 레퍼런스를 등록한다 .

– 객체 레퍼런스가 클라이언트측으로 돌아오면 , 프록시는 단말 주소를 찾아내 서버에 소켓 연결을 한다 .

문서에서 Object Request Broker (페이지 81-97)

관련 문서