OSGi 시작하기 7 – 선언적 서비스 소개하기 : [번역] Introducing Declarative Services

이 글은 Neil Bartlett 의 연재 글 “Getting started with OSGi”의 번역본입니다.

* 파트 1 – 첫번째 번들 : Your First Bundle

* 파트 2 – 프레임워크와 연동하기 : Interacting with the Framework

* 파트 3 – 번들간의 의존관계 : Dependencies between bundles

* 파트 4 – 서비스 등록하기 : Registering a Service

* 파트 5 – 서비스 사용하기 : Consuming a Service

* 파트 6 – 동적으로 서비스 추적하기 : Dynamic Service Tracking

에 이어 7번째 글입니다. 오탈자 및 이상한 번역은 댓글로 남겨주세요

Getting started with OSGi : OSGi 시작하기 파트 7 – 선언적 서비스 소개하기

저자 : Neil Bartlett < njbartlett at gmail dot com >

역자 : 권 정혁 < guruguru at gmail dot com >

글원본 : http://www.eclipsezone.com/eclipse/forums/t96740.html – Getting started with OSGi : Introducing Declarative Services

매우 늦어져 버린 “Getting Started with OSGi” 시리즈에 오신걸 환영합니다. 이번 회는 선언적 서비스에 대해 알아볼것이므로 매우 재미있을 것입니다.

선언적 서비스(Declarative Services , DS) 스펙은 OSGi 의 새로운 부분중의 하나로서, 번들간의 서비스를 연결할때 생기는 이슈들의 결과로 생겨났습니다. 이 작업이 어렵다는 것이 아니라 ( 제 예전 튜토리얼들이 보여주었을꺼라고 희망합니다. ) 꽤 많은 양의 반복적인 코드(boilerplate)를 필요로 하기 때문입니다. 또한, 쓰레드 문제때문에 조심해야 하며 이는 쉽게 당신의 발에 총을 쏠수 있게 된다는 것입니다. (shoot yourself in the foot, 역주: 쉽게 실수할 수 있다는 것으로, 그냥 원문대로 번역했습니다. http://burks.bton.ac.uk/burks/language/shoot.htm 참고하세요)

이 문제를 해결하기 위한 초기 시도는 Humberto CervantesRichard Hall 이 만든 툴인 Service Binder 였습니다. Service Binder 는 automated service dependency management(자동 서비스 의존관계 관리) 를 소개하여 개발자에게 자신들의 서비스만을 작성하는데 집중하도록 했습니다. 서비스간의 연결은 선언적으로 처리되었고, 이 선언들은 XML 로 작성되었습니다.

선언적 서비스의 스펙은 Service Binder 에서 발전된것으로 이제는 OSGi 버전 4.0 이상에선 표준이 되었습니다. 그럼, 이제 이것이 우리에게 무엇을 해줄수 있는지 보죠.

지난회에서 말씀드렸듯이, 이제 커맨드 라인에서 모든것을 하는 것이 힘들어졌으므로 지금부터는 Eclipse SDK 를 사용하도록 하겠습니다. 그렇지만 제가 소개하는 것들이 정말 Eclipse 에 종속적이지는 않다는것을 기억해주세요. 비록 Eclipse 가 우리가 하려는 것들을 많이 도와주기는 하지만, 어떤 흑마법도 없으며, 여기서 보시는 어떤 것도 NetBeans 나 IntelliJ 또는 오래된 vi 라도 가능합니다.

첫번째로 할일은 선언적 서비스에 대한 Equinox 구현을 다운로드 하는것입니다. 안정적인 Eclipse 버전을 사용하고 있으시다는 가정하에 ( 이글 쓰는 시점에서는 3.2.2 ), 다운받기 링크는 여기 입니다. 다른 버전을 사용하고 계시다면, 여기 Equinox 의 상위레벨 다운로드 페이지 에서 맞는 버전의 org.eclipse.equinox.ds_x.x.x_xxxxx.jar 파일을 찾으셔야 합니다. 다운로드가 끝나면, Eclipse가 설치된 디렉토리 하부의 plugins 디렉토리에 복사하고 Eclipse 를 재시작 하세요. 만약에 여러분이 Eclipse plug-ing 개발에 약간 알고 계신다면, 이 Jar 파일을 Target Platform 폴더에 넣으셔야 합니다. “Target Platform”이 뭔지 모르신다면, 아무 걱정마시고 그냥 plugins 폴더에 JAR 파일을 넣어주세요.

자 이제 새로운 번들을 만들 것입니다. Eclipse 에서 Plug-in 프로젝트 위자드를 이용해서 새로운 프로젝트를 생성합니다.

  1. 메인 메뉴에서 File -> New -> Project 를 선택합니다.
  2. Plug-in 프로젝트를 선택하고 Next를 누릅니다.
  3. 프로젝트의 이름을 SampleExporter 라고 입력합니다.
  4. 아래쪽 “This plug-in is targeted to run with” 항목 밑에, “an OSGi framework” 를 선택하고 그 옆 드롭다운리스트에서 “standard” 를 선택하세요. 이 단계는 꼭 필요한>것은 아니지만, 우리가 실수로라도 다른 OSGi 프레임워크 구현들이 기본으로 가지고 있은 기능(Out-of-the-box)외의 것들을 사용하지 못하도록 막아줍니다.
  5. Next 를 누릅니다. 다음에 나오는 Wizard 페이지에서, “Generate an activator…” 의 체크박스를 해제하고, Finish 를 누릅니다.

이제 우린 빈 번들 프로젝트를 하나 가지게 되었으므로, 코드를 추가해 봅니다. 일을 쉽게 하기위해 , 모든 자바 런타임에 들어있는 인터페이스인 java.lang.Runnable 을 이용하는 서비스를 만들어 봅니다. 이클립스 단축키를 이용해서, 아래코드를 브라우저에서 직접 복사한후에 SampleExporter 프로젝트에 있는 src 폴더를 선택하고, Edit->Paste 를 선택해보세요. Eclipse 가 패키지와 소스파일을 만들어 줄것입니다.

package org.example.ds;
public class SampleRunnable implements Runnable {
 public void run() {
   System.out.println("Hello from SampleRunnable");
 }
}

지금까지는 특별한게 없습니다만, 이제 재미있어지는 부분이 나옵니다. 우린 SampleRunnable 을 서비스로 선언하는 XML 파일을 생성할 것입니다. 프로젝트 최상단에 OSGI-INF 라는 폴더를 만들고 그 안에 samplerunnable.xml 파일에 아래 내용을 복사하세요.

<?xml version="1.0"?>
<component name="samplerunnable">
 <implementation class="org.example.ds.SampleRunnable"/>
  <service>
   <provide interface="java.lang.Runnable"/>
  </service>
</component>

이것은 우리가 DS 에서 보게될 간단한 선언 형식중 하나입니다. 내용인 즉슨, java.lang.Runnable 의 인터페이스를 이용하여 OSGI Service Registry에게 서비스를 제공하는 samplerunnable 이라는 컴포넌트가 있고, 컴포넌트의 구현 클래스는 org.example.ds.SampleRunnable 이라는 것입니다. 마지막 단계는 Declaratie Services 런타임에게 XML 파일의 존재를 알리는 것입니다. 우린 이것을 번들의 MANIFEST.MF 에 필드를 추가함으로써 가능합니다. Manifest를 열고(프로젝트에서 우측버튼 클릭후 PDE Tools -> Open Manifest를 이용해보세요), 직접 manifest 편집이 가능한 MANIFEST.MF 탭으로 가서 아래 라인을 추가합니다.

Service-Component: OSGI-INF/samplerunnable.xml

그리고는 파일을 저장합니다. 이전회에서처럼, manifest 의 맨 마지막 빈줄을 매우 중요합니다. 하지만 이전과는 다르게 만약 당신이 잊는다해도 Eclipse 가 에러메시지를 출력할 것입니다.

더 진행하기 전에, Equinox 를 실행해서 이것이 동작하는지 봅시다. Run 메뉴로 가서 “Run…” 메뉴를 선택해서 다이얼로그가 열리면 “Equinox OSGi Framework” 를 왼쪽 트리에서 선택하고 New 버튼을 누릅니다. 만약 여러분이 Eclipse 에는 경험이 있지만, OSGi 개발은 안해보셨다면, 이 런쳐 다이얼로그는 약간 이상해 보일것입니다. Bundles 라고 이름붙여진 첫번째 탭은 Launch 설정에서 어떤 번들이 선택될 지, 초기화시에 자동으로 시작할지,아니지를 결정할수 있게 해줍니다. 최소의 세트를 가지려면, Deselect All 을 누르고, 아래 번들들만을 선택합니다.

  • SampleExporter (Workspace 항목 하부에)
  • org.eclipse.equinox.ds (Target Platform 항목 하부에)

이 번들들이 우리가 관심을 가지고 있는것이지만, 이들은 의존관계를 가지고 있으므로, Add Required Bundles 를 눌러서 다른 번들들을 선택되게 합니다. “Validate bundles automatically prior to launching”(실행시 자동으로 번들 검증) 을 선택하는것도 좋은 생각입니다. 마지막으로 Run 을 선택하면 바로 osgi> 프롬프트가 Eclipse 콘솔에 표시될것입니다. OSGi 프레임워크가 실행중이므로, 이전에 배웠던 커맨드들을 사용해 볼수 있습니다.

우리 서비스가 등록되었나요 ? services 명령으로 확인해 볼수 있습니다. 서비스 리스트중에-아마도 마지막쯤에-아래와 같은것을 보실수 있습니다.

{java.lang.Runnable}={component.name=samplerunnable, component.id=1, service.id=22}
  Registered by bundle: initial@reference:file:..../SampleExporter/ [5]
  No bundles using service.

네 등록되었습니다! 주목할건 서비스 등록이 Declarative Services 번들에 의해서가 아니라 우리 번들에 의해 이루어 졌다는 것입니다. 실제로 DS 가 우리 번들을 대신하여 등록해준것입니다. 뒤에 어떻게 그렇게 하는지를 살펴볼 것이지만, 이 레슨의 목적은 우리 서비스의 사용자가 어떤 특별한 일을 할 필요가 없다는것입니다. 실제론 사용자는 우리가 Declarative Services 를 사용하고 있다는것을 알 필요도 없습니다. 사용자 또한 원한다면 Declarative Services 를 사용할 수 있지만, 또한 그냥 OSGi 코드를 직접 이용할 수도 있습니다.

또 하나 주목할것은, 우리의 번들에는 어떤 OSGi 관련 자바 코드도 없다는 것입니다. 다른말로, 우리가 생성한 클래스는 POJO 이고, 이것이 Declarative Services 의 주요 기능입니다.

이번회는 여기까지입니다. 이번 레슨이 너무 기초적인것이라 미안합니다. 다음회에서는 DS 를 이용하여 어떻게 서비스를 사용하는지 알아봄으로써 DS가 제공하는 파워와 편리함을 알수 있을것입니다.

OSGi 시작하기 7 – 선언적 서비스 소개하기 : [번역] Introducing Declarative Services”에 대한 6개의 생각

  1. fly32

    무려 2년전 자료인데 이제야 봤네요.
    OSGi가 뭔지 약간은 손에 잡히는 느낌입니다.
    좋은 번역 정말 감사드립니다!

    응답

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다