:: 참조문서 ::
http://docs.google.com/Doc?docid=0AUlUhxYWZkIKZGZwNGRnMmdfN2NkcnE1cGRz&hl=en★ SOA(Service Oriented Architecture)
SOA는 '서비스'와 '이를 조합하여 하나의 애플리케이션을 구축하는 것'이라고 볼수 있다. 웹서비스 기반의 SOA와는 다르게 OSGi는 현재로서는 하나의 JVM 인스턴스(한 대의 컴퓨터)안에서 구성한는 Java Object based SOA라고 볼 수 있다.
그림1. SOA 아키텍처
그림1과 같은 SOA구조를 Publish, Find & Bind 모델이라고도 하며 OSGi도 이 모델을 따르고 있다.
★ OSGi에서의서비스
OSGi에서는 이렇게 만들어진 서비스를 서비스 레지스트리라고 하는 곳에 등록함으로써 서로 다른 번들 간에 서비스를 이용할 수 있다. 여기서 서비스 레지스트리(Service Registry)는 서비스 중계자의 역할을 한다.★ OSGi 서비스 등록과 해지
번들 컨텍스트 개체에는 다음과 같은 두가지 메소드가 있다.1. public ServiceRegistration registerService(String clazz, Object service, Dictionary properties);
2. public ServiceRegistration registerService(String[] clazzes, Object service, Dictionary
properties);
위의 메소드를 통해 STARTING, ACTIVE, STOPPING 단계 중 아무 때나 서비스를 등록할 수 있다.
(STOPPING 단계에서 번들이 중단되면 자동으로 서비스가 해지되기 떄문에 별 의미가 없다.)
서비스 등록시에 필요한 3가지 인자
- 해당 서비스 객체의 인터페이스
- 인터페이스 구현 객체
- 서비스 속성 Dictionary
3번째 인자인 Dictionary는 키/값의 쌍으로 된 컬렉션 개체를 지정한다. 모든 서비스는 service.id라는 값을 가지며 이 값은 프레임워크에 의해 자동으로 지정되어 변경될 수 없다.
서비스를 등록하면 각 서비스당 하나의 ServiceRegistration 객체를 가지며 이 객체는 등록된 서비스와 직접적으로 연결되는 인터페이스로 서비스에 대한 접근자인 serviceReference를 읽어오거나, Service의 등록을 해지할 때 사용된다. 여기서 주의 할것은 서비스 해지는 반드시 serviceReference를 통해서만 가능하다는 것이다. (이것은 서비스를 등록한 번들만이 해지할 수 있게 하기 위해서 이다.)
★ OSGi 서비스 사용하기
등록된 서비스는 serviceReference라는 객체로 참조된다. 이 객체는 서비스의 속성정보나 등록한 번들에 대한 객체, 사용 중인 번들의 정보를 읽어올 뿐 서비스객체는 얻어오지 못하지만, 아래 메소드를 이용하면 실제 서비스 객체를 얻어올 수 있다.BundleContext객체의 getService() 함수
이와같이 번들컨텍스트를 통하여 서비스 객체를 얻는 이유는 프레임워크가 실제로 서비스를 사용 중인 객체에 대한 의존성 정보를 유지/관리하기 위함이다.
번들 사이에는 의존관계가 있을수 있는데, 이를 제대로 처리하지 않으면 우리가 의도한 결과가 나오지 않을 수도 있다. OSGi는 동적인 환경이므로, 내가 사용하려는 서비스가 원하는 시점에는 없다가, 그 시점 이후에 등록이 될 수도 있다. 즉, 사용하고자 하는 서비스에 동적으로 대응하도록 코딩이 필요하다.
★ OSGi 서비스 추적하기
서비스를 찾아와서 사용하는 부분은, 그 시점에 서비스가 존재하지 않을 수도 있기 때문에 다시 한 번 확인이 필요하다. 이와 같은 처리 부분은 start 메소드에 구현하기 보다는 작업용 스레드로 구현하는 것이 이롭다.하지만 동적인 환경에서 서비스가 존재하는지를 체크하는 작업은 매우 빈번한 작업이므로 그때마다 스레드로 구현하는 것은 귀찮은 일이다. 이 작업을 좀 더 유연하게 처리해주기 위해 지원하는 서비스가 ServiceTracker이다. ServiceTracker는 OSGi R2부터 추가된 유틸리티 클래스이다. ServiceTracker의 구현체는 osgi.cmpn.jar파일 안에 들어 있다. ServiceTracker의 주요 메소드는 아래와 같다.
| 번호 | 메소드 | 설명 |
| 1 | ServiceTracker() | 생성자 |
| 2 | open(), close() | 사용전 반드시 open, 사용 후 close |
| 3 | getService(), getServices() | ... |
| 4 | getServiceReference(), getServiceReference() | ... |
| 5 | waitForService(timeout) | 데드락 발생가능성 때문에 반드시 스레드로 작성해서 호출해야 한다. |