IT_Programming/Dev Tools

[펌] RMI Plug-in for Eclipse를 이용한 RMI Test 환경 만들기

JJun ™ 2011. 3. 18. 10:26

-----------------------------------------------------------------------------------------------

출처: http://blog.bagesoft.com/646

-----------------------------------------------------------------------------------------------


또 오래만에 전공관련해서 포스팅을 하는 것 같다. 이래뵈도 명색이 소프트웨어전공이고 개발도인데

아직 많이 부족하다보니 이렇게 글을 쓰는게 사실 쉽지는 않지만 뭐 그래도 일단 시작해보자.

오늘 설명할 것은 Java RMI 테스트 환경을 보다 편하기 위한 방법이다. 여기서 RMI가 무엇인지 잘 모르는 사람을 위해 설명을 해주자면 Remote Method Invocation의 약자로 다른 머신, 즉 원격지에 있는 개체의

메소드를 마치 실제 내 힙(heap)에 있는 개체인냥 호출 하거나 실행하는 기술을 이야기한다.
 

 

그림을 보면 RMI를 보통 위와 같은 구조로 되어있는데 기본적으로 서버에 개체를 사용하기 위해 위와 같이 그 해당 개체를 RMI 서비스에 등록을 해야한다. 그래야 저기 보이는 스켈레톤이 생기면서 클라이언트에서 그것을 대신 사용할 수 있게 되는 시나리오인데 문제는 이때 서비스를 등록해야 한다는 게 좀 귀찮다. (

최근 버전에서는 저기 있는 스텁, 스켈레톤이 필요가 없다)


특히 보통 Java 코딩할 때 많이 쓰는 Eclipse 에서는 기본적으로 지원하는 기능이 아니기 때문에 안 그래도 귀찮은걸 싫어하는 프로그래머로써는 매번 프로젝트를 할때마다, 혹은 실행할때마다 별도 설정하는건

더더욱 귀찮더라.

그래서 여기서는 eclipse에서 간단히 설정하고 매번 실행할때 기존의 Eclipse를 사용하듯 하는 방법을

소개할까한다.

필요한 것


* JDK - Get Sun's latest JDK (currently 5.0)  - 당연히 있어야죠?
* Eclipse - Get latest Eclipse 3.2.1              - Eclipse 플러그-인 인데 이것도 당연?
* RMI Plug-in for Eclipse v2.0                     - 우리가 쓸 플러그-인!!

설치방법


JDK나 Eclipse는 다들 설치했을테니 RMI Plug-in 설치 방법만 설명한다.

기본적으로 Eclipse에서 플러그-인의 설치는 두가지 방법이 있다. 하나는 Eclipse의 내부에서 지원하는 update/install 기능을 사용하거나 다른 하나는 해당 플러그-인을 다운받아 직접 수동으로 설치하는 방법이 있는데 update/install 사이트를 홈페이지에서 제공한다면 이 기능을 사용하는게 편하다. 


RMI plug-in은 그 사이트를 지원하는데 주소는 아래와 같다. 자세한 설치 방법은 아래의 문서를 이용하면 친절히 그림까지 제공해서 편하다. (영어다 참고로..)

설치 주소 : http://www.genady.net/rmi/v20/update/

설치 문서 : http://www.genady.net/rmi/v20/docs/installation/update_install.html

사용방법


  우선 RMI를 이용한 Application의 프로젝트를 만든다. (난 RMITest)

 



각각의 내용을 코딩한다. 
(난 Server랑 Client랑 따로 패키지를 만든 후 클라이언트에서 서버를 접근해 List를 갱신하고

 그 내용을 받아서 출력하는 간단한 프로그램을 만들었다)

 



테스트를 하기 위해 "Start Local Registry(1099)" 눌려서 해당 개체를 등록시킬 수 있는 레지스트리를

작동시킨다.

 


이제 Run → RMI Application → RMI VM Properties 에 붉은 색의 "java.server.codebase" <Empty>

누른뒤 Add Pick From workspace 우리가 만들어 놓은 프로젝트 선택 Ok OK 하게 되면

아까 붉은 색이었던 codebase에 뭔가 적혔다. 그럼 된것이다.  apply -> Run 해보자.

 

 

돌려보면 아래의 사진처럼 등록된 개체의 이름의 나오고 등록이 되었다는 성공적인 메시지가 나온다.

이제 클라이언트를 일반 Application으로 돌리면 끝!

 


처음 프로젝트를 생성할때 이런 세팅만 해놓고 프로그램을 업데이트하고

그냥 Eclipse에서 프로그램 실행하듯 사용하면 된다. 

한 가지 팁을 알려준다면 이것을 사용하면서 알수 없는 에러가 발생할때는 프로젝트 폴더를 선택한 후

마우스 오른쪽 RMI Remove RMI problem report 를 하면 사라질 수도 있다.

예제코드

 

간단한 RMI 예제 코드를 올려놓긴 하겠지만 그래도 각자 알아보는게 더 좋을 것같다.

 

Common 코드

  1. package Common;
  2. import java.rmi.Remote;
  3. import java.rmi.RemoteException;
  4. public interface TestServerRemote extends Remote
  5. {
  6.   public void addString(String str) throws RemoteException;
  7.   public String[] getStrings() throws RemoteException;
  8. }



 

Client 코드
  1. package Client;
  2. import java.net.MalformedURLException;
  3. import java.rmi.Naming;
  4. import java.rmi.NotBoundException;
  5. import java.rmi.RemoteException;
  6. import Common.TestServerRemote;
  7. public class ClientStarter
  8. {
  9.   public static void main(String[] args) throws MalformedURLException, RemoteException, NotBoundException
  10.   {
  11.     String url = "rmi://127.0.0.1/Server";
  12.     TestServerRemote server = (TestServerRemote)Naming.lookup(url);
  13.    
  14.     server.addString("안녕");
  15.     server.addString("RMI는 신기한가?");
  16.     server.addString("뭐 아무튼 예제");
  17.    
  18.    
  19.     String[] list = server.getStrings();
  20.    
  21.     System.out.println(list.length);
  22.     for(int i = 0; i < list.length; i++)
  23.     {
  24.       System.out.println(list[i]);
  25.     }
  26.   }
  27. }

 


Server 코드
  1. package Server;
  2. import java.net.MalformedURLException;
  3. import java.rmi.Naming;
  4. import java.rmi.RemoteException;
  5. public class ServerStarter
  6. {
  7.   public static void main(String[] args) throws RemoteException, MalformedURLException
  8.   {
  9.     TestServer server = new TestServer();
  10.    
  11.     Naming.rebind("Server", server);
  12.    
  13.     System.out.println("등록 완료");
  14.   }
  15. }
 
  1. package Server;
  2. import java.rmi.RemoteException;
  3. import java.rmi.server.UnicastRemoteObject;
  4. import java.util.ArrayList;
  5. import java.util.Iterator;
  6. import Common.TestServerRemote;
  7. public class TestServer extends UnicastRemoteObject implements TestServerRemote
  8. {
  9.   protected TestServer() throws RemoteException
  10.   {
  11.     super();
  12.   }
  13.   private ArrayList<String> list = new ArrayList<String>();
  14.   public void addString(String str) throws RemoteException
  15.   {
  16.     list.add(str);
  17.   }
  18.   public String[] getStrings() throws RemoteException
  19.   {
  20.     String[] result = new String[list.size()];
  21.     int i = 0;
  22.    
  23.     Iterator<String> it = list.iterator();
  24.     while(it.hasNext())
  25.     {
  26.       result[i++] = it.next();
  27.     }
  28.     return result;
  29.   }
  30. }