STUDY/Design Pattern

프록시 패턴(Proxy Pattern)

디리릭 2022. 12. 19. 02:06
728x90

 

사용하는 객체를 통해 실제 객체를 제어하는 패턴이다.

사용하는 목적에 따라 원격지 프록시, 가상 프록시 등으로 구분할 수 있다.

●원격지 프록시

사용할 실제 객체가 클라이언트와 다른 위치에 있을 때 원격지에 있는 객체처럼 사용하는 프록시이다.

대표적인 예로 서버와 클라이언트 간의 함수 사용이다. 클라이언트에서 데이터를 전송하면, 연결되어 있는 서버에서 수신을 담당하는 함수로 데이터를 수신한다. 클라이언트에서 송신하는 데이터와 일치하는 함수를 서버에서 호출하게 되는 것이 대표적인 원격지 프록시이다.

(예_RDP, RemoteDeskTopProtocol )

●가상 프록시

사용할 실제 객체의 특정 행위가 많은 시간이 들 때 비동기적으로 수행할 수 있게 하여 사용자가 작업이 완료되는 것을 기다리지 않게 해주는 프록시이다.

대표적인 예로는 쓰레드이다. 게임에서 로딩화면을 나타낼 때 사용되는 방법이 가상 프록시를 이용한 쓰레드이다.

(예_RDP, RemoteDeskTopProtocol 내부적인 처리)

●보호용 프록시

사용자마다 권한을 부여하고 권한에 따라 다른 처리를 해주는 프록시이다.

(예_로그인)

원래 하려던 기능을 수행하며 로깅, 인증 등 부가적인 작업 수행을 하는데 활용하기 좋다.

또, 이 패턴을 통해 비용이 많이 드는 연산을 실제로 필요한 시점에 수행할 수 있도록 할 수 있다.

구조

▷ Subject : 인터페이스 클래스

▷ Proxy : 사용하는 객체가 포함되어 있으며 RealSubject가 수행할 메수드를 대신 수행할 클래스(예_참조한 dll에 대한 프록시)

▷ RealSubject : 실제 객체가 포함되어 있으며 원래 수행해야할 작업의 클래스(예_dll)

구현

  public interface ISubject
    {
        Object action();
    }
 public class Proxy: ISubject
    {
        private RealSubject realSubject;
        public Proxy()
        {
            realSubject = new RealSubject();
        }
        public object action()
        {
            return realSubject.action();
        }
    }
  class RealSubject : ISubject
    {

        public RealSubject()
        {
        }
        public object action()
        { 
            Console.WriteLine("기본형 Proxy 패턴");
         
            return null;
        }
    }
   class Program
    {
        static void Main(string[] args)
        {
            ISubject subject = new Proxy();
            subject.action();

            Console.Read();

        }
    }

 

728x90