이런거 저런거 그런거

프록시(proxy) 패턴 본문

카테고리 없음

프록시(proxy) 패턴

빵진 2021. 6. 15. 23:03
일반적으로 프록시는 다른 무언가와 이어지는 인터페이스의 역할을 하는 클래스이다. 프록시는 어떠한 것(이를테면 네트워크 연결, 메모리 안의 커다란 객체, 파일, 또 복제할 수 없거나 수요가 많은 리소스)과도 인터페이스의 역할을 수행할 수 있다.
https://ko.wikipedia.org/wiki/프록시_패턴
 

프록시 패턴 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

즉, 어떤 다른 객체로 접근하는 것을 통제(제어)하기 위해서 그 객체의 대리자를 제공하는 패턴

 


책 예제

1. GumballMachine 모니터링 기능 추가 요청 (빨간색) 

2. 여러 지역에 있는 머신을 네트워크를 통해 모니터링 할 수 있는 기능으로 변경 요청

"원격 프록시" 이용

HeadFirst Design Pattern p.472, 원격 프록시


JAVA의 RMI

Remote Method Invocation (원격 메소드 호출)

 

분산되어 존재하는 객체 간의 메세지 전송(함수 호출)을 가능하게 하는 프로토콜

즉, Client가 Server에 있는 원격지 자원(객체)을 마치 자신의 자원(객체)처럼 사용하는 기술을 말한다.

 

1. 클라이언트에서 사용 할 원격 서비스 인터페이스 작성

2. 서비스 구현 클래스 작성

3. rmic 사용해서 스터브와 스켈레톤 생성

4. RMI 레지스트리 실행 (클라이언트에서는 레지스트리를 검색하여 스터브(프록시)를 받아 갈 수 있음)

5. 원격 서비스 시작

 


1) 클라이언트 객체  --------------(함수 호출)-------> 클라이언트 보조객체 함수

2) 클라이언트 보조객체 함수 --(네트워크 전달)----> 서비스 보조객체

3) 서비스 보조객체 ---------------(함수 호출)-------> 서비스 객체

4) 서비스 객체 --------------------(결과 리턴)-------> 서비스 보조객체

5) 서비스 보조객체 -------------(네트워크 전달)----> 클라이언트 보조객체

6) 클라이언트 보조객체 ----------(결과 리턴)-------> 클라이언트 객체

 

 

RPC(Remote Procedure Call)

별도의 원격 제어를 위한 코딩 없이 다른 주소 공간에서 함수나 프로시저를 실행할 수 있게하는 프로세스간 통신 기술

UNIX에서 많이 사용되는 통신 프로토콜

네트워크에 연결되어 있는 다른 컴퓨터에 존재하는 함수 실행

이미지 출처: https://velog.io/@jakeseo_me/RPC란

 

 

 

프록시 패턴 정의

어떤 객체에 대한 접근을 제어하기 위한 용도로 대리인이나 대변인에 해당하는 객체를 제공하는 패턴

Design-Patterns-Quick-Reference-Card

  • Subject : Client에서 필요로 하는 기능을 명시
  • RealSubject : 실제 작업을 처리하는 객체
  • Proxy : 실제 작업을 처리하는 객체(RealSubject)에 대한 레퍼런스를 가지고 있어 Client로 받은 요청을 전달

 

어떤식으로 클라이언트에서 진짜 객체가 아닌 프록시를 사용하도록 만드나요?

가장 흔하게 쓰이는 기법은 진짜 객체의 인스턴스를 생성해서 리턴하는 팩토리를 사용하는 방법입니다.

이 작업은 팩토리 메소드 내에서 진행되기 때문에 실제 객체를 프록시로 감싼 다음에 리턴 할 수 있죠.

클라이언트에서는 진짜 객체를 쓰고 있는지, 아니면 프록시 객체를 쓰고있는지 전혀 알지 못합니다.

 

프록시 패턴 종류

원격 프록시

원격 객체에 대한 접근제어

프록시의 메소드를 호출하면 그 호출이 네트워크를 통해서 전달되어 결국 원격 객체의 메소드가 호출.

호출의 결과는 다시 프록시를 거쳐서 클라이언트한테 전달됨

 

가상 프록시

객체의 생성비용이 많이 들어 미리 생성하기 힘든 객체에 대한 접근 및 생성시점 등을 제어

객체 생성 전, 또는 객체 생성 도중에 객체를 대신하기도 함.

실제로 객체가 필요하게 되기 전까지 객체의 새성을 미루게 해 주기도 함.

(예제 : CD커버 뷰어)

 

보호 프록시

접근 권한을 제어해야 하는 객체에 대하여 접근을 제어

Client의 정보를 확인하여 RealSubject 접근을 제어(제한)한다.

(Java에서는 InvocationHandler 인터페이스를 활용하여 동적 프록시로 구현 가능, p517)

 

스마트 (레퍼런스) 프록시 (e.g. 스마트 포인터)

일반 포인터의 사용 방법(인터페이스)를 그대로 제공하면서 다른 목적의 기능이 추가로 구현

주 객체가 참조될 때마다 추가 행동을 제공 (메모리 해제 시점 결정)

스마트 포인터 : 해제가 자동으로 호출되는 포인터 (즉, 소멸자가 자동으로 불려지는 포인터)

데코레이터와 유사

 

캐싱 프록시

비용이 많이 드는 작업의 결과를 임시로 저장한 후 동일 요청 시 활용하여 자원(네트워크, 연산 등..)절약

 

동기화 프록시

여러 스레드에서 주 객체에 접근하는 경우 안전하게 작업을 처리 할 수 있게 제공.

 

지연 복사 프록시

복사가 실제로 필요한 시점까지 객체 복사를 지연시키는 방법으로 객체의 복사 시점을 제어

e.g) 문서 내 복사가 된 도형들. 복사된 도형에 대해 속성 변경 시 실제 해당 도형(객체) 복사 수행

 

 

 

데코레이터 패턴과의 비교

데코리에터 패턴과의 유사점

어떤 객체의 기능을 수정한다는 부분에서 유사함

클라이언트에 기존의 객체와 동일한 인터페이스를 제공한다는 부분이 같음. (즉, 클라이언트에서는 데코레이터&프록시 존재를 모름)

 

데코레이터 패턴과의 차이점

데코레이터 패턴 : 상속을 사용하지 않고 객체에 행동을 추가 & 확장하는 목적, 생성자에서 인스턴스를 가져옴 -> 행동 추가

프록시 패턴 : 객체에 대한 접근을 제어하는 목적으로 이미 존재하는 동작을 목적에 맞게 변형, 내부적으로 인터페이스(RealSubject) 생성 -> 접근 제어

 

 

어댑터 패턴&퍼사드 패턴과의 차이점

어댑터 패턴 : 추상 인터페이스를 구현한 어댑터가 있고 어댑터가 어댑티의 대리자 역할한다는 부분에서 유사하다고 생각 할 수 있으나

어댑터의 주 목적은 인터페이스가 서로 다른 객체에 매핑하는게 목적.

 

퍼사드 패턴 : 하위 시스템에 대한 상위 수준 인터페이스를 제공하는 패턴으로 하위 시스템을 대리한다기보다 복잡한 작업을 단순화하는데 목적이 있다.(클라이언트를 복잡한 서브시스템과 분리시켜주는 역할)

 

어댑터와 퍼사드는 래핑하는 객체와 다른 인터페이스를 가지고 있는 반면(어댑터는 기존 인터페이스에서 파생, 퍼사드는 상위 수준의 새 인터페이스 생성), 프록시 패턴은 래핑하는 객체와 동일한 인터페이스를 가져야 한다.

따라서 클라이언트 입장에서는 어댑터와 퍼사드를 사용하고 있다는 것을 알고 있지만 프록시의 경우 프록시 존재는 알 수 없다는 차이가 있다.

 

 

 

참조

 

design_pattern_proxy.drawio
0.00MB

Comments