기선님의 RMI+Spring글에 대해 Spring Framework 공부겸해서 내용을 따라 하면서 테스트를 해 보았습니다. 기선님의 블로그를 구독하면서 좋은 내용도 많이 얻고 있습니다. 좀처럼 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(); }
RmiServiceExporter
가 기본으로 로컬에 1099 포트에 RMI 레지스트리가 있는지 확인하고 있으면 서비스를 등록하고, 없으면 RMI 레지스트리를
새로 만들어 실행한 다음 서비스를 추가합니다. 이 모든일을 알아서 해주기 때문에 개발자는 할 일이 없습니다.(하고 싶다면,
레지스트리 위치 설정과 포트 설정을 할 수 있겠죠. 그 때는 registryHost 속성과 registryPort 속성에 원하는 값을 설정해 주면 됩니다.)
서비스를 사용하는 쪽
1. 마치 서비스가 로컬에 존재하는 듯이 코딩합니다. 2. 스프링 설정 파일에서 RmiProxyFactoryBean을 사용하여 원하는 서비스를 bean으로 설정합니다.
public class EchoServiceServer { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("chapter8/server/springContext.xml"); } }
다음은 위에서 작성했던 KeesunTest를 실행해 줍니다.
잘 따라 했고 오타도 없는데 왠걸 결과가 테스트에서 오류가 났습니다. 워낙에 초보인지라 이것 저것 해결을 못하다가 client측 context.xml 부분이 잘 못 되어 있다는 것을 늦게야 알았습니다. 본문은 다음과 같습니다.
Keesun Object 에서 echoService를 사용하기 위해서 setter함수에 echoService instance를 넘겨줘야 하는데 그렇지 않아서 NullPointException이 발생하고 있었던 것입니다. 매우 간단한 내용이었지만 너무도 유용한 정보였고 이제 시작이라는 시점에서 좋은 내용이라고 생각합니다. 재밌네요 ^^ 계속해서 좋은 내용 부탁드립니다.