본문 바로가기
Design Pattern

디자인 패턴 - Proxy Pattern

by SuldenLion 2022. 5. 17.
반응형

프록시 패턴 :

프록시 객체를 통해 기본 객체에 접근하는 패턴. / Proxy는 번역하면 대리자, 대변인의 의미를 갖는다. 즉 프록시는 어떤 역할을 대신 수행하는 존재임. / (비서같은 존재 -> 사장한테 질문을 바로 하기보다는 비서한테 먼저 물어보는 개념) / 이렇게 어떤 객체를 사용하고자 할 때, 객체를 직접적으로 참조하는 것이 아니라, 해당 객체를 대행(proxy)하는 객체를 통해 대상 객체에 접근하는 방식을 사용하면 해당 객체가 메모리에 존재하지 않아도 기본적인 정보를 참조하거나 설정할 수 있고 또한 실제 객체의 기능이 반드시 필요한 시점까지 객체의 생성을 미룰 수 있음. 

예를 들어, 용량이 큰 이미지와 글이 같이 있는 문서를 모니터 화면에 띄울 때 이미지 파일은 용량이 크고 텍스트는 용량이 작아서 텍스트는 빠르게 나타나지만 그림은 조금 느리게 로딩되는 경우 -> 만약 처리가 안되고 이미지와 텍스트가 모두 로딩이 된 후에 화면이 나온다면 사용자는 페이지가 로딩될때까지 의미없이 기다려야 함. (보통 그런 로딩이 있을 때 마우스 커서가 삥글삥글 돌아가면서 작동안하는 경우) => 보통 쓰레드를 하나 더 돌려서 로딩하는걸 받고 로딩은 그 상태bar같은걸로 처리한다고 함. 그래서 위의 경우엔 먼저 로딩이 되는 텍스트라도 먼저 나오는 것이 좋음. 이런 방식을 취하려면 텍스트 처리용 프로세서와 그림 처리용 프로세서를 별도로 운영하면 됨. 이런 구조를 갖도록 설계하는 것이 Proxy Pattern. 일반적으로 프록시는 다른 무언가와 이어지는 인터페이스의 역할을 하는 클래스를 의미함.

 

프록시 패턴의 장점:

- 사이즈가 큰 객체가 로딩되기 전에도 프록시를 통해 참조 가능. (기본 객체의 리소스가 무거운 경우, 프록시 객체에서 간단한 처리를 하거나 기본 객체를 캐싱 처리함으로써 부하를 줄일 수 있음)

- 기본 객체에 대한 수정 없이, 클라이언트에서의 사용과 기본 객체 사이에 일련의 로직을 프록시 객체를 통해 넣을 수 있음.

- 실제 객체의 public, protected method들을 숨기고 interface를 통해 노출 가능. (프록시는 기본 객체와 요청 사이에 있기 때문에, 일종의 방패(보안)의 역할도 함)

- local에 있지 않은 떨어져 있는 객체 사용 가능.

- 원래 객체의 접근에 대해서 사전처리 가능.

- 구조나 코드 구현이 간단함

 

프록시 패턴의 단점 :

- 객체 생성시에 한단계를 거치게 되므로, 객체 생성이 빈번할 때 성능이 저하될 수 있음. (프록시 객체가 중간에 껴있기 때문에, 간혹 응답이 느려질 수 있음/ 캐싱이 안되어 있는 초기 사용의 경우)

- 프록시 내부에서 객체 생성을 위해 스레드가 생성, 동기화가 구현되야 하는 경우 성능이 저하될 수 있음.

- 로직이 난해해져서 가독성이 떨어질 수 있음.

 

구조:

Subject -> Proxy -> RealSubject

ㆍSubject : Proxy와 RealSubject를 구현해야 하는 인터페이스, 두 객체를 동일하게 다루기 위해 존재함

ㆍProxy : RealSubject와 Client 요청 사이에 존재하는 객체, Subject를 구현함으로써 클라이언트는 RealSubject를 사용하는 것과 별 차이가 없어야 함.

ㆍRealSubject : 실질적으로 요청에 대해 주된 기능을 수행하는 객체, Proxy 객체는 내부적으로 이 객체를 로직에 맞게 사용한다(delegate).

 

프록시가 활용되는 상황:

- 기본 객체가 리소스 집약적인 경우. 자잘한 작업들은 프록시 객체가 처리하게 함.

- 기본 객체에 접근을 제어해야 하는 경우. 프록시 객체가 권한에 따라 접근 로직을 다르게 처리하게 함.

 

ㆍ가상 프록시 :

꼭 필요로 하는 시점까지 객체의 생성을 연기하고, 해당 객체가 생성된 것처럼 동작하도록 만들고 싶을때 사용하는 패턴(가짜로 일하는 척). 프록시 클래스에서 자잘한 작업들을 처리하고 리소스가 많이 요구되는 작업들이 필요할 때에만 주체 클래스를 사용하도록 구현하며 위에서 예로 들었다시피 해상도가 아주 높은 이미지를 처리해야하는 경우같은 때에 작업을 분산하는 것.

 

ㆍ원격 프록시 :

원격 객체에 대한 접근을 제어 로컬 환경에 존재하며, 원격 객체에 대한 대변자 역할을 하는 객체. 서로 다른 주소 공간에 있는 객체에 대해 마치 같은 주소 공간에 있는 것처럼 동작하게 만드는 패턴. 예시로는 Google Docs. 브라우저는 브라우저대로 필요한 자원을 로컬에 가지고 있고 또 다른 자원은 Google 서버에 있는 형태.

 

ㆍ보호 프록시 :

주체 클래스에 대한 접근을 제어하기 위한 경우에 객체에 대한 접근 권한을 제어하거나 객체마다 접근 권한을 달리하고 싶을 때 사용하는 패턴으로 프록시 클래스에서 클라이언트가 주체 클래스에 대한 접근을 허용할지 말지 결정하도록 할 수 있음.

 

https://github.com/jungwu2503/WindowProgramming/commit/cc725b150361c930b5bcc3aa5bbf6f3fc2d827f7

 

Create ProxyTestDrive · jungwu2503/WindowProgramming@cc725b1

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

github.com

함수 가로채기나 함수를 조작할 때 많이 쓰는 듯함.

반응형

댓글