상세 컨텐츠

본문 제목

[Design Pattern] Proxy Pattern : Remote Proxy

JAVA

by jeonghojin 2023. 4. 2. 14:08

본문

원격 프록시 (Remote Proxy) :

원격 객체에 대한 접근은 제어 로컬 환경에 존재하며, 원격 객체에 대한 대변자 역할을 하는 객체 서로 다른 주소 공간에 있는 객체에 대해 마치 같은 주소 공간에 있는 것처럼 동작하게 만드는 패턴이다.
예시로  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
 


Proxy Pattern 장/단점

장점 :
- 기존 객체를 수정하지 않고 일련의 로직을 프록시 패턴을 통해 추가할 수 있다. (OCP)
- 실제 객체를 수행하기 전에 전처리를 하거나, 기존 객체를 캐싱할 수 있다.
> 기존 객체의 리소스가 무거울 경우, 이러한 캐싱 과정을 통해 부하를 줄일 수 있다.
- 기존 객체와 클라이언트의 요청 사이에 위치해 잇기 때문에 하나의 보안 역할을 한다.
 
단점 :
- 코드의 복잡도가 증가한다.
- 성능이 저하될 수 있다.
* 객체를 생성할 때 한 단계를 거치게 되므로, 빈번한 객체 생성이 필요한 경우
* 객체 생성을 위해 스레드 생성 및 동기화가 구현되어야 하는 경우


 
참고 : 

더보기

'JAVA' 카테고리의 다른 글

[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

관련글 더보기