원격 객체에 대한 접근은 제어 로컬 환경에 존재하며, 원격 객체에 대한 대변자 역할을 하는 객체 서로 다른 주소 공간에 있는 객체에 대해 마치 같은 주소 공간에 있는 것처럼 동작하게 만드는 패턴이다.
예시로 Google Docs를 들 수 있다. 브라우저는 브라우저대로 필요한 자원을 로컬에 가지고 있고 또 다른 자원은 Google 서버에 있는 형태이다.
- 다른 JVM에 위치한 객체와 정보를 주고 받는다.
- 원격 프록시의 메소드를 호출하게 되면 네트워크를 통해 전달되어 원격 객체의 메소드가 호출되며 이러한 결과는 다시 클라이언트에게 전달된다.

JAVA RMI
- 원격 메소드 기초
분산되어 존재하는 객체 간의 메세지 전송(함수 호출)을 가능하게 하는 프로토콜
즉, Client가 Server에 있는 원격지 자원(객체)을 마치 자신의 자원(객체)처럼 사용하는 기술을 말한다.

클라이언트 객체(Client Object) : 진짜 서비스의 메소드를 호출한다고 생각한다. 클라이언트 보조 객체에서 실제로 자신이 원하는 작업을 처리한다고 생각한다.
클라이언트 보조 객체(Client Helper) : 진짜 서비스인 척 하지만, 실제로는 진짜 객체에 대한 프록시(Proxy)이다.
서비스 보조 객체(Service Helper) : 클라이언트 보조 객체로부터 요청을 받아 그 내용을 해석하여 진짜 서비스에 있는 메소드를 호출한다.
서비스 객체(Service Object) : 진짜 서비스, 실제로 작업을 처리하는 메소드가 들어있다.
1) 클라이언트 객체 >>>>> (함수 호출) >>>>> 클라이언트 보조객체 함수
2) 클라이언트 보조객체 함수 >>>>> (네트워크 전달) >>>>> 서비스 보조객체
3) 서비스 보조객체 >>>>> (함수 호출) >>>>> 서비스 객체
4) 서비스 객체 >>>>> (결과 리턴) >>>>> 서비스 보조객체
5) 서비스 보조객체 >>>>> (네트워크 전달) >>>>> 클라이언트 보조객체
6) 클라이언트 보조객체 >>>>> (결과 리턴) >>>>> 클라이언트 객체
기본적으로, 다른 힙에 위치한 객체에 대한 레퍼런스를 가져올 수 없다. 어떤 변수가 어떤 객체를 참조하려면, 그 객체는 그 선언문이 들어있는 코드와 같은 힙 공간에 위치해야 한다.
하지만, 원격 메소드 호출(Remote Method Invocation) 을 이용하면 원격 JVM 에 있는 객체를 찾아서 그 메소드를 호출할 수 있다.
원격 메소드 호출은 원격 메소드 기초에 나와있는 그림과 같은 로직을 가진다.
하지만 클라이언트 보조 객체를 스텁(Stub), 서비스 보조 객체를 스켈레톤(Skeleton)이라고 부른다.
- 원격 메소드 호출 에서는 클라이언트 보조객체와 서비스 보조객체를 만들어준다. 보조 객체에는 원격 서비스와 똑같은 메소드가 들어있다.
- 또한 클라이언트에서 원격 객체를 찾아서 그 원격객체에 접근하기 위해 쓸 수 있는 룩업(lookup) 서비스도 제공한다.
- 클라이언트 입장에서는 로컬 메소드 호출과 같은 방식으로 메소드를 호출하지만, 실제로는 클라이언트 보조 객체에서 네트워크를 통해 호출을 전송할 수 있다.
- 따라서 네트워킹 및 입출력 기능이 필수적으로 사용되며, 이에 대한 주의가 필요하다.
예제 아래 링크 참조
https://watevathing.tistory.com/12
https://blogshine.tistory.com/17
https://gre-eny.tistory.com/253
장점 :
- 기존 객체를 수정하지 않고 일련의 로직을 프록시 패턴을 통해 추가할 수 있다. (OCP)
- 실제 객체를 수행하기 전에 전처리를 하거나, 기존 객체를 캐싱할 수 있다.
> 기존 객체의 리소스가 무거울 경우, 이러한 캐싱 과정을 통해 부하를 줄일 수 있다.
- 기존 객체와 클라이언트의 요청 사이에 위치해 잇기 때문에 하나의 보안 역할을 한다.
단점 :
- 코드의 복잡도가 증가한다.
- 성능이 저하될 수 있다.
* 객체를 생성할 때 한 단계를 거치게 되므로, 빈번한 객체 생성이 필요한 경우
* 객체 생성을 위해 스레드 생성 및 동기화가 구현되어야 하는 경우
참고 :
https://blogshine.tistory.com/17
[Design Patterns] Proxy Pattern : 프록시 패턴
Proxy Pattern 이란? Proxy Pattern - 어떤 객체에 대한 접근을 제어하기 위한 용도로 대리인이나 대변인에 해당하는 객체를 제공하는 패턴 위의 정의에서 접근을 제어하는 프록시는 어떤 것 일까요? 아
blogshine.tistory.com
https://gre-eny.tistory.com/253
Head First: Design Patterns - 프록시 패턴(Proxy Pattern): 원격 프록시(remote proxy)
디자인 패턴: 프록시 패턴(Proxy Pattern) 이 포스팅은 Head First: Design Patterns 책을 보고, 개인적으로 정리한 포스팅입니다. Proxy Pattern 이란? 프록시 패턴(Proxy Pattern) 은 어떤 객체에 대한 접근을 제어
gre-eny.tistory.com
https://today-retrospect.tistory.com/102
Java 디자인 패턴 두번째 이야기 - 프록시 패턴(Proxy Pattern)
[목차] 1. 프록시 패턴이란? 2. 프록시 패턴은 왜 사용하는 것일까? 3. 프록시 패턴의 종류 3-1. 가상 프록시 3-2. 원격 프록시 3-3. 보호 프록시 4. 구현을 보기 전에 알아두면 좋은 부분 5. 프록시 패턴
today-retrospect.tistory.com
| [JAVA] 메모리 관리 (0) | 2023.04.14 |
|---|---|
| [Design Pattern] Facade Pattern (0) | 2023.04.06 |
| [Design Pattern] Proxy Pattern : Protection Pattern (0) | 2023.04.01 |
| [Design Pattern] Proxy Pattern : Virtual Proxy (0) | 2023.03.30 |
| [Design Pattern] Proxy Pattern (0) | 2023.03.29 |