Development/Spring

Spring Framework 과 RMI 연동

南山 2017. 8. 4. 11:02

 

Spring Framework 과 RMI 연동하기.

 

RMI 는 JDK 1.1 부터 추가되었고 한때는 CORBA, EJB 와 함께 분산 시스템을 구축하기 위한 기술로써 사용되었으나 Java 에 국한되는 단점이 있었고 SOA, ROA 등의 개념을 탑재한 다른 기술들이 널리 사용되면서 현재는 많이 사용되고 있지는 않다.

server 를 POJO 형태로 간단하게 띄우는 방법도 있고 Spring Framework 에 통합되어 제공하는 방법도 있다. POJO 샘플은 Java 책마다 기본적으로 제공되므로 Spring Framework 과 통합해서 Server / Client 로 사용하는 방법을 정리한다.
Spring Framework 에서는 RMI 기능의 많은 부분을 자동화해서 내부적으로 지원하며 개발자(사용자)는 서비스 선언부분만 구현해서 export 하면 client 에서 접근해서 사용이 가능하다.
server, client 가 각각 따로 기능하지만 아래 샘플은 server / client 를 한개의 instance 에서 모두 기능하도록 구성했다.

 

 

 

 

개발환경.

JDK 1.8

Spring Framework 4.3.7.RELEASE

Maven3

Windows 10 / MacOC

 

 

 

 

Server 구현.

 

Server 에서 제공할 기능을 구현한다. 

interface, implement 로 구현한다.

 

ErpServer.java

....

public interface ErpServer {

 

    String getReservationList(String param);

}

....

 

ErpServerImpl.java

....

@Service

public class ErpServerImpl implements ErpServer {

 

    private Logger logger = LoggerFactory.getLogger(this.getClass().getName());

    private String TAG = this.getClass().getName();

 

    /**

     *

     * @param param

     * @return

     */

    public String getReservationList(String param) {

        logger.debug("> getReservationList", TAG);

        return "hello "+ param;

    }

}

....

 

 

 

context 설정에서 구현한 기능을 RMI 를 이용해서 외부에서 사용할 수 있도록 export 해준다.

....

    <!-- Server -->

    <bean id="erpServer" class="kr.co.xxxx.ei.rmi.server.ErpServerImpl"/>

 

    <bean class="org.springframework.remoting.rmi.RmiServiceExporter">

        <property name="serviceName" value="ErpServer"/>

        <property name="service" ref="erpServer"/>

        <property name="serviceInterface" value="kr.co.xxxx.ei.rmi.server.ErpServer"/>

        <!-- 기본값은 1099 -->

        <property name="registryPort" value="1199"/>

    </bean>

....

 

 

 

 

 

Client 구현.

 

 

Server 에서 제공하는 기능의 interface 를 가져온다.

Server 를 구현한 쪽에서 Client 에게 배포해야 하며 파일복사해서 붙여넣는 방법을 사용한다. 

package 구조는 상관없다.

 

ErpServer.java

....

public interface ErpServer {

 

    String getReservationList(String param);

}

....

 

 

 

가져온 데이터를 처리하는 로직을 구현한다.

 

InterfaceUtils.java

....

    /**

     * RMI 를 통해서 ERP Interface Server 로 부터 데이터를 가져온다.

     *

     * @param param

     * @return

     * @throws Exception

     */

    public String getReservationListFromRmi(String param) throws Exception {

        logger.debug("> getReservationList", TAG);

        logger.debug("> getReservationListFromRmi : {}", erpServerClient.getReservationList(param), TAG);

 

        return erpServerClient.getReservationList(param);

    }

 

....

 

 

 

context 에 처리를 위한 설정을 추가한다.

....

    <!-- Client -->

    <bean class="kr.co.xxxx.ei.common.InterfaceUtils">

        <property name="erpServerClient" ref="erpServerClient"/>

    </bean>

 

    <bean id="erpServerClient" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"

          p:serviceUrl="rmi://localhost:1199/ErpServer"

          p:serviceInterface="kr.co.xxxx.ei.rmi.client.ErpServer" />

....

 

 

 

 

Spring Framework 에서 많은 부분을 자동화해서 제공하기때문에 간편하게 구현해서 사용할 수 있다.

Server 에서는 제공하는 기능을 interface 를 RmiServiceExporter 를 통해서 제공하고 Client 에서는 미리 정의된 URL 을 통해서 자신이 가지고 있는 (Server 로 부터 미리 전달받은)interface 로 매핑해서 사용한다.

 

단, domain object 는 반드시 직렬화(implements Serializable)해서 사용해야 한다.