RMI(Remote Method Invocation) :
- 네트워크상에 있는 원격컴퓨터의 객체의 메소드를 호출하는 JAVA의 분산처리 방법. / 네트워크로 연결되어 다른 컴퓨터에 존재하는 메소드를 마치 내 컴퓨터에 있는 듯이 호출해서 사용 가능하게 만들어주는 것(java.rmi package)
- 분산되어 존재하는 객체 간의 메시지 전송(메소드를 호출하는 것 포함)을 가능하게 하는 프로토콜. - 현대 시스템 개발은 3계층 시스템이 주류로 이루고, 이 3계층인 Database, Application, Client 모두 객체를 통하여 구현하고 저장하는 일이 많아짐. 그래서 이렇게 분산되어 존재하는 객체간의 메시지 전송을 할 필요가 생겼고 이를 가능하게 하는것이 RMI 프로토콜.
- RMI 자체는 분산객체간의 통신을 구현하는 모든 프로토콜을 의미함. (RMI는 JAVA RMI 이전부터 쓰여지던 단어로써 분산객체를 개념을 구현하는 CORBA, DCOM 등을 포함하는 의미)
두개의 컴퓨터가 있을 때, 서버와 클라이언트라고 가정하고 자바와 JVM이 설치되어 있을때, 그렇다고 해서 클라이언트가 마음대로 서버 내 객체 메소드를 가져다 쓸 수 있는건 아님. RMI를 이용하면 이 작업들이 가능해짐.
JAVA RMI을 쓰는 이유
- 구현하기 쉬움 : 보통 네트워크 프로그래밍을 하려면 보통 소켓을 많이 씀. 하지만 소켓으로는 프로토콜을 구현하기가 매우 까다롭고 힘듦. 하지만 Java RMI는 Socket 통신 자체를 하부에 숨기고, 상위 레벨에서 수행하여, 분산 객체 간의 데이터 전송을 메소드로 부르는 것과 같은 방법으로 구현하기 때문에 훨씬 구현하기 쉬움.
- 신뢰성이 보장됨 : 상위 레벨의 통신계층에서 수행하기 때문에 통신에 대한 신뢰성이 확보되고 또한 자바 자체에서 제공하는 라이브러리이기 때문에 역시 신뢰성 보장됨.
- Java 플랫폼을 사용함 : 자바의 RMI는 JVM에서 언제든 활용하고 사용할 수 있음. 단, 동종의 Java가 아니면 제약이 있을 수 있음. (ex. Sun사의 java와 gnu의 java 간의 RMI 일 때)
Client, Server : 우리가 일반적으로 쓰는 객체 사용
보조객체(RMI class) : 자바 RMI 기술을 이용해 만들어진 객체 (java.rmi 객체)
실제로 클라이언트 서버 통신을 해주는 객체들은?
클라이언트 보조 객체 : RMI stub
서버 보조 객체 : RMI skeleton
장점 : Networking, 입출력 코드를 직접 만들 필요가 없어짐. 그리고 원격 메소드를 호출할 때, 내부 호출과 같은 방법으로 호출이 가능.
과정
Server는 먼저 이름을 가지고 Registry에 bind를 해야 함. > Client가 원격 참조를 설정하기 위해 레지스트리에서 서버 이름을 조회함 > stub은 parameter를 skeleton에게 직렬화하여 원격 메소드를 호출하고 결과를 다시 직렬화하여 stub에게 돌려줌.
프롬프트 창에서 rmic + ServerImpl(Server를 implement하는 파일)을 해서 stub file을 만들고 사용하고자 하는 Client쪽에 stub file을 준다. + interface file도 같이 줘야 함. 주고난 후에 서버쪽에서 rmiregistry를 해서 서버를 준비해 준다. Server Chatting file 컴파일해서 실행해주고 Client쪽 Naming의 lookup함수를 사용해서 실행시켜준다.
오늘 짜본 RMI 채팅 프로그램 소스코드는 아래 Git hub에
https://github.com/jungwu2503/WindowProgramming/commit/9a45ec9299654d2f77c05423308d988dae97e590
댓글