다소 늦은감이 있지만, 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 >
다음 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 인지를 알려줍니다. 일반적으로 우리는 풀 클래스 이름을 적어주지만, 게을러서 그냥 디폴트 패키지명을 사용했습니다.
이것으로 우리의 첫 번째 글을 마칩니다. 다음에 뵙겠습니다.
옹, 기대되네요. 맨날 OSGi, OSGi 이름만 듣고 실체를 모르겠던데 이 글들 보면서 익혀가야겠네요 ^^;
@근데 원래 Java쪽이 아니시지 않았나요? 움.. 지금 어디계신지 궁금하네요. 전 졸업하고 솔루션XX 에 있습니다. 하하핫
저야 뭐 원래 이것저것 기웃거리고 다녀서요 ^^; 요즘은 Embedded Device 에 Java 및 OSGi 를 올리는 작업을 하고 있습니다. 블로그에서 봤었는데 대전으로 아예 옮기셨나 보군요. ㅎㅎ
김혁입니다. ㅎㅎ. 번역한거 블로그에 올린다는 얘기가 기억이나서 블로그를 찾아나섰는데 금방 찾아지는군요. 덕분에 수월하게 읽을 수가 있겠네요. 그나저네 어제는 Kasey는 잘 모시고 갔나모르겠군요. 고생 많아요..ㅋㅋ. 그럼 주말 잘 보내고 월요일에 봅시다~
앗 회사사람들한테는 왠만하면 비밀인데~ ^^
학교에서 OSGI 세미나 하고 있는데 찾던 자료이네요~ 잘배울게요 ㅎㅎ
재미나게 OSGi 공부하시길 🙂
퍼가지는 않고 블로그에 링크만 걸겠습니다 ^^;
좋은 글 잘 보고 갑니다. 저도 좀 더 내공을 쌓아서 이런 글 올릴 수 있도록 하고 싶네요
osgi에 대한 이해가 많이 부족했는데, 많은 도움이 되었습니다.