RMI + Spring
Remoting 기능을 지원해줍니다. 스프링을 사용하면 매우 간단하게 RMI를 사용할 수 있습니다.
서비스를 제공하는 쪽
1. POJO로 서비스 인터페이스 구현체 개발
2. RmiServiceExporter 등록하기
인터페이스는 더이상 Remote 인터페이스를 확장하지 않아도 됩니다.
public interface EchoService {
// word를 세 번 반복한 문자열을 반환합니다.
String say(String word);
}
구현체의 메소드들은 더이상 RemoteException을 던지지 않아도 됩니다.
import chapter8.client.EchoService;
public class EchoServiceImpl implements EchoService {
public String say(String word) {
StringBuilder builder = new StringBuilder(word);
for (int i = 0; i < 2; i++) {
builder.append(word);
}
return builder.toString();
}
}
스프링 설정 파일에 서비스 구현체와 Exporter를 설정해줍니다.
<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="service" ref="echoService" />
<property name="serviceName" value="EchoService" />
<property name="serviceInterface"
value="chapter8.client.EchoService" />
</bean>
RmiServiceExporter가 기본으로 로컬에 1099 포트에 RMI 레지스트리가 있는지 확인하고 있으면 서비스를 등록하고, 없으면 RMI 레지스트리를 새로 만들어 실행한 다음 서비스를 추가합니다. 이 모든일을 알아서 해주기 때문에 개발자는 할 일이 없습니다.(하고 싶다면, 레지스트리 위치 설정과 포트 설정을 할 수 있겠죠. 그 때는 registryHost 속성과 registryPort 속성에 원하는 값을 설정해 주면 됩니다.)
서비스를 사용하는 쪽
1. 마치 서비스가 로컬에 존재하는 듯이 코딩합니다.
2. 스프링 설정 파일에서 RmiProxyFactoryBean을 사용하여 원하는 서비스를 bean으로 설정합니다.
테스트 코드입니다.
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
import chapter8.client.Keesun;
public class KeesunTest extends AbstractDependencyInjectionSpringContextTests {
@Override
protected String[] getConfigLocations() {
return new String[] { "chapter8/client/springContext.xml" };
}
private Keesun keesun;
public void setKeesun(Keesun keesun) {
this.keesun = keesun;
}
public void testDI() throws Exception {
assertNotNull(keesun);
}
public void testEcho() throws Exception {
String echoResult = keesun.yaahoo("Spring");
assertEquals("SpringSpringSpring", echoResult);
}
}
Keesun 이란 클래스가 EchoService를 사용하고 있습니다.
public class Keesun {
private EchoService echoService;
public void setEchoService(EchoService echoService) {
this.echoService = echoService;
}
public String yaahoo(String word){
return echoService.say(word);
}
}
마지막으로 스프링 설정 파일에 Keesun과 EchoService를 bean으로 등록해 줍니다.
<bean id="echoService"
class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl"
value="rmi://localhost/EchoService" />
<property name="serviceInterface"
value="chapter8.client.EchoService" />
</bean>
확인하기
1. Server 실행하기
2. Test 코드(Client) 실행하기.
레지스트리 서버를 동작시키려면 서비스를 제공하는 측 스프링 설정 파일을 읽어들이면서 Exporter bean을 생성하면되겠죠.
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class EchoServiceServer {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("chapter8/server/springContext.xml");
}
}
다음은 위에서 작성했던 KeesunTest를 실행해 줍니다.