4. Spring DM을 사용하여 서비스 노출하기.
1. Spring IDE 설치
http://www.springide.com/updatesite_nightly 를 이용해서 가장 최신의 Spring IDE 플러그인을 받을 겁니다. 그런데 처음 부터 저를 따라하셨으면, Eclipse를 새로 설치하셨을텐데, 그러면 Web Tools Plugin도 설치되어 있지 않아서, Spring IDE 플러그인을 설치하려고 하면, 종속성 문제 때문에 에러가 납니다.
그럴 때는 Eclispe Discovery Site도 같이 업데이트에서 선택한 다음에, Web 폴더를 왕창 선택해 줍니다. 스샷을 찍었어야 하는데, 깜빡하고 지나가서.. pass 합니다.
2. 필요한 번들 추가.
Target Platform 하단의 Pre Defined Target Plattform에서 Spring OSGi를 선택합니다. 그러면 끝입니다.
Spring IDE에서 제공해주는 기능입니다. 저걸 선택하면, 알아서 Spring OSGi를 사용할 때 필요한 번들들을 추가해 줍니다.
id State Bundle
0 ACTIVE system.bundle_3.2.2.R32x_v20070118
1 ACTIVE org.springframework.osgi.log4j.osgi_1.2.15.SNAPSHOT
2 ACTIVE org.springframework.bundle.spring.core_2.5.1
3 ACTIVE org.springframework.osgi.aopalliance.osgi_1.0.0.SNAPSHOT
4 ACTIVE slf4j.api_1.4.3
5 ACTIVE org.springframework.osgi.junit.osgi_3.8.2.SNAPSHOT
6 ACTIVE org.springframework.osgi.source_1.0.0
7 ACTIVE org.springframework.osgi.backport-util-concurrent.osgi_3.1.0.SNAPSHOT
8 ACTIVE org.springframework.spring.source_2.5.1
9 INSTALLED org.springframework.bundle.osgi.test_1.0.0
10 ACTIVE org.springframework.bundle.spring.context_2.5.1
11 ACTIVE org.springframework.bundle.osgi.io_1.0.0
12 ACTIVE jcl104.over.slf4j_1.4.3
13 ACTIVE org.springframework.bundle.osgi.extensions.annotations_1.0.0
14 ACTIVE org.springframework.osgi.asm.osgi_2.2.3.SNAPSHOT
15 ACTIVE org.springframework.bundle.spring.beans_2.5.1
16 ACTIVE org.springframework.bundle.osgi.core_1.0.0
17 ACTIVE org.springframework.osgi.cglib-nodep.osgi_2.1.3.SNAPSHOT
18 ACTIVE org.springframework.bundle.osgi.extender_1.0.0
19 ACTIVE slf4j.log4j12_1.4.3
20 ACTIVE org.springframework.bundle.spring.aop_2.5.1
21 ACTIVE org.springframework.bundle.spring.context.support_2.5.1
osgi.test 번들이 가동이 안 됐는데 뭔가 필요한게 없나 봅니다.
osgi> diag 9
initial@reference:file:plugins/spring-osgi-test-1.0.jar/ [9]
Missing imported package org.apache.felix.framework_0.0.0.
Missing imported package org.apache.felix.main_0.0.0.
Missing imported package org.knopflerfish.framework_0.0.0.
Missing imported package org.springframework.test_2.5.0.
확인해보니, 테스트 용도라서, 그런 것 같네요. 배포할 때 테스트 번들까지 추가할 필요가 없어서 그런가 봅니다.
암튼 패스하고 계속 진행하겠습니다.
3. 서비스 노출시키기
이전에 서비스를 노출할 때는, context.registerService() 라는 메소드를 사용했었습니다. 그런데 이제는 스프링 설정 파일에 bean으로 등록하면 됩니다.
먼저, MANIFEST.MF 파일을 수정합니다. overview탭에서 Activator를 지웁니다.(소스코드에도 Activator를 지워버립니다.)
Activator 클래스는 아예 지워버립니다.
그리고 META-INF 폴더 밑에 spring 폴더를 만들고 springOSGi.xml 이라는 이름으로 파일을 만들어 줍니다. 꼭 이 이름일 필요는 없습니다. spring 폴더 밑에 있는 xml 파일을 전부 읽어 들일테니까요.
그리고 다음과 같이 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"
xmlns:osgi="http://www.springframework.org/schema/osgi"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd">
<bean id="greeting" class="service.impl.GreetingImpl" init-method="start" />
<osgi:service interface="service.Greeting" ref="greeting" />
</beans>
bean이 만들어졌는지 확인하기 위해서, init-method 속성을 사용했습니다. GreetingImpl에는 start 메소드 하나를 추가해줍니다.
public class GreetingImpl implements Greeting {
public String hi(String name) {
return "hi " + name;
}
public void start(){
System.out.println("GreetingImpl Bean을 만들었습니다.");
}
}
그리고 이 번들을 플랫폼에 올리면 다음과 같이 applicationContext가 만들어 진 것을 확인할 수 있습니다.
osgi> log4j:WARN No appenders could be found for logger (org.springframework.util.ClassUtils).
log4j:WARN Please initialize the log4j system properly.
GreetingImpl Bean을 만들었습니다.
ss
Framework is launched.
id State Bundle
0 ACTIVE system.bundle_3.2.2.R32x_v20070118
1 ACTIVE org.springframework.osgi.log4j.osgi_1.2.15.SNAPSHOT
2 ACTIVE org.springframework.bundle.spring.context.support_2.5.1
3 ACTIVE org.springframework.bundle.osgi.core_1.0.0
4 ACTIVE org.springframework.osgi.aopalliance.osgi_1.0.0.SNAPSHOT
5 ACTIVE org.springframework.bundle.osgi.extender_1.0.0
6 ACTIVE org.springframework.bundle.spring.context_2.5.1
7 ACTIVE org.springframework.osgi.cglib-nodep.osgi_2.1.3.SNAPSHOT
8 ACTIVE org.springframework.bundle.osgi.extensions.annotations_1.0.0
9 ACTIVE org.springframework.osgi.junit.osgi_3.8.2.SNAPSHOT
10 INSTALLED org.springframework.bundle.osgi.test_1.0.0
11 ACTIVE org.springframework.bundle.osgi.io_1.0.0
12 ACTIVE org.springframework.osgi.asm.osgi_2.2.3.SNAPSHOT
13 ACTIVE jcl104.over.slf4j_1.4.3
14 ACTIVE org.springframework.spring.source_2.5.1
15 ACTIVE org.springframework.bundle.spring.core_2.5.1
16 ACTIVE org.springframework.osgi.source_1.0.0
17 ACTIVE slf4j.log4j12_1.4.3
19 ACTIVE org.springframework.osgi.backport-util-concurrent.osgi_3.1.0.SNAPSHOT
20 ACTIVE org.springframework.bundle.spring.beans_2.5.1
21 ACTIVE slf4j.api_1.4.3
22 ACTIVE org.springframework.bundle.spring.aop_2.5.1
23 ACTIVE Store_1.0.0
osgi>
끝! 그냥 서비스로 제공할 클래스를 bean으로 등록한 다음에 <osgi:service/> 엘리먼트의 interface와 ref 속성으로 해당 bean을 서비스로 등록해둡니다.