원격 프록시의 역할
- 원격 프록시는 원격 객체의 로컬 대변자 역할을 합니다. 원격 객체란 다른 자바 가상 머신의 힙에서 살고 있는 객체(다른 주소 공간에서 돌아가고 있는 객체)를 뜻합니다. 로컬 대변자의 어떤 메소드를 호출하면, 다른 웡격 객체에게 그 메소드 호출을 전달해주는 객체를 로컬 대변자라고 합니다.
- 클라이언트 객체는 원격 객체의 메소드 호출을 하는 것처럼 행동합니다. 하지만 실제로는 로컬 힙에 들어있는 ‘프록시’ 객체의 메소드를 호출하고 있죠. 네트워크 통신과 관련된 저수준 작업은 이 프록시 객체에서 처리해줍니다.
원격 메소드의 기초
- 우선 우리 대신 통신을 처리해주는 보조 객체가 필요합니다. 보조 객체를 사용하면 클라이언트는 로컬 객체의 메소드만 호출하면 됩니다. 클라이언트 보조 객체(client helper)의 메소드를 호출하는 거죠.
- 클라이언트는 그 보조 객체가 실제 서비스를 제공한다고 생각합니다. 그러면 클라이언트 보조 객체가 그 요청을 원격 객체에게 전달합니다. 클라이언트 보조 객체가 클라이언트에서 호출하고자 하는 메소드가 들어있는 객체인 척하기 때문입니다.
- 하지만 클라이언트 보조 객체는 진짜 원격 서비스가 아닙니다. 진짜 서비스와 같은 메소드가 들어있으므로 진짜 원격 서비스인 것 같아 보이긴 하지만, 클라이언트에서 요구하는 실제 메소드 로직이 그 안에 들어있는 것은 아니니까요. 클라이언트 보조 객체는 서버에 연락을 취하고, 메소드 호출에 관한 정보(메소드 이름, 인자 등)를 전달하고, 서버로부터 리턴되는 정보를 기다립니다.
- 서버는 서비스 보고 객체(service helper)가 있어서, Socket 연결로 클라이언트 보조 객체로부터 요청을 받아 오고, 호출 정보를 해석해서 진짜 서비스 객체에 있는 진짜 메소드를 호출합니다. 따라서 서비스 객체는 그 메소드 호출이 원격 클라이언트가 아닌 로컬 객체로부터 들어온다고 생각하죠.
- 서비스 보조 객체는 서비스로부터 리턴값을 받아서 Socket의 출력 스트림으로 클라이언트 보조 객체에게 전송합니다. 클라이언트 보조 객체는 그 정보를 해석해서 클라이언트 객체에 리턴하죠.
자바 RMI 개요
- RMI는 우리 대신 클라이언트와 서비스 보조 객체를 만들어 줍니다. 보조 객체에는 원격 서비스와 똑같은 메소드가 들어있죠. RMI를 사용하면 네트워킹 및 입출력 관련 코드를 직접 작성하지 않아도 됩니다. 클라이언트는 그냥 같은 로컬 JVM에 있는 메소드를 호출하듯이 원격 메소드(진짜 서비스 객체에 있는 메소드)를 호출할 수 있죠.
- 또한 클라이언트가 원격 객체를 찾아서 접근할 때 쓸 수 있는 룩업(lookup)서비스도 RMI에서 제공합니다.
- RMI와 로컬 메소드 호출의 차이점도 있습니다. 클라이언트는 로컬 메소드 호출과 똑같은 식으로 메소드를 호출하지만, 실제로는 클라이언트 보조 객체가 네트워크로 호출을 전송해야 하므로 네트워킹 및 입출력 기능이 반드시 필요하다는 차이점 말이죠. 네트워킹이나 입출력 기능을 쓸 때는 문제가 발생할 위험이 따르므로 클라이언트에서 항상 예상치 못한 상황을 대비하고 있어야 합니다.
- RMI 용어
- RMI에서 클라이언트 보조 객체는 스텁(stub), 서비스 보조 객체는 스켈레톤(skeleton)이라고 부릅니다
프록시 패턴의 정의