년도별 글 목록: 2008

OSGi 시작하기 2 – 프레임워크와 연동하기 : [번역] Interacting with the Framework

이 글은 Neil Bartlett 의 연재 글 “Getting started with OSGi”의 번역본입니다.
* 파트 1 – 첫번째 번들 : Your First Bundle
에 이어 2번째 글입니다. 오탈자 및 이상한 번역은 댓글로 남겨주세요

Getting started with OSGi : OSGi 시작하기 파트 2 – 프레임워크와 연동하기

저자 : Neil Bartlett < njbartlett at gmail dot com >
역자 : 권 정혁 < guruguru at gmail dot com >

글원본 : http://www.eclipsezone.com/eclipse/forums/t90448.html – Getting started with OSGi : Interacting with the Framework

EclipseZone OSGi 튜토리얼에 돌아오신걸 환영합니다.

지난 시간에는 시작과 종료시에 메시지를 출력하는 Hello World 번들을 살펴보았는데요. 이것은 BundleActivator 인터페이스를 구현하여 start 와 stop 메소드를 제공함으로서 가능했습니다. 코드를 다른부분을 살펴보면, startstop 메소드의 서명(Method Signature , 역주:메소드의 이름,인자,리턴타입등을 총칭)에서 우리가 BundleContext 라는 인자를 받았다는 것을 알수 있습니다. 이 장의 튜토리얼에서 우린 BundleContext 에 대해 알아보고 이 것으로 무엇을 할수 있는지 살펴볼 것 입니다.

BundleContext 는 OSGi 프레임워크가 우리에게 보내주는 매직티켓 입니다. 코드상에서 프레임워크와 연관된 작업을 해야할 필요가 있을 때 BundleContext 를 사용하게 될것입니다. 실제로 이것은 OSGi API 와 연결하기 위한 단 하나의 방법이며 프레임워크는 번들이 시작될때 BundleActivator 를 통해 각 번들에게 이 티켓중의 하나를 발권하게 됩니다.

지난번에 시작한 Equinox 가 아직 실행중이라면 재시작 할 필요는 없습니다. 실행중이 아니라면, 다시 시작하기 위한 커맨드는

> java -jar equinox.jar -console

입니다. ss 를 입력해서 지난번에 설치한 HelloWorld 번들이 아직 설치되어 있는지 확인해 볼 수 있습니다. 당신이 Equinox 를 종료하고 재 시작했더라도 그것을 볼수 있는데, 왜냐하면 OSGi 프레임워크가 각각의 실행간에 실행 상태를 저장하기 때문입니다.

이번 연습을 위해, 우리는 Hello World 번들을 찾아내고 Uninstall(제거) 하는 번들을 작성해 볼것입니다. 물론 콘솔창에서 uninstall 명령을 내림으로 간단히 해볼수 있지만, 어떻게 OSGi API 를 통해 프로그램적으로 실행가능한지를 알아보기 위해서입니다. 그럼 HelloWorldKiller.java 라는 파일을 만들고 아래의 코드를 복사합니다.

import org.osgi.framework.*;
 
public class HelloWorldKiller implements BundleActivator {
    public void start(BundleContext context) {
        System.out.println("HelloWorldKiller searching...");
        Bundle[] bundles = context.getBundles();
        for(int i=0; i < bundles.length; i++) {
            if("HelloWorld".equals(bundles[i]
                                   .getSymbolicName())) {
                try {
                    System.out.println("Hello World found, "
                                     + "destroying!");
                    bundles[i].uninstall();
                    return;
                } catch (BundleException e) {
                    System.err.println("Failed: "
                                     + e.getMessage());
                }
            }
        }
        System.out.println("Hello World bundle not found");
    }
 
    public void stop(BundleContext context) {
        System.out.println("HelloWorldKiller shutting down");
    }
}

이제 Manifest 를 작성합니다. 마지막줄에 빈줄이 있어야 하는것은 역시 매우 중요합니다. 아래 내용을 HelloWorldKiller.mf 에 복사하세요.

Manifest-Version: 1.0
Bundle-Name: HelloWorldKiller
Bundle-Activator: HelloWorldKiller
Bundle-SymbolicName: HelloWorldKiller
Bundle-Version: 1.0.0
Import-Package: org.osgi.framework

자 이젠 컴파일 하고 Jar 파일을 만듭니다.


> javac -classpath equinox.jar HelloWorldKiller.java
> jar -cfm HelloWorldKiller.jar HelloWorldKiller.mf HelloWorldKiller.class

다시 OSGi 콘솔에서 install file:HelloWorldKiller.jar 를 입력해서 새 번들을 설치하고 ss 를 입력해 봅니다. 상태 리스트는 이제 아래와 같을 것입니다.

id      State       Bundle
0       ACTIVE      system.bundle_3.2.1.R32x_v20060919
1       ACTIVE      HelloWorld_1.0.0
2       INSTALLED   HelloWorldKiller_1.0.0

자 이제 start 2 를 입력해서 Hello World Killer 를 실행하여 봅시다. 아래와 같은 출력을 보실수 있습니다.

HelloWorldKiller searching...
Hello World found, destroying!
Goodbye EclipseZone Readers!

마지막 출력라인은 원본 Hello World 번들에서 나왔다는것을 주목하세요. 우리가 Killer 를 실행하기 전에 그 번들이 active 상태였기 때문에 제거되기 전에 중단 되어야만 했기에 BundleActivator 에게 stop 이 실행 되도록 만들었습니다.

ss 의 출력을 보도록 합시다. Hello World 가 이제 사라졌습니다.

id      State       Bundle
0       ACTIVE      system.bundle_3.2.1.R32x_v20060919
2       ACTIVE      HelloWorldKiller_1.0.0

여기에 보안 문제가 있지 않은가 궁금해 하실수 있습니다. 어떤 번들이라도 다른 어떤 번들을 제거할수 있는것 처럼 보이니까요! 다행스럽게도 OSGi 는 프레임워크와의 모든 연계작업들을 세밀하게 조종할수 있는 종합적인 보안계층을 가지고 있습니다. 예를 들어 특정 “관리” 번들에 의해서만 번들이 제거될수 있도록 할수도 있습니다. 어쨋거나, 보안이 동작하도록 하는것은 대부분 설정(Configuration)상의 문제이니 이 연재에서는 우리는 코드에만 집중하기로 합니다.

이번회는 여기까지 입니다. 다음시간까지 BundleContext 의 인터페이스를 살펴보고 무엇을 할수 있는지 알아보는건 어떨까요 ? 예를 들어 installBundle 메소드를 이용하여 프로그램적으로 새 번들을 설치하는 것을 시도해 볼 수도 있습니다. 또는 현재 설치된 번들들에 대한 리스트를 가져와서 마지막으로 수정된 날짜와 시간을 출력하도록 할 수도 있구요. 시작하는데 도움이 필요하다면 OSGi Release 4 API 에 대한 JavaDoc 을 참고하세요

OSGi 시작하기 1 – 첫번째 번들 : [번역] Getting started with OSGi – Your First Bundle

다소 늦은감이 있지만, EclipseZone 에 연재되었던 Neil Bartlett 의 연재 글 “Getting started with OSGi” 를 번역하려고 합니다. OSGi 기술에 대한 입문용 강의로는 가장 괜찮은듯 합니다. 혹시 오탈자나 이상한 번역이 있으면 댓글로 남겨주세요.

또한, Neil 이 새로 쓰고 있는 무료 OSGi 책(CC by-nc-sa를 따릅니다) 인 “OSGi in Practice”Neil 에게 허락을 받아서 번역 작업 중인데요. 번역이 끝나는 대로 블로그에 공개할 예정입니다. 사실 OiP를 먼저 하려고 했는데, 시작하는 OSGi 개발자 들에게 도움이 될듯하여 먼저 해둡니다.

OSGi 는 “Dynamic Module System for Java” 라고 불리며, 다양한 활용도를 가지는 자바기반의 서비스 플랫폼입니다. Eclipse 내부가 OSGi 를 이용해서 만들어 지고 있으며, 확장이 쉬운 구조로 인해 임베디드 디바이스 부터 서버 기반까지 적용폭을 넓혀 나가고 있습니다. 2008년에 배워둬야 할 Java 기술 5가지중 하나 이기도 합니다. ( 다른 4개는 Cloud Computing,Groovy,GWT,JCR) 근래에는 Spring Framework 이 OSGi 를 지원하는 SpringDM을 발표하면서 수많은 Spring 사용자분들도 관심을 많이 가지고 계신 듯 합니다.

또한 제가 관심두고 있는 IBM Rationale 의 Jazz Platform 과 Team Concert가 OSGi 를 기반으로 하고 있기도 하고 해서, 제가 가장 주목하고, 열심히 공부 하고 있는 기술이기도 합니다. ^^; 잡설이 길었네요. 하여튼 앞으로는 OSGi , Java , Jazz 에 관련 된 글들을 블로그에 간간히 적어보려구 합니다. 기회가 되면 제가 직접 OSGi 강좌를 연재 해보고 싶은 마음도 있지만.. 언제가 될지 모르겠네요.


Getting started with OSGi : OSGi 시작하기 파트 1 – 당신의 첫번째 번들

저자 : Neil Bartlett < njbartlett at gmail dot com >
역자 : 권 정혁 < guruguru at gmail dot com >

글원본 : http://www.eclipsezone.com/eclipse/forums/t90365.html – Getting started with OSGi : Your First Bundle

다음 1-2주간, EclipseZone 에서 OSGi 에 관한 짧은 시리즈 글들을 연재할 예정입니다. 이 글들이 모여서 OSGi 프로그래밍 기술을 마스터 하는 쉬운 경로를 만들어 줄 것입니다. 하지만 각각의 글들은 단 한 개의 새로운 기술만을 소개할 것이며, 약 10분이내에 살펴볼 수 있을 것입니다. 또한 우리는 OSGi 개발이 얼마나 쉬운지를 보여주고 싶으므로, 개발을 위해 Eclipse 를 사용하지 않고 텍스트 에디터와 기본 커맨드 라인 툴 만을 사용할 예정입니다. 자, “Getting started with OSGi” 시리즈에 온 것을 환영합니다.

기본 작업환경을 만들어야 하므로, 첫 번째 글은 다른 글에 비해 다소 길어질 예정입니다. 시작하기 전에, 실행하기 위한 OSGi 프레임워크를 필요로 합니다. 우리가 선택할 수 있는 세 개의 오픈소스 구현 들이 있습니다. Apache Felix , Knopflerfish, 그리고 Equinox. 어떤 것을 선택하든 우리가 작성할 코드는 똑같겠지만 실행방법은 다소 다를 수 있습니다. 여기가 EclipseZone 이므로, 우린 Equinox 를 사용할 것이며, Equinox 는 Eclipse 자체가 사용하는 런타임입니다. 설치된 Eclipse 가 있다면 거기서 복사하실 수 있습니다. org.eclipse.osgi_3.2.1.R32x_v20060919.jar 파일을 찾고 빈 디렉토리로 복사하세요. (NB : 버전 번호는 어떤 Eclipse 버전이 설치되어야 있느냐에 따라 약간 다를수 있습니다. ) 만약 Eclipse 설치본이 없다면, http://download.eclipse.org/eclipse/equinox/ 에서 Jar 파일을 다운로드 할 수 있습니다.

명령들을 짧게 하기 위해, 이 Jar 파일의 이름을 equinox.jar 로 변경합시다. 우리의 개발디렉토리에서 커맨드창을 열고 아래의 커맨드를 실행합니다.

> java -jar equinox.jar -console

몇 초안에, osgi> 프롬프트가 보일 것입니다. 축하합니다. 당신은 이제 OSGi 를 실행하셨습니다!

osgi> 프롬프트는 프레임워크를 컨트롤할 수 있도록 하는 Equinox 의 명령들을 실행할 수 있게 합니다. help 를 입력해서 명령 리스트를 보고, 그 중 몇 개와 놀아 보도록 하세요. 해보셨나요 ? 그럼 ss 를 입력해보세요. 이것은 가장 자주 사용하는 명령입니다. 이것은 “Short Status : 간략한 상태보기” 를 의미하며, 우리에게 설치된 번들의 리스트와 현재 어떤 상태인지를 보여줍니다. ( “번들:Bundle”은 OSGi 개념에서의 모듈입니다. 당신이 만약 Eclipse 개발자라면, 이것을 플러그인 이라고 알고 있을 수도 있습니다. 기본적으로 번들과 플러그인은 같은 것입니다. )

Equinox 는 다음과 같은 내용을 출력합니다.

Framework is launched.
id      State       Bundle
0       ACTIVE      system.bundle_3.2.1.R32x_v20060919

이것은 단 하나의 번들이 설치되어있고, 실행중인 상태(Active)이며 그것이 시스템 번들이라는 것을 알려줍니다. 이것은 OSGi 에서 특수한 번들이며 항상 존재하고, 프레임워크 자신을 나타냅니다.

자, 이제 우리의 번들을 작성해봅시다. 위와 같은 디렉토리에 HelloActivator.java 라는 파일을 만들고 아래의 코드를 그 파일에 복사하세요.

import org.osgi.framework.*;
public class HelloActivator implements BundleActivator {
  public void start(BundleContext context) {
    System.out.println("Hello EclipseZone Readers!");
  }
  public void stop(BundleContext context) {
    System.out.println("Goodbye EclipseZone Readers!");
  }
}

번들은 또한 자신의 다양한 메타데이터 정보(이름,버전과 같은)를 가지고 있는 Manifest 파일을 필요로 합니다. HelloWorld.mf 라는 파일을 만들고 아래의 텍스트를 그 파일에 복사하세요. 이 파일이 마지막에 꼭 한 개의 빈 줄을 가지도록 확인해 주세요, 그렇지 않으면 Jar 커맨드 라인툴이 이 파일을 잘라먹을 겁니다.(역자주 : 만약 번들 시작시에 Activator 가 이상하다는 에러가 난다면 아마 빈 줄을 넣는걸 빠트리신 걸 겁니다. )

Manifest-Version: 1.0
Bundle-Name: HelloWorld
Bundle-Activator: HelloActivator
Bundle-SymbolicName: HelloWorld
Bundle-Version: 1.0.0
Import-Package: org.osgi.framework

자 이제 새로운 커맨드 창을 열고 ( OSGi 가 실행하도록 내버려 두기 위함입니다. ) 다음 커맨드를 이용하여 Jar 파일을 만듭니다.

> javac -classpath equinox.jar HelloActivator.java

> jar -cfm HelloWorld.jar HelloWorld.mf HelloActivator.class

이제 OSGi 콘솔로 돌아가서, install file:HelloWorld.jar 라고 입력합니다. 결과는 "Bundle id is 1" 일겁니다. 다시 ss 를 입력하면 아래와 같은 내용을 보실 수 있습니다.

Framework is launched.
id      State       Bundle
0       ACTIVE      system.bundle_3.2.1.R32x_v20060919
1       INSTALLED   HelloWorld_1.0.0

우리의 HelloWorld 번들이 설치되었습니다만 아직 실행상태(Active)는 아니네요. 이 상태가 무엇을 의미하는지는 차후의 글에서 살펴보기로 하고, 여기선 그냥 start 1 을 입력해서 번들을 시작하도록 합니다. “1” 은 첫 번째 컬럼에 나와있는 번들의 ID 입니다. 이렇게 입력하면 "HelloEclipseZone Readers!" 라는 메시지를 보실 수 있을 것입니다. 다시 stop 1 을 입력하면 "Goodbye EclipseZone Readers!" 를 볼수 있습니다. 지겨울 때까지 반복해보세요. 때때로 ss 를 입력해서 번들의 상태가 바뀌는 것을 보는 것도 잊지 마시구요.

이 안에서 무슨 일이 일어난걸까요 ? 우리의 코드는 BundleActivator 인터페이스를 구현하고, 프레임워크에게 우리한테 중요한 LifeCycle 이벤트를 알릴 수 있도록 하였습니다. 번들이 시작되면, 프레임워크는 start 메소드를 호출하고, 번들이 멈출 때 stop 메소드를 호출하여 줍니다. 이런 일 들은 Manifest 파일에 있는 "Bundle-Activator: HelloActivator" 에 의해 가능해 집니다. 위 라인이 프레임워크에게 우리 번들 안의 어떤 클래스가 Activator 인지를 알려줍니다. 일반적으로 우리는 풀 클래스 이름을 적어주지만, 게을러서 그냥 디폴트 패키지명을 사용했습니다.

이것으로 우리의 첫 번째 글을 마칩니다. 다음에 뵙겠습니다.