IBM®
메인 컨텐츠로 가기
    Korea [국가변경]    이용약관
 
 
   
        제품    서비스 & 솔루션    고객지원 & 다운로드    회원 서비스    
메인 컨텐츠로 가기

한국 developerWorks  >  오픈 소스  >

이클립스의 OSGi 콘솔 살펴보기 (한글)

이클립스에 포함되어 있는 콘솔을 사용하고 확장하라.

developerWorks
문서 옵션

JavaScript가 필요한 문서 옵션은 디스플레이되지 않습니다.

샘플 코드

영어원문

영어원문


제안 및 의견
피드백

난이도 : 중급

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 번들
이클립스 내부의 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 번들 마법사
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 프레임워크 실행 설정
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 codeos-ecl-osgiconsole.hello.zip49KBHTTP
다운로드 방식에 대한 정보


참고자료

교육

제품 및 기술 얻기

토론
  • 이클립스 플랫폼 뉴스그룹(Eclipse Platform newsgroups) 은 이클립스와 관련된 질문이 생겼을 때 가장 먼저 들러야 할 곳이다(이 링크를 클릭하면 독자들의 기본 유즈넷 뉴스 리더 애플리케이션을 실행하고 eclipse.platform을 열 것이다.)

  • Equinox newsgroups 는 이클립스 OSGi 구현체에 대해 엄청나게 많은 정보를 가지고 있다(이 링크를 클릭하면 독자들의 기본 유즈넷 뉴스 리더 애플리케이션을 실행하고 eclipse.technology.equinox를 열 것이다)

  • 이클립스 뉴스그룹 은 이클립스를 사용하고 확장하는 데 관심이 많은 사람에게 유용한 다양한 정보를 가지고 있다.

  • developerWorks 블로그 와 developerWorks 커뮤니티에 참여하라.


필자소개

Chris Aniszczyk

Chris Aniszczyk은 IBM Lotus의 소프트웨어 엔지니어로 OSGi와 관련된 개발에 종사하고 있다. 그는 오픈 소스를 진심으로 좋아하여, 젠투 리눅스(Gentoo Linux) 배포에 기여하고 있다. 그리고 몇몇 이클립스 프로젝트(PDE, ECF, EMFT)에서 커미터로 활동하고 있다. 그와는 언제든지 시원한 음료수를 마시며 이메일을 통해 오픈 소스와 이클립스에 관해 대화를 나눌 수 있다.




기사에 대한 평가


보다 나은 서비스를 제공하기 위함이오니 잠시 짬을 내어 이 양식을 제출하여 주십시오.



아니오잘 모르겠음
 


 


12345
 


이 문서 북마킹 하기

mar.gar.in mar.gar.in naver naver eolin eolin del.icio.us del.icio.us





위로


developerWorks 콘텐트를 다른 사이트에 전재하기:
developerWorks 콘텐트에 대한 저작권은 IBM에 있습니다. IBM의 서면 허가나 원본 저자의 허락이 없이는 전재를 금합니다. 저희 콘텐트를 전재하시려면 IBM developerWorks 담당자 에게 문의하십시오.
    IBM 소개 개인정보 보호정책 문의