ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Proxy Pattern
    기술 면접/Design Pattern 2021. 9. 27. 15:57

    Context 클래스는 Proxy Pattern으로 구성되어 있다. Proxy 한국말로 직역하면 대리, 대용물 등이 되겠다.

    "쁘락지" 단어의 기원이 proxy라는 소문도 있다. 아무튼. Proxy Pattern에 대해 알아보자

    Proxy Pattern Diagram

    Proxy Pattern의 다이어그램을 UML로 나타내보면 위와 같다.

     

    Proxy는 주체 클래스 RealSubject를 감싸고, 클라이언트의 요청을 주체 클래스에게 위임하거나, 리다이렉트 시켜준다. Proxy는 RealSubject 객체에 대한 레퍼런스를 가지고 있기 때문에 RealSubject에서 처리해야하는 작업을 RealSubject에서 처리하는 것처럼 똑같이 처리할 수 있다.

     

    거두절미 하고, 코드로 직접 확인해보자.

     

     

    Proxy Pattern Implement

    IService 이름으로 Interface를 선언해주었다.

    위 다이어그램에 Subject에 해당한다.

    IService를 implements하는 Service Class를 선언해주었다.

    위 다이어그램의 RealSubject에 해당한다.

     

    DoSomething은 로그만 남기는 함수이고,

    MassiveMethod는 100번의 반복문으로 10초의 시간이 걸리는 코드이다.

     

    IService를 implements하는 Proxy 클래스를 선언해주었다.

    이름 그대로 위 다이어그램에 Proxy에 해당한다.

     

    DoSomething은 Proxy에서 직접 처리하고

    MassiveMethod는 service객체를 생성하여 Serivce 클래스에서 처리하도록 한다.

     

    proxy를 통하여 IService에 명시된 클래스들을 실행하도록 한다.

    위 코드들은 가장 기본적인 Proxy Pattern 이다.

     

    그렇다면, 왜 Proxy Pattern을 사용할까?

    사용해서 얻는 이점은 무엇일까?

    Proxy Pattern 종류

    1. Virtual Proxy

    실제 객체에 액세스가 필요한 시점에 인스턴스를 생성한다. 실제 객체가 필요할 때 까지 객체 생성을 미룸으로써 다른 작업에 시간을 더 할애할 수 있다.

    또는 객체가 생성될 때 많은 작업시간이 소요되는 경우, 다른 작업에 필요한 사전작업을 Proxy에서 먼저 실행하여 전체 시스템의 효율을 높일 수 있다.

     

    코드를 보면...

     

    메인에서 객체 생성할 때 proxy1, proxy2라는 이름을 가지게 해주고

    MassiveMethod를 실행했다.

     

    Proxy클래스에서는 Proxy 생성자에 사전작업을 했다는 로그를 남기게 했다.

     

    Service클래스 생성자에 진짜 작업을 시작한다는 Do real work를 넣어주었다.

     

    실행결과

    proxy 클래스 객체를 생성할 때 사전작업을 진행했다는 의미의 Do Pre-work가 출력되는 것을 확인 할 수 있고, MassiveMethod 실행 전 Do real work로 Service 생성자에서 필요한 작업을 진행했다는 의미의 로그를 확인할 수 있다.

     

     

     

    2. Protection Proxy

     

    클라이언트가 주체 클래스에 접근하기 위한 권한이나 제한, 혹은 설정을 제대로 했는지 등을 확인하는 작업을 주체클래스를 실행하기 전 사전작업으로 실행하여 주체클래스의 보안성을 높인다.

    기본 Proxy Pattern에서 Virtual Proxy의 Pre-work에 해당하는 사전작업을 보안을 확인하는 작업으로 바꿔 주면 Protection Proxy가 된다. 코드는 생략하겠다.

     

    3. Remote Proxy

    위 예에서는 모든 클래스가 로컬에서 생성하여 실행했지만, 주체 클래스가 네트워크 넘어 서버에 존재하는 클래스라면 Proxy를 통하여 주체 클래스에 접근하여, 서버에 있는 클래스가 로컬에 있는 것처럼 표현할 수 있다.

    주체 클래스의 반환값은 네트워크를 통해 Proxy 클래스에 전달되고 바로 사용자에게 전달된다.

    Remote Proxy의 예를 들면, Proxy를 통해 서버의 주체클래스에 접근하여 반환값으로 이미지를 받는다 생각해보자. 그러면 우리는 Proxy에서 그 이미지를 사용자에게 보여주는 UI를 더 알맞게 수정하거나 여러가지 데코레이션을 추가하여 UI적으로 풍성하게 만들어 주는 작업을 Proxy에서 할 수 있다. 이 것을 Remote Proxy라 부른다.

     

    Conclusion

    Proxy Pattern의 사용 방향은 무궁무진하여 사용 종류는 정말 많다. 그 중 대표적인 세 가지 종류만 꼽아봤는데, 정말 간단한 예제로 설명했지만 주체클래스가 복잡해질 수록 빛을 바랄 Pattern이 Proxy다.

    다만, Proxy Pattern을 사용하기 위한 사전작업도 꽤나 번거로울 수 있기 때문에 본인 프로젝트에 Proxy Pattern이 적합한지 충분한 고민을 해보고 사용하는 것이 필요하다.

     

     

     

    git : https://github.com/ChoYeonJun/ProxypatternExample

     

    GitHub - ChoYeonJun/ProxypatternExample

    Contribute to ChoYeonJun/ProxypatternExample development by creating an account on GitHub.

    github.com

    Reference:

    https://dev-hye.tistory.com/entry/프록시-패턴-Proxy-Pattern

    https://en.wikipedia.org/wiki/Proxy_pattern#Virtual_proxy

    https://yaboong.github.io/design-pattern/2018/10/17/proxy-pattern/

     

    '기술 면접 > Design Pattern' 카테고리의 다른 글

    Singleton Pattern  (0) 2021.09.27
Designed by Tistory.