Notice
Recent Posts
Recent Comments
Link
passion and relax
[JAVA] 18. 분산 컴퓨팅 (RMI와 서블릿, EJB와 지니) 본문
RMI (Remote Method Invocation = 원격 메소드 호출)
어느 힙에 들어있는 객체가 다른 힙에 있는 객체의 레퍼런스를 이용하는 방법
소켓을 사용하는 방법은 너무 후진 방법이다.
EJB와 JINI에서는 RMI가 기본이다.
클라이언트 객체 - 클라이언트 보조객체(helper) - 서비스 보조객체(helper) - 서비스 객체
JRMP와 IIOP 규약 사용
. JRMP : 자바-자바간만의 규약. RMI용 규약. CORBA에 비해 용이하다.
. IIOP : 자바든 아니든 원격 객체간 호출 규약. CORBA용 규약 (Common Object Request Broker Architecture)
JRMP의 RMI
클라이언트 보조객체(Stub : 구루터기, 토막) - 서비스 보조객체(Skeleton : 골격, 해골, 뼈대)
RMI 원격 서비스 만드는 과정
. 1단계 : 원격 인터페이스 생성
. 2단계 : 원격 인터페이스를 구현한 클래스 생성
. 3단계 : rmic를 이용한 스터브, 스켈레톤 생성
. 4단계 : rmiregistry 시작
. 5단계 : 원격 서비스 시작
RMI 원격 서비스 만들기 - 1단계 : 원격 인터페이스 생성
public interface MyRemote extends Remote {
public String sayHello() throw RemoteException;
}
. 인자나 리턴값은 반드시 원시유형이거나 Serializable 유형이어야 한다.
. 네트워크를 통해 전달해야 하므로 직렬화가 필요하다.
RMI 원격 서비스 만들기 - 2단계 : 원격 인터페이스를 구현한 클래스 생성
public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote {
public String sayHello() {
return "Server says..";
}
//상위 생성자에서 예외를 선언하기에 하위에서도 이처럼 thorws를 해줘야 한다.
public MyRemoteImple() throws RemoteException { }
psvm {
try {
MyRemote service = new MyRemoteImpl();
Naming.rebind("Remote Hello", service);
} catch (Exception ex) {
}
}
}
RMI 원격 서비스 만들기 - 3단계 : rmic를 이용한 스터브, 스켈레톤 생성
rmic MyRemoteImpl
. 스터브와 스켈레톤을 자동으로 생성해주는 rmic 명령
. 스터브 : MyServiceImpl_Stub.class 생성
. 스켈레톤 : MyServiceImpl_Skel.class 생성
RMI 원격 서비스 만들기 - 4단계 : rmiregistry 시작
rmiregistry
. 터미널 열고, classes 디렉토리에서 위와 같이 명령 내리면 시작된다.
RMI 원격 서비스 만들기 - 5단계 : 원격 서비스 시작
다른 터미널 열고, 아래 처럼 명령 내리면 드디어 RMI 원격 서비스가 시작된다.
java MyRemoteImpl
RMI 클라이언트 - 클라이언트에서 스터브 객체 받기
준비
. 클라이언트 클래스가 있는 곳에 스터브 클래스를 넣어야 한다.
그냥 서버에서 만들어진 스터브를 복사하기도 하고..
고급 기술로서 동적 클래스 다운로딩을 사용할 수도 있다. (필요하면 인터넷 찾아봐라)
클라이언트 스터브 객체 받기 코드
public class MyRemoteClient {
public void go() {
try {
MyRemote service = (MyRemote) Naming.lookup("rmi://127.0.0.1/Remote Hello");
String s = service.sayHello();
sout(s);
} catch (Exception ex) {}
}
psvm {
new MyRemoteClient().go();
}
}
Servlet
Http 웹서버에서 웹서버와 함께 돌아가는 자바 프로그램
클라이언트의 요청에 따라 필요한 작업을 처리하기 위해 서버에서 실행되는 코드
서블릿에서 RMI 사용이 가능하다.
J2EE 기술은 서블릿 + EJB 이다
이때 서블릿은 RMI 클라이언트가 되고, EJB는 RMI 서비스가 된다.
서블릿에서는 RMI를 이용하여 EJB와 정보를 주고 받는다.
Servlet : 만들고 실행하기 (넷빈즈로 할테지만, 여기서는 개념만 익혀라)
서블릿 저장 위치 파악
Servlet.jar를 인터넷에서 구해서, 클래스 경로에 추가하라.
HttpServlet을 확장한 서블릿 클래스 생성
public class MyServlet extends HttpServlet {
//GET 메시지 처리용 메소드.. 오버라이드한후 사용한다.
public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServeltException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String msg = "hahaha";
out.println("<HTML><BODY>" + msg + "</BODY></HTML>);
out.close();
}
//POST 메시지 처리용 메소드는 doPost();
}
<a href="Servlets/MyServlet">go servlet</a>
아마 이 외에도 web.xml 등의 작업이 필요할 것이다. 서버마다 다르겠지만..
EJB (Enterprise JavaBeans) : 초강력 RMI
RMI를 아주 강력하게 만들어 준것이 EJB다.
RMI가 대규모 기업용 App를 만들 수 있는 도구가 되도록 해 준 것이 EJB다.
즉, RMI를 이용하여 대규모 기업용 App를 만들도록 해주는 도구이다.
트랜젝션, 보안, DB관리, 네트워킹 등 RMI의 부족한 부분을 채워준다.
J2EE (Java2 Enterprise Edition) = 웹서버 + EJB 서버
EJB : 흐름 개요
클라이언트 (같은 J2EE 서버에서 돌아가는 서블릿이 클라이언트가 될 것이다.)
클라이언트 객체
클라이언트 보조객체 ( = RMI 스터브)
서버
서비스 보조객체 ( = RMI 스켈레톤)
EJB 객체 : 엔터프라이즈 빈과 EJB 서버에서 제공하는 모든 기능(보안, 트랜잭션)에 대한 호출을 가로챈다.
엔터프라이즈 빈 : DB 접근 등 실제 작업 처리가 담김
EJB 서버 제공 기능 : 보안, 트랜잭션
* 엔터프라이즈 빈 객체는 EJB 객체에 의해 클라이언트에 의한 직접 접근으로 부터 보호 받는다.
JINI
EJB가 RMI를 강력하게 만들었다면, 지니는 RMI에 날개를 달아 준 것.
어댑티브 디스커버리 (adaptive discovery)
자가치유 네트워크 (self-healing network)
'프로그래밍' 카테고리의 다른 글
[JAVA] 20. Library - JRI (1) | 2024.06.07 |
---|---|
[JAVA] 19. 거의 본문에 들어갈 뻔 했던 내용 (0) | 2024.06.05 |
[JAVA] 17. 코드를 배포합시다 (패키지 제작과 배포) (1) | 2024.06.04 |
[JAVA] 16. 자료구조 (컬렉션 및 제네릭) (0) | 2024.06.04 |
[JAVA] 15. 연결하는 방법 (네트워크 소켓과 멀티스레딩) (0) | 2024.06.04 |