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

 

Posted by wychoi
,