 |  |
|
난이도 : 중급 Chris Aniszczyk, 소프트웨어 엔지니어,
IBM
옮긴이: 백기선 dwkorea@kr.ibm.com
2008 년 4 월 15 일
OSGi(Equinox) 콘솔로 알려진 숨겨진 보물에 익숙해지고 이것이 어떻게 이클립스 개발자의 도구
상자에 추가될 수 있을지 살펴봅니다. 그리고 콘솔을 확장하는 방법을 익혀 도구 상자에 좀 더 추가해 보겠습니다.
V3.0부터 이클립스는 이전 버전에서 익히 불안하다고 파악된 이클립스 플러그인 기술을
교체하기 위해 OSGi(Open Services Gateway Initiative)를 선택하여 크게
도약했다. 이런 진화 과정에서 사용자는 아무런 변화를 인식하지 못했는데, 그 이유는
플러그인을 설치하고 사용하는 것이 이전과 똑같아 보였기 때문이다.
그림 1. 이클립스 내부의 플러그인
이클립스가 이제 OSGi를 기반으로 만들어졌기 때문에 그림 1에 보이는 플러그인들은 완전히 제
구실을 하는 OSGi 번들이다(그림 2는 OSGi 콘솔로, 이클립스 객체가 내부에서 사용하는 번들들을 보여준다). OSGi를 사용함으로써 이클립스는 산업 인증 공개 표준을 지원하게
되었고 보안, HTTP 서비스, useradmin과 그 밖의 OSGi에 의해 제공되는 장점을
갖추게 되었다. 이클립스가 OSGi에 건 도박은 성공적인 것 같다. 플러그인끼리 충돌이 줄어들고 이클립스 사용은 점차 늘어나고 있으니 말이다.
그림 2. 이클립스 내부의 OSGi 번들
 |
이클립스, Equinox, OSGi, 아, 헷갈려!
OSGi 진영은 독립적인 비영리 조직으로 OSGi 기술을 전담한다. 기능적으로는
이클립스 재단과 비슷하다. OSGi 진영은 OSGi 기술 표준을 기술하고 제공한다.
간략하게 설명하면, OSGi 기술은 애플리케이션 개발에 필요한 서비스
지향(Service-Oriented) 컴포넌트 기반(Component-Based) 플랫폼을
제공한다. 여러 가지 구현체가 이 표준을 기반으로 하고 있다. 그 중 가장 유명한
구현체가 Equinox로, 이것은 이클립스가 표준을 기반으로 구현한 것이다. 또 다른 OSGi
구현체로 유명한 것은 아파치의 펠릭스(Felix) 프로젝트가 있다.
|
|
계속해서 진행하기 전에, 본 기사는 독자들이 이클립스와 OSGi에 대해 이해하고 있다고 가정한다.
만약 그렇지 않다면, OSGi 콘솔을 사용하기 전에 Scott Delap의 기사 "
Understanding how Eclipse plug-ins work with OSGi
"를 참조하기 바란다.
OSGi 번들 만들기
이번 탐험에서 가장 먼저 할 일은 이클립스
플러그인 개발 환경(PDE, Plug-in Development)
을 사용하여 OSGi 번들을 만드는 것이다. 그러려면 PDE를 사용해 새로운 플러그인
프로젝트를 생성해야 한다(
File > New > Project > Plug-in Project
). 프로젝트를 만드는 과정 중에 올바른 선택사항들을 설정했는지 주의해야 한다. 먼저, 플러그인 타겟
플랫폼을 OSGi 프레임워크로 설정한다. Equinox로 설정한다. 마지막으로 간단하게 PDE에서
제공하는
Hello OSGi Bundle
탬플릿을 선택한다(그림 3 참조). 자, 이제 본 기사에서 사용할 번들을 가지게 되었다.
그림 3. PDE Hello OSGi 번들 마법사
Hello OSGi 콘솔
자, 이제 Hello 번들을 가지고 있으니 계속해서 OSGi 콘솔을 보기 위해 프레임워크를
실행하자. 프레임워크를 실행하려면, PDE의 OSGi 프레임워크 실행 설정을 사용하면 된다.
먼저 실행 설정 메뉴로 이동한다(
Run > Run ...
). 그리고 Hello 번들을 위한 OSGi 프레임워크 실행 설정을 생성한다(그림 4 참조). 이 때,
Hello 번들을 실행하기 위해 필요한 번들들만 선택되어 있는 것을 확인하라. 그렇게 하기 위한 가장
쉬운 방법은 실행 설정에 있는
Deselect All
을 누르고 Hello 번들을 체크하고
Add Required Plig-ins
를 클릭하는 것이다.
그림 4. PDE의 OSGi 프레임워크 실행 설정
 |
플러그인과 번들: 뭐가 다른가?
이클립스 개발자들이 서로 애플리케이션을 해킹하고 있는 지하실을 돌아다니다 보면,
플러그인
과
번들
이라는 난해한 단어를 주고 받는 것을 들을 수 있을 것이다. 이 둘 사이에 차이가 있는가?
마케팅 부서장의 관점에서 보면 이 두 단어는 같다. 번들은 플러그인이고 플러그인은 번들이다.
우리는 두 개의 단어를 강요당하는 것처럼 보인다. 하지만 컴퓨터 광의 관점에서 보면 차이가
있다. 정확하게, 이클립스 플러그인은 확장 레지스트리(예를 들어, 번들 루트에
plug-in.xml을 가지고 있다)를 가지고 있는 OSGi 번들이다. OSGi 번들은...
음... OSGi 번들이다.
|
|
실행 설정이 완료되면 계속 진행할 준비가 되었다. 실행 설정 창의
Run
버튼을 사용해 번들을 실행할 수 있다. 실행이 되면 그림 5와 비슷한 결과를 볼 수 있다.
그림 5에서 Hello 번들이 시작되었고 (HelloWorld 메시지가 콘솔에 찍혔다는 것은 번들이
시작되었다는 것을 알려준다).
osgi>
프롬프트를 볼 수 있게 되었다. OSGi 프롬프트는
DOS
또는
Bash
프롬프트와 비슷하며 명령어를 사용하여 OSGi 개체를 조작할 수 있다. 이번 경우에는
ss
명령어를 사용해 모든 번들의 간단한 상태를 보여주고 있다. 이클립스 개체를 구성하는
번들들을 살펴보기 위해 이 명령어를 사용해볼 것을 권한다. 이클립스 개체에 대한 OSGi 콘솔을
얻으러면, 이클립스를 실행할 때
-console
매개변수를 주면 된다.
그림 5. 첫 번째 실행
번들 시작과 멈춤
OSGi 동적 환경에서 손쉽게 번들들을 시작하고 동작을 멈출 수 있다. 이것을 테스트
해 보기 위해 이전에 만들어둔 간단한 Hello 번들을 사용해 보자.
stop
명령어로 간단하게 번들을 멈춘 다음에,
start
명령어를 사용해 번들을 시작한다. 그림 6과 비슷한 결과를 볼 수 있을 것이다.
그림 6. 번들 시작과 멈춤
번들 추가, 제거, 업데이트
OSGi의 또 다른 막강한 측면은 자바(Java
™)
가상 머신을 다시 시작하지 않고도 실행 중인 OSGi 개체 안에서 번들을 추가, 삭제, 업데이트할 수 있다는 것이다.
그림 7은 번들을 설치하고 제거하는 예제를 보여준다.
그림 7. 번들 설치와 제거
진단
번들이나 플러그인을 시작하려고 했을 때 초기화 과정에서 에러가 발생하기도 한다. OSGi 콘솔은
번들 초기화와 관련된 문제를 디버깅할 때 유용한
diag
명령어를 제공한다. 예를 들어 그림 8을 보자. Hello 번들을 시작하려다 에러가 발생했다.
에러를 진단하기 위해
diag
명령어를 번들에 사용하였고 실행 환경에 필요로 하는 패키지가 임포트되지 않은 것을 확인할 수
있다.
그림 8. 진단하고 있는 콘솔
유용한 콘솔 명령어 요약
표 1. 유용한 콘솔 명령어
| 명령어 | 설명 |
|---|
|
start
| 주어진 ID 또는 의미를 가진 이름으로 번들을 시작한다. |
|---|
|
stop
| 주어진 ID 또는 의미를 가진 이름으로 번들을 멈춘다. |
|---|
|
install
| 현재 개체에 할당된 URL을 사용하여 번들을 추가한다. |
|---|
|
uninstall
| 현재 개체에 할당된 URL을 사용하여 번들을 제거한다. |
|---|
|
update
| 현재 개체에 할당된 URL을 사용하여 번들을 업데이트한다. |
|---|
|
active
| 현재 개체 내부에 active 상태인 모든 번들의 목록을 보여준다. |
|---|
|
headers
| 주어진 ID 또는 의미를 가진 이름으로 번들의 헤더 목록을 보여준다. |
|---|
|
ss
|
현재 개체 내부에 등록되어 있는 모든 번들에 대해 간략한 상태 정보 목록을 보여준다.
|
|---|
|
services
<filter>
| 필터에 해당하는 서비스 목록을 보여준다. |
|---|
|
diag
| 주어진 ID 또는 의미를 가진 이름으로 번들 진단을 실행한다. |
|---|
이밖에 더 많은 OSGi 명령어를 사용할 수 있다. 여기에 나열한 명령어들은 내가 가장 유용하게
사용하는 명령어다. 가용한 모든 명령어 목록을 보려면, 콘솔에서
help
를 입력하면 된다.
콘솔 확장하기
사람들은 이클립스의 아름다움은 그 확장성에 있다고 이야기한다. 콘솔도 마찬가지로 확장성이 좋다.
개발자로서 사용자에게 어떤 서비스를 제공할 수 있기 때문에 이것은 매우 중요하다. 콘솔을
확장함으로써, 여러분이 제공하는 서비스에 관련된 문제를 사용자나 관리자가 디버그할 수 있도록 개선
할 수 있다.
일반적인 확장 포인트 대신에, 콘솔은 간단하고 확장성 좋은 메커니즘을 가지고 있다. 몇몇 예제를
통해 콘솔의 확장성을 살펴보자.
uname, OSGi 스타일
유닉스스러운 시스템으로 일해온 개발자들은
uname
명령어에 익숙할 것이다. 이것은 실행중인 운영체제와 관련된 이름, 버전 등 기타 정보를 출력한다.
OSGi 문맥으로 볼 때, 유닉스스러운 다양한 것이 존재하듯이 다양한 OSGi 콘솔
구현체들(예를 들어,
아파치 펠릭스
,
Knopflerfish
같은)이 존재할 수 있다.
OSGi 콘솔을 확장할 때 가장 중요한 부분은
CommandProvider
인터페이스다. 콘솔 확장에 관심이 있는 클라이언들은 반드시 이것을 구현해야 한다. 구현을 한 뒤에 할
일은,
"_"
이것으로 시작하는 메서드를 만드는 것이다. 이런 메서드들은 콘솔에서 사용할 명령어가 된다. 간단하지
않은가! Listing 1을 보자.
Listing 1. OSGi uname
public class Activator implements BundleActivator, CommandProvider {
private BundleContext context;
public void start(BundleContext context) throws Exception {
this.context = context;
Hashtable properties = new Hashtable();
context.registerService\
(CommandProvider.class.getName(), this, properties);
}
public String getHelp() {
StringBuffer buffer = new StringBuffer();
buffer.append("\tuname - returns framework information\n");
return buffer.toString();
}
public void stop(BundleContext context) throws Exception {}
public void _uname(CommandInterpreter ci) throws Exception {
String vendor = context.getProperty(Constants.FRAMEWORK_VENDOR);
String version = context.getProperty(Constants.FRAMEWORK_VERSION);
String osName = context.getProperty(Constants.FRAMEWORK_OS_NAME);
String osVersion = context.getProperty(Constants.FRAMEWORK_OS_VERSION);
System.out.println("\n " + vendor + " "
+ version + " (" + osName + " "
+ osVersion + ")");
}
}
|
번들과 실존주의
번들들은 그것들의 존재를 의심하지 않는다. 하지만 이것은 실제로 번들이 평범한 번들인지 이클립스
플러그인인지 출력하는 간단한 예제다(기억할 것은 둘 다 번들이라는 것이다!). Listing 2는 이전
예제에 새로운 메서드를 추가하고
getHelp()
메서드를 수정했다.
Listing 2.
getHelp()
수정
...
public String getHelp() {
StringBuffer buffer = new StringBuffer();
buffer.append("\twhatami - \
returns whether the bundle is a plug-in or not\n");
buffer.append("\tuname - returns framework information\n");
return buffer.toString();
}
public void _whatami(CommandInterpreter ci) throws Exception {
try {
long id = Long.parseLong(ci.nextArgument());
Bundle bundle = context.getBundle(id);
URL url = bundle.getEntry("plugin.xml");
if(url != null) {
System.out.println("\n I'm \
(" + bundle.getSymbolicName() + ") a plug-in");
} else {
System.out.println("\n I'm \
(" + bundle.getSymbolicName() + ") not a plug-in");
}
} catch (NumberFormatException nfe) {
System.out.println("\n Error processing command");
}
}
...
|
결과는 그림 9와 같다.
그림 9. 콘솔 확장의 결과
결론
이번 기사에서는 OSGi 콘솔을 어떻게 사용하는지 그리고 콘솔을 어떻게 확장하는지 살펴보았다. 그
뒤를 이어, 콘솔을 살펴보았고 몇몇 예제에서 그것을 어떻게 확장하는지 살펴보았다. 독자들은 이제
콘솔에 상당히 친숙해졌을 것이고 매일 사용하는 이클립스 개발 과정에서 어떻게 활용할지
아이디어를 얻을 수 있을 것이다. 아마도 콘솔을 사용하는 것이 둠이나 퀘이크를 플레이하던 기억을
떠올리게 해줄 것이다.
그림 10. 퀘이크 콘솔
다운로드 하십시오 | 설명 | 이름 | 크기 | 다운로드 방식 |
|---|
| Source code | os-ecl-osgiconsole.hello.zip | 49KB | HTTP |
|---|
참고자료 교육
제품 및 기술 얻기
토론
필자소개  | 
|  | Chris Aniszczyk은 IBM Lotus의 소프트웨어 엔지니어로 OSGi와 관련된 개발에
종사하고 있다. 그는 오픈 소스를 진심으로 좋아하여,
젠투 리눅스(Gentoo Linux)
배포에 기여하고 있다. 그리고 몇몇 이클립스 프로젝트(PDE, ECF, EMFT)에서 커미터로 활동하고
있다. 그와는 언제든지 시원한 음료수를 마시며 이메일을 통해 오픈 소스와 이클립스에 관해 대화를
나눌 수 있다. |
기사에 대한 평가
 |
| 이 문서 북마킹 하기
|
|  |