지난 몇 년간 엔터프라이즈 어플리케이션 개발 분야에서 스프링은 사실상의 표준으로 자리잡았으며 지금도 그 영역을 무한대로 확장해 나가고 있다. 요즘은 스프링 없이 자바기반의 엔터프라이즈 어플리케이션을 개발한다는 건 거의 상상도 하지 못할 일이 되어 버렸다.
그 중에 오늘 소개할 스프링 리모팅 기술은 EJB의 특징적 기능이었던 분산 애플리케이션 개발을 스프링에서도 가능하게 해주는 기술이다. 즉, 리모팅 기능을 사용하면 여러 노드에 분산되어 배포된 기능들을 마치 로컬에 있는 함수를 호출하듯 사용할 수 있게 된다.
EJB2 기반의 애플리케이션 서버에서는 분산 어플리케이션 구성을 위해 RMI/IIOP 구현체를 제공했지만 스프링에서는 RMI외에도 다양한 방식을 제공한다. 단, 스프링 기반의 리모팅의 경우 EJB와는 달리 분산 트랜잭션까지 지원하지는 않는다.
스프링은 다음과 같은 방식의 리모팅 프로토콜을 지원한다.
- RMI (Remote Method Invocation) - RMIProxyFactoryBean과 RmiServiceExporter를 이용한다.
- 스프링의 Http Invoker - HTTP 프로토콜을 이용하며 , 전송하는 객체는 Serialization이 되어야한다. 또한 원격 접근을 위한 메소드는 인터페이스를 통해 선언되어야 한다. HttpInvokerFactoryBean과 HttpInvokerServiceExporter 클래스를 이용한다.
- Hessian - Http기반의 경량 바이너리 프로토콜을 사용한다. HessianProxyFactoryBean 과 HessianServiceExporter 을 이용한다. (http://hessian.caucho.com/)
- Burlap - Hessian의 XML 버전, BurlapProxyFactoryBean 과 BurlapServiceExporter을 이용한다.
그 외에도 스프링은 리모팅을 위해 JAX-RPC, JAX-WS, JMS등의 프로토콜을 지원한다. 스프링 리모팅 기능을 사용하는 방법은 무척이나 간단하다. 서비스를 노출하는 서버 부분과 서비스를 사용하는 클라이언트 부분에서 적절한 설정을 추가하면 끝이다. 다음은 Http Invoker를 사용할 때 서버측 설정과 클라이언트 설정이다.
> 서버측
<bean name="/RemoteService" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
<property name="service" ref="ServiceBean"/>
<property name="serviceInterface" value="package.ServiceInterface"/>
</bean>
> 클라이언트 측
<bean id="ServiceBean"
class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<property name="serviceUrl"
value="http:/hostname:8080/context-root/RemoteService" />
<property name="serviceInterface" value=" package.ServiceInterface " />
</bean>
이 설정에 추가적으로 web.xml에 DispatchServlet을 선언하고 서비스를 노출할 URL 패턴을 지정하면 끝이다. 만약, 스프링 MVC를 이미 사용하고 있다면 이 설정은 굳이 할 필요가 없다.
> web.xml
<servlet>
<servlet-name>remote-service</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/remoteApplicationContext.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>remote-service</servlet-name>
<url-pattern>/remote/*</url-pattern>
</servlet-mapping>
다음은 여러 리모팅 방법에 성능을 측정한 자료이다. 좀 옛날 자료이긴 한데 적용할 컨텍스트에 맞는 리모팅 방법을 선택할 때 한 번 쯤 참고하면 되겠다.