강의의 목적
이 강의를 들은 후에 학생들은
객체 참조자의 구성을 설명할 수 있다.
네이밍 서비스의 개념을 설명할 수 있다.
네이밍 서비스의 복합 객체 이름의 구조를 설명할 수 있다.
네이밍 서비스의 오퍼레이션을 사용할 수 있다.
목차
13.1 Orbix 객체 참조자
13.4 코바 네이밍 서비스
13.4.1용어와 CosNaming 모듈
13.4.2 네이밍 서비스의 객체 이름
13.4.3 네이밍 서비스의 오퍼레이션
13.1 Orbix 객체 참조자
모든 코바 객체는 객체 참조자를 갖는다.
코바에서 객체 참조자의 기능은 표준으로 정하였지만 형태는 표준으로 정하지 않았다.
객체 참조자의 형태의 실제 구현은 벤더 고유의 일이다.
Orbix의 객체 참조자는 다음 필드로 구성된다.
객체의 마커(object marker) : 객체마다 부여되는 고유의 이름으로 Orbix가 할당하거나 사용자가 할당
서버 이름 : putit과 Orbix.impl_is_ready()에서 사용한 이름(예를 들면 "SimpleArraySrv")이다
서버 호스트 : 서버가 수행되는 호스트의 인터넷 주소
객체의 IDL 인터페이스 형 : IDL로 정의한 인터페이스 이름(예로 "Array“)
이 인터페이스의 정의가 저장된 인터페이스 저장소의 서버 이름
일반적으로 Orbix에서 인터페이스 저장소의 서버 이름은 IFR로 설정
인터페이스 저장소의 서버 호스트
인터페이스 저장소의 서버 호스트는 널값을 갖는다.
13.4 코바 네이밍 서비스
_bind() 메소드는 물리적인 정보위치 투명성을 제공하지 못하며 다른 ORB 간에 호환이 되지 않는다.
네이밍 서비스는 코바서비스의 하나로 간단하지만 매우 유용한 서비스이다.
네이밍 서비스에서 논리적인 객체의 이름으로 객체 참조자를 찾게 된다.
네이밍 서비스의 객체 이름은 앞에서 나온 마커와는 구별된다.
마커는 각 객체마다 주어진 고유의 이름이지만 객체 참조자를 구성하는 한 요소이고 마커만을 가지고 객체 참조자를 얻을 수 없다.
서버는 자신이 소유하는 객체 참조자에 이름을 부여하여 네이밍 서비스에 등록할 수 있다.
시스템의 다른 요소(예를 들면 클라이언트)는 이 이름을 사용하여 객체 참조자를 얻을 수 있다.
13.4.1 용어와 CosNaming 모듈
네이밍 서비스는 객체 이름과 객체 참조자 사이의 바인딩(binding) 데이터베이스를 관리한다.
바인딩은 객체 이름과 객체 참조자의 연결이다.
네이밍 서비스가 제공하는 오퍼레이션에는 다음과 같은 것이 있다.
새로운 바인딩 생성
기존 바인딩을 삭제
바인딩된 이름의 리스트 출력
이름으로 객체 참조자를 탐색
네이밍 서비스가 제공하는 인터페이스는 IDL module CosNaming에 정의되어 있다.
13.4.2 네이밍 서비스의 객체 이름
네이밍 서비스에서 사용하는 객체 이름은 트리 구조를 형성
네이밍 서비스의 복합 구조의 객체 이름
네이밍 서비스에서 복합 객체 이름은 한 개 이상의 네이밍 컨텍스트와 한 개의 객체 이름으로 구성되어 있다.
네이밍 컨텍스트 : 파일 구조의 폴더에 해당
객체 이름 : 파일 구조의 파일명에 해당
네임 컴포넌트로 구성된 IDL sequence 형태를 취하게 된다.
파일 구조의 \나 /를 사용하지 않는다.
sequence를 구성하는 네임 컴포넌트는 한 개의 문자열이 아니고 두 개의 문자열을 가진 구조체인 NameComponent로 정의한다.
typedef string Istring;
struct NameComponent {
Istring id; // 진짜 이름(네이밍 컨텍스트 또는 객체 이름)을 나타낸다.
Istring kind; //다양하게 사용 가능, 코바 3에서 재정의하였다 };
typedef sequence<NameComponent> Name;
복합 객체 이름의 예
그림에서 검정 원(●)으로 표시된 것이 네이밍 컨텍스트
하얀 원(○)으로 표시된 것이 객체 이름이다.
13.4.3 네이밍 서비스의 오퍼레이션
IDL 인터페이스인 NamingContext는 네이밍 서비스의 핵심 부분을 정의한다.
최초의 네이밍 컨텍스트 얻기
네이밍 서비스를 사용하기 위해서 첫 번째 할 일
문자열 "NameService"를 아래의 함수에 매개 변수로 전달
Object_ptr resolve_initial_references (const char* identifier)
이 최초의 네이밍 컨텍스트는 파일 시스템의 루트와 같다.
위 함수의 반환 값인 객체 참조자를 축소
CosNaming::NamingContext::_narrow()를 사용
네이밍 컨텍스트의 참조자가 반환됨
CosNaming::NamingContext_var initContext;
CosNaming::Name_var aName;
CORBA::Object_var objVar;
try { // 최초의 네이밍 컨텍스트를 얻는다.
objVar = CORBA::Orbix.resolve_initial_references("NameService");
initContext = CosNaming::NamingContext::_narrow(objVar);
네이밍 서비스의 오퍼레이션의 요약
네이밍 컨텍스트의 인터페이스가 제공하는 오퍼레이션
이름으로 객체 참조자를 찾아낸다.
객체 참조자에 이름을 바인드한다.
바인딩을 삭제/교체한다.
네이밍 컨텍스트 안에 있는 이름을 리스팅한다.
(1) 객체 참조자 얻기
객체 참조자 얻기는 객체 참조자를 알기 위해 이름을 네이밍 서비스의 데이터베이스에서 찾는 일이다.
resolve()
Object resolve(in Name aName) raises (NotFound, CannotProceed, InvalidName);
resolve() 오퍼레이션의 매개 변수는 NameComponent로 구성된 sequence인 aName이다. 대상 네이밍 컨텍스트 밑에서 서술된 이름의 첫 번째 컴포넌트를 찾는 것을 시작으로 그 다음 컴포넌트를 계속 트리 하부 구조로 찾아가서 마지막 컴포넌트가 객체 이름이 된다.
매개 변수 aName에 앞에 절의 표 13.1에 있는 것처럼 id로 company, engineering, MyArray가 순서대로 들어있다고 가정하자. 그리고 다음 문장을 수행한다.
objVar = initContext->resolve(aName);
initContext가 가리키는 네이밍 컨텍스트를 기준으로 해서 그 밑에 이미 만들어진 네이밍 컨텍스트 company와 engineering을 계층적으로 찾아서 객체 이름 MyArray를 발견하여 이 객체에 바인드된 객체 참조자를 반환한다.
객체 참조자 얻기 …
resolve() 오퍼레이션의 반환형은 IDL 객체 Object인데 C++의 CORBA::Object_ptr 형으로 반환된다.
반환 값을 사용하기 전에 Array::_narrow() 함수를 사용하여 축소해야 한다. 위의 objVar를 축소하면 다음과 같다.
ArrayVar = Array->_narrow(objVar);
(2) 바인딩
바인딩은 객체 이름과 객체 참조자를 연결시키는 작업이다.
바인딩의 종류
바인딩의 대상이 일반 객체와 네이밍 컨텍스트 두 가지이다.
일반 객체는 특정한 네이밍 컨텍스트 밑에 바인딩되므로 먼저 네이밍 컨텍스트 객체가 바인딩되어 있어야 한다.
후에 객체가 이 네이밍 컨텍스트 밑에 바인딩될 수 있다.
두 개의 바인딩 종류는 다음 IDL 형으로 정의된다.
// In IDL module CosNaming
enum BindingType { nobject, ncontext };
struct Binding {
Name binding_name;
BindingType binding_type;
} ;
파일 시스템에서 파일 이름이 가장 마지막에 나오고 나머지는 폴더 이름인 것처럼 nobject 형의 바인딩은 복합 이름의 마지막 부분에만 사용되고 나머지는 전부 ncontext 형이다.
bind()
void bind(in Name aName, in Object objRef)
raises (Notfound, CannotProceed, InvalidName, AlreadyBound);
bind() 오퍼레이션은 파일 시스템에서 폴더 밑에 파일을 만드는 것과 같다.
bind() 오퍼레이션은 대상 네이밍 컨텍스트를 기준으로 이름(aName)과 객체(objRef) 간에 바인딩을 생성한다.
bind()에 전달된 이름이 복합 이름이면 마지막 이름을 제외한 이름들은 대상 네이밍 컨텍스트 밑에 존재하는 계층적인 네이밍 컨텍스트를 순서대로 찾는데 사용하고 마지막 이름을 마지막 네이밍 컨텍스트에 등록한다.
bind()를 그래프로 설명하면 그래프에 기존에 존재하던 검정 원을 따라오다 새로운 하얀 원을 생성하며 여기에 객체가 바인딩된다.
지정된 이름이 이미 마지막 네이밍 컨텍스트에 있는 다른 객체에 바인딩되어 있으면 예외사항이 발생한다.
bind_context()
void bind_context(in Name aName, in NamingContext nc) raises (Notfound, CannotProceed, InvalidName, AlreadyBound);
bind_context() 오퍼레이션은 파일 시스템에서 폴더를 만드는 것과 같다.
객체 이름이 네이밍 컨텍스트 하에 등록되어 있으므로 네이밍 컨텍스트가 어떤 이름에 먼저 바인딩되어 있어야 한다.
bind_context() 오퍼레이션은 대상 네이밍 컨텍스트를 기준으로 이름(aName)과 지정된 네이밍 컨텍스트(nc) 간에 바인딩을 생성한다.
매개 변수 aName에 지정된 이름이 복합 이름이면 마지막 이름을 제외한 나머지 이름들은 기존에 있는 네이밍 컨텍스트의 이름이어야 한다.
매개 변수 nc는 다음에 설명하는 new_context() 오퍼레이션으로 생성된 네이밍 컨텍스트 객체이다.
bind_context()를 그래프로 설명하면 그래프에 기존에 존재하던 검정 원을 따라오다 새로운 검정 원을 생성하며 여기에 네이밍 컨텍스트가 바인딩된다.
bind_context()를 사용하여 만든 네이밍 그래프에서 같은 이름을 가진 네이밍 컨텍스트가 서로 다른 네이밍 컨텍스트 밑에 등록될 수 있다.
rebind()
void rebind(in Name aName, in Object objRef) raises (Notfound, CannotProceed, InvalidName);
rebind() 오퍼레이션은 대상 네이밍 컨텍스트를 기준으로 다른 객체에 이미 바인딩된 이름(aName)을 새로운 객체(objRef)에 바인딩한다.
기존의 바인딩은 삭제되고 새로운 바인딩이 그 자리에 생성된다.
bind() 경우와 마찬가지로 이름이 복합 이름이면 마지막 이름을 제외한 이름들은 이미 존재하는 계층적인 네이밍 컨텍스트이다.
rebind()는 네이밍 컨텍스트 그래프의 모양과 각 객체 이름은 그대로 유지하면서 단지 한 객체 이름(하얀 원)에 바인딩된 객체를 다른 것으로 변경하는 것이다.
rebind_context()
void rebind_context(in Name aName, in NamingContext nc) raises (Notfound, CannotProceed, InvalidName);
rebind_context() 오퍼레이션은 대상 네이밍 컨텍스트를 기준으로 지정된 네이밍 컨텍스트에 이미 바인드된 이름(aName)을 새로운 네이밍 컨텍스트(nc)에 바인딩한다.
기존의 바인딩은 삭제되고 새로운 바인딩이 그 자리에 생성된다.
bind_context() 경우와 마찬가지로 이름이 복합 이름이면 마지막 이름을 제외한 이름들은 이미 존재하는 계층적인 네이밍 컨텍스트이다.
rebind_context()는 네이밍 컨텍스트 그래프의 모양과 각 네이밍 컨텍스트 이름은 그대로 유지하면서 단지 한 네이밍 컨텍스트 이름(검정 원)에 바인딩된 네이밍 컨텍스트를 다른 것으로 변경하는 것이다.
(3) 바인딩 삭제하기
unbind()
void unbind(in Name aName) raises (Notfound, CannotProceed, InvalidName);
unbind() 오퍼레이션은 대상 네이밍 컨텍스트를 기준으로 지정된 이름(aName)과 그것에 바인딩되었던 객체와의 바인딩을 삭제한다.
그래프에서 하얀 원이 하나 없어진다.
(4) 네이밍 컨텍스트 생성
네이밍 컨텍스트를 생성하는 두 개의 오퍼레이션이 있다.
new_context()
NamingContext new_context()
new_context() 오퍼레이션은 새로운 네이밍 컨텍스트 객체를 생성한다.
아직 이 객체는 어떤 이름에 바인딩된 것은 아닌데 바인딩하려면 bind_context()나 rebind_context() 오퍼레이션을 사용한다.
bind_new_context()
NamingContext bind_new_context(in Name aName) raises (Notfound, CannotProceed, InvalidName, AlreadyBound);
bind_new_context() 오퍼레이션은 새로운 네이밍 컨텍스트 객체를 생성하고 지정된 이름(aName)을 사용하여 바인딩한다.
bind_new_context() 오퍼레이션은 new_context()를 호출한 후 bind_context()를 호출하는 것과 동일한 일을 한다.
(5) 네이밍 컨텍스트 제거
destroy()
void destroy() raises (Notempty);
destroy() 오퍼레이션은 호출된 대상 네이밍 컨텍스트를 삭제한다.
(6) 네이밍 컨텍스트 리스팅하기
list() 오퍼레이션이 네이밍 컨텍스트를 리스트한다.
아래 정의된 BindingList는 sequence로 앞의 "바인딩의 종류"에서 소개된, 바인딩의 이름과 종류(객체 또는 네이밍 컨텍스트)를 멤버로 가진 struct Binding으로 구성된다.
출력되는 네이밍 컨텍스트 리스트가 BindingList 형에 보관된다.
// In IDL module CosNaming
typedef sequence<Binding> BindingList;
interface BindingIterator;
interface NamingContext
/* 나머지는 생략 */
void list(in unsigned long how_many, out BindingList bl, out BindingIterator bi);
} ;
매개 변수 how_many는 매개 변수 bl에 반환될 최대의 바인딩 개수를 의미한다.
매개 변수 bl에 반환되는 네이밍 컨텍스트의 이름과 종류가 표시된다.
만약 반환되는 네이밍 컨텍스트가 요청된 개수(how_many)보다 많으면 나머지 네이밍 컨텍스트는 BindingIterator 형인 bi에 반환된다. 반환되는 네이밍 컨텍스트 개수가 how_many 보다 적으면 bi는 nil 객체 참조자가 된다.
초과분(how_many보다 많은) 네이밍 컨텍스트 출력하기
list() 오퍼레이션을 수행할 때 클라이언트가 요구하는 이상(how_many)의 네이밍 컨텍스트가 있으면 나머지는 매개 변수에 지정된 BindingIterator 자료형 bi에 들어간다.
bi가 나머지 네이밍 컨텍스트를 참조하는 데 사용된다.
관련된 IDL 정의는 다음과 같다.
// In IDL module CosNaming
enum BindingType { nobject, ncontext };
struct Binding {
Name binding_name;
BindingType binding_type;
} ;
typedef sequence<Binding> BindingList;
interface BindingIterator {
boolean next_one(out Binding b);
boolean next_n(in unsigned long how_many, out BindingList b1);
void destroy();
} ;
초과분(how_many보다 많은) 네이밍 컨텍스트 출력하기 …
오퍼레이션 next_one()과 next_n()은 모두 list() 오퍼레이션의 out 매개 변수인 BindingIterator형 bi를 대상으로 한다.
next_one()은 바인딩을 한 개씩 참조할 때 사용한다.
next_n() 오퍼레이션은 한번에 최대 how_many개씩 바인딩을 참조하고자 할 때 사용한다.
next_n()은 남아 있는 바인딩이 how_many 보다 적으면 남은 개수만 반환한다.
바인딩은 최대 한번씩 참조되므로 두 개의 오퍼레이션을 반복적으로 호출하면 모든 바인딩을 전부 참조할 수 있다.
두 오퍼레이션 모두 바인딩을 참조하면 논리 값 참이 반환되고 참조할 바인딩이 더 이상 없으면 논리 값 거짓이 반환된다.
다음 코드에서 bIter은 BindingIterator의 객체이며 이 코드 수행 후 BindingList 객체 bList에 size 개수 만큼의 네이밍 컨텍스트가 반환된다.
bIter->next_n(size, bList);
요약
객체 참조자를 얻는 방법
_bind()
_bind()는 처음에 사용하기는 쉬우나 위치 투명성을 제공하지 못하며 코바 표준이 아니다.
네이밍 서비스
네이밍 서비스는 코바의 표준
객체 이름과 객체 참조자의 바인딩을 유지하여 객체 이름으로 객체 참조자를 얻게 한다.
위치 투명성을 제공하여 코바를 코바답게 만드는 서비스이다.
가장 일반적인 네이밍 서비스의 오퍼레이션 사용 시나리오
① 네이밍 컨텍스트를 생성하고 바인딩한다. 방법은 new_context()로 네이밍 컨텍스트를 생성하고 bind_context()로 바인딩한다. 다른 방법은 bind_new_context()로 생성과 바인딩을 동시에 수행한다.
② 객체를 bind()로 원하는 네이밍 컨텍스트 밑에 바인딩한다.
③ 객체 참조자를 resolve()로 얻는다.
'PPT' 카테고리의 다른 글
Order Ordinary Differential Equation 2계선형미분방정식 (0) | 2014.07.21 |
---|---|
인터넷 서비스-클라이언트/서버 모델이란,Telnet텔넷,Usenet,FTP란 (0) | 2014.07.04 |
배달 시스템 모델링을 통 한 수익 예상 (0) | 2014.06.25 |
DISCO (0) | 2014.06.22 |
한국의 현대 디자이너 (0) | 2014.05.20 |