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

한국 developerWorks  >  SOA와 웹서비스 | 오픈 소스  >

OSGi와 스프링: Part 2: 펠릭스를 사용하여 OSGi를 스프링 번들로 개발하고 배포하기

개발자가 자바 컴포넌트를 구축하고 오픈 소스 OSGi 컨테이너인 아파치 펠릭스를 사용해 OSGi 기반 스프링 번들로 패키지하는 방법을 단계별로 안내하기

developerWorks
문서 옵션
PDF format - Fits A4 and Letter

PDF - Fits A4 and Letter
25KB (9 pages)

Get Adobe® Reader®

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

토론

샘플 코드

영어원문

영어원문


제안 및 의견
피드백

난이도 : 중급

Naveen Balani, Enterprise Architect, IBM
Rajeev Hathi, Technical Architect, Consultant

원문 게재일 : 2009 년 3 월 30 일
번역 게재일 : 2009 년 6 월 23 일

펠릭스 컨테이너의 스프링 DM 프레임워크를 사용하여 Java 클래스를 OSGi 번들로 개발하고 패키지합니다. 연재의 Part 2인 이 글에서는 스프링 프레임워크를 사용하여 번들을 빌드한 다음 펠릭스 런타임 환경에 배포해 보겠습니다. 간단한 스프링 기반 구성을 통해 코어 OSGi 프레임워크 의존성을 제거하는 방법을 볼 수 있습니다.

소개

이 글에서는 연재의 Part 1에서 개발한 주문 애플리케이션을 다시 사용하지만 이번에는 스프링 DM을 사용하여 번들을 빌드하고 패키지한다. 애플리케이션 클라이언트가 서비스 컴포넌트를 호출하여 주문을 처리하고 서버 컴포넌트가 주문 ID를 인쇄한다. 이 글을 읽은 후에는 스프링 DM에 대한 개념과 펠릭스 기반 OSGi 컨테이너와 함께 사용하는 방법을 이해할 수 있다.

시스템 요구사항

이번 글의 예제를 실행하려면 다음 소프트웨어가 컴퓨터에 설치, 설정되어 있는지를 확인해야 한다.

  • Java 5 이상
  • 앤트(Ant) 빌드 도구
  • 펠릭스 바이너리 배포판 1.0.4
  • 스프링 DM 번들

위 소프트웨어를 모두 설치한 후 환경 변수를 설정한다. (예를 들어, ANT_HOME=C:\apache-ant-1.7.0을 설정한다.)

  • JAVA_HOME(자바에 대한 설정)
  • ANT_HOME(앤트에 대한 설정)

다음으로 PATH 환경 변수에 다음 항목을 추가한다.

  • JAVA_HOME\bin
  • ANT_HOME\bin

스프링 DM

스프링 DM에는 스프링 애플리케이션을 OSGi 환경에 배포하는 데 유용한 JAR 또는 번들이 있다. 스프링 DM 기반 애플리케이션에서는 OSGi 환경에서 제공하는 서비스를 사용할 수 있다. 이러한 유형의 애플리케이션을 사용하면 OSGi 기반 애플리케이션을 간편하게 개발할 수 있다. 스프링 DM은 OSGi 환경에서 다음과 같은 장점을 가지고 있다.

  • 애플리케이션을 동적 번들로 모듈화하고 이러한 번들에 런타임 서비스를 제공한다.
  • 모듈에 대한 버전 지정 기능을 제공한다.
  • 모듈을 동적으로 검색 및 사용할 수 있는 서비스로 번들할 수 있다.
  • 모듈을 동적으로 설치, 갱신 및 설치 제거할 수 있다.
  • 스프링 프레임워크를 활용하여 애플리케이션을 OSGi 모듈로 구성할 수 있다.
  • 비즈니스 로직과 구성이 분리되어 있기 때문에 개발 작업을 쉽고 편하게 수행할 수 있다.

다시 보는 주문 애플리케이션

이 연재의 Part 1에서 개발한 주문 애플리케이션을 다시 보면 클래스가 OSGi 프레임워크와 강력하게 연결되어 있음을 알 수 있다. 이제 강력한 연결을 제거한 후 스프링 DM을 사용하여 클래스를 단순한 POJO로 만들 것이다. 다음은 개정된 OrderClient.java이다.


Listing 1. 클라이언트 컴포넌트 OrderClient
package order.client;

import order.OrderService;

public class OrderClient {

	private OrderService orderService;

	public void setOrderService(OrderService orderService) {
		this.orderService = orderService;
	}

	public void removeService() {
		this.orderService = null;
	}

	public void start() {
		orderService.processOrder();
	}

	public void stop() {
		System.out.println("Bundle stopped");
    }

}
			

OSGi 프레임워크 의존성이 완전히 제거되었다. 이 클래스는 일반 POJO이며 단순히 주문을 처리하는 start() 메소드를 가지고 있다. ServiceTracker 클래스는 사용하지 않는다.


Listing 2. OrderService 구현
package order.impl;

import order.OrderService;

public class OrderServiceImpl implements OrderService {

	public void start() {
		System.out.println("Order Service registered");
    }

	public void stop() {
		System.out.println("Order Service stopped");
    }

	public void processOrder() {
		System.out.println("Order id: ORD123") ;
	}
}
			

마찬가지로 위의 OrderServiceImpl도 processOrder() 메소드를 가지고 있는 간단한 POJO이며 OSGi 코어 컴포넌트와는 연관되어 있지 않다. 클라이언트 및 서비스 클래스 모두 BundleActivator를 구현하지 않는다. 이 경우 번들 생명주기는 스프링 DM에서 관리한다.

그렇다면 이러한 간단한 POJO가 OSGi 컴포넌트로 어떻게 작동하는 것일까? 스프링 구성 파일에 그 비밀이 숨어 있다. 이 파일에 OSGi 파트를 정의하는 것이다.

하지만 XML 파일을 정의하기 전에 Manifest 파일에 몇 가지 변경 사항이 적용되었다. Manifest 파일은 스프링 DM 파일을 포함할 import 패키지를 포함한다. 이렇게 하면 스프링이 OSGi 번들에 관한 관리 작업과 생명주기를 처리하게 된다. 아래 코드에서는 서비스 및 클라이언트 Manifest 파일을 보여 준다.


Listing 3. 서비스 Manifest
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Order Service
Bundle-SymbolicName: orderservice
Bundle-Version: 1.0.0
Import-Package: org.springframework.beans.factory.xml, 
org.springframework.aop, org.springframework.aop.framework, 
org.aopalliance.aop, org.xml.sax, org.osgi.framework, 
org.springframework.osgi.service.importer.support, 
org.springframework.beans.propertyeditors, 
org.springframework.osgi.service.exporter.support, 
org.springframework.osgi.service.exporter
Export-Package: order
			


Listing 4. 클라이언트 Manifest 파일
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Order Service Client
Bundle-SymbolicName: orderclient
Bundle-Version: 1.0.0
Import-Package: org.springframework.beans.factory.xml, 
org.springframework.aop, org.springframework.aop.framework, 
org.aopalliance.aop, org.xml.sax, org.osgi.framework, 
org.springframework.osgi.service.importer.support, 
org.springframework.beans.propertyeditors, 
org.springframework.osgi.service.importer, 
org.springframework.osgi.service.exporter.support, 
order
			

서비스 및 클라이언트 컴포넌트 각각에 대해 두 개의 XML 파일을 작성한다. 서비스의 경우, orderservice.xml XML 파일은 주문 서비스 구현 bean을 정의하고 orderservice-osgi.xml XML 파일은 주문 서비스 인터페이스를 정의하고 해당 구현을 참조한다. 이와 마찬가지로 클라이언트의 경우에도 XML 파일이 주문 클라이언트 bean을 정의하고 주문 서비스 컴포넌트를 참조한다. 서비스 및 클라이언트 XML 파일은 해당 META-INF/spring 폴더에 있다. 아래 코드에서는 서비스 XML 파일을 보여 준다.


Listing 5. 서비스 XML 파일 orderservice.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans 
  http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean name="orderService" class="order.impl.OrderServiceImpl"/>

</beans>
			


Listing 6. 서비스 OSGi XML 파일 orderservice.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans 
  http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean name="orderService" class="order.impl.OrderServiceImpl"/>
</beans>
			

실제로 한 XML 파일에서 bean 및 OSGi 정의를 모두 제공할 수 있다. 두 파일을 별개로 작성할 필요는 없지만 여기에서는 인터페이스 정의와 구성을 구분하기 위해 두 파일을 별개로 작성한다. 이렇게 하면 더욱 쉽게 파일을 관리할 수 있다. 스프링 기반 구성의 장점은 OSGi 컨테이너 외부에서 주문 서비스 bean을 테스트할 수 있다는 것이다.

이 작업을 실제로 수행하려면 관련 스프링 DM jar을 펠릭스에 설치해야 한다.


Listing 7. 펠릭스 구성의 일부
felix.auto.start.1= \
 file:/felix-1.0.4/bundle/org.apache.felix.shell-1.0.1.jar \
 file:/felix-1.0.4/bundle/org.apache.felix.shell.tui-1.0.1.jar \
 file:/felix-1.0.4/bundle/org.apache.felix.bundlerepository-1.0.3.jar \
 file:/osgi_spring/order/springlib/aopalliance.osgi-1.0-SNAPSHOT.jar \
 file:/osgi_spring/order/springlib/jcl104-over-slf4j-1.4.3.jar \
 file:/osgi_spring/order/springlib/log4j.osgi-1.2.15-SNAPSHOT.jar \
 file:/osgi_spring/order/springlib/org.apache.felix.main-1.0.1.jar \
 file:/osgi_spring/order/springlib/slf4j-api-1.4.3.jar \
 file:/osgi_spring/order/springlib/slf4j-log4j12-1.4.3.jar \
 file:/osgi_spring/order/springlib/spring-aop-2.5.1.jar \
 file:/osgi_spring/order/springlib/spring-beans-2.5.1.jar \
 file:/osgi_spring/order/springlib/spring-context-2.5.1.jar \
 file:/osgi_spring/order/springlib/spring-core-2.5.1.jar \
 file:/osgi_spring/order/springlib/spring-osgi-core-1.0.2.jar \
 file:/osgi_spring/order/springlib/spring-osgi-extender-1.0.2.jar \
 file:/osgi_spring/order/springlib/spring-osgi-io-1.0.2.jar
			

위에서 살펴본 것처럼 펠릭스 구성 파일에서 스프링 DM 번들을 정의할 수 있다. 스프링 DM 번들을 다운로드하여 원하는 폴더에 저장할 수 있다. jar을 적절한 폴더에 저장한 후 펠릭스 구성 파일에 관련 항목을 추가하여 펠릭스를 시작할 때 이러한 jar이 설치되도록 지정한다.

그런 다음 펠릭스 런타임 환경에 클라이언트 및 서비스 번들을 설치하는 단계를 진행할 수 있다. 설치가 완료되면 번들을 시작 및 중지할 수 있고 동일한 결과를 볼 수 있어야 한다. 이번에는 펠릭스 기반 OSGi와는 달리 스프링 DM이 번들 생명주기를 관리한다.

결론

스프링 프레임워크의 장점은 OSGi 애플리케이션을 보다 쉽고 효과적으로 개발할 수 있다는 것이다. 또한 OSGi 자체는 자바 애플리케이션을 번들로 만드는 방법을 혁신적으로 개선했다. 스프링과 관련하여 OSGi는 엔터프라이즈급 애플리케이션의 개발을 위한 견고한 기반을 제공한다.





위로


다운로드 하십시오

설명이름크기다운로드 방식
OSGi Spring Order Applicationosgispring_orderapp.zip11KBHTTP
다운로드 방식에 대한 정보


참고자료



필자소개

Naveen Balani

Naveen Balani는 IBM 인도 소프트웨어 랩(ISL)에서 아키텍트로 일하며 ISL의 WebSphere Business Services Fabric에 대한 설계와 개발 활동을 이끌고 있다. 새로운 기술을 연구하길 좋아하며 웹 서비스, ESB, JMS, SOA, 아키텍처, 오픈 소스 프레임워크, 시맨틱 웹, J2ME, 편재형 컴퓨팅(pervasive computing), 스프링, Ajax와 다양한 IBM 제품 등의 주제에 대해 IBM developerWorks에 지속적으로 기고하고 있다. 또한 그는 Beginning Spring Framework 2와 Getting Started with IBM WebSphere Business Services Fabric V6.1의 공동 저자이기도 하다.


Rajeev Hathi

Rajeev Hathi는 J2EE 플랫폼의 소프트웨어 컨설턴트로 일해왔다. 그의 관심사는 J2EE 기반 애플리케이션의 아키텍처 수립과 설계다. 웹 서비스에 대해서도 관심이 높은 그는 SOA 개념을 적용하고 전파하기를 좋아하며 스포츠를 보고, 록 음악을 듣는 걸 즐긴다.




기사에 대한 평가


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



 


 


 


이 문서 북마킹 하기

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





위로


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