RMI + Spring

Remoting 기능을 지원해줍니다. 스프링을 사용하면 매우 간단하게 RMI를 사용할 수 있습니다.

서비스를 제공하는 쪽

1. POJO로 서비스 인터페이스 구현체 개발
2. RmiServiceExporter 등록하기

인터페이스는 더이상 Remote 인터페이스를 확장하지 않아도 됩니다.

package chapter8.client;

public interface EchoService {

    // word를 세 번 반복한 문자열을 반환합니다.
    String say(String word);
}

구현체의 메소드들은 더이상 RemoteException을 던지지 않아도 됩니다.

package chapter8.server;

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 id=”echoService” class=”chapter8.server.EchoServiceImpl” />

    <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으로 설정합니다.

테스트 코드입니다.

package chapter8;

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를 사용하고 있습니다.

package chapter8.client;

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=”keesun” class=”chapter8.client.Keesun” />

    <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을 생성하면되겠죠.

package chapter8;

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를 실행해 줍니다.

사용자 삽입 이미지