본문 바로가기
학습/Java

[java] Proxy Pattern

by KKambi 2020. 3. 23.

목적

프록시는 다른 객체를 위한 대체물을 제공할 수 있게 하는 구조적인 디자인 패턴이다. 프록시 컨트롤은 오리지날 객체에 접근하여, 요청이 그 객체를 통과하기 전/후에 어떤 작업을 할 수 있게 해준다.

 

문제

시스템 리소스(ex. DB)를 소비하는 수많은 객체들이 있고, 가끔 그들이 필요할 때가 있다.

 

방법1. Lazy Initialization

  • 그 객체가 정말로 필요할 때만 객체를 생성
  • 모든 클라이언트는 지연된 초기화 코드를 실행
  • 하지만 이는 많은 양의 복제 코드를 만들게 된다.

 

방법2. 객체 클래스에 직접 코드를 삽입

  • 하지만 항상 가능하진 않음
  • 예컨대 closed 3rd-party library의 일부분인 클래스는 어떻게 할 수 없다.

 

해결

  1. 오리지널 서비스 객체와 동일한 인터페이스로 Proxy object를 생성
  2. Proxy object를 모든 클라이언트에게 전달한다.
  3. 클라이언트로부터 요청을 받으면, Proxy는 실제로 서비스 객체를 생성하고 모든 작업을 위임한다.

- proxy는 객체로 위장하여, lazy initialization / result caching / logging / access control 등을 수행할 수 있다.

- 클래스의 중요 로직 전/후에, 해당 클래스를 변경하지 않고도 특정 작업을 수행할 수 있게 한다.

 

결론

proxy obeject는 오리지널 서비스 객체와 동일한 인터페이스로 생성

- real service object를 기대하는 클라이언트에게 전달될 수 있다.

- 원하는 작업이 추가된 상태로!

- proxy object = 오리지널 객체로 위장한 객체!

 

현실예제

  1. CreditCard Class와 Cash Class는 동일한 인터페이스 Payment를 구현한다.
  2. CreditCard는 Cash를 위한 Proxy이다.
  3. 따라서 결제수단이 필요한 어느 곳이든 Cash를 대체할 수 있다.

 

구조

  1. Service Interface
  2. Service
    • Service Interface를 구현한다.
    • 비즈니스 로직 제공 클래스
  3. Proxy
    • Service Interface를 구현한다.
    • Service object를 reference field로 가리키고 있는 클래스
    • 프록시 작업이 끝난 후 서비스 객체에게 요청을 전달한다.
  4. Client
    • 같은 인터페이스를 구현하는 Service Object && Proxy Object 모두를 사용할 수 있다.

 

 

번역

https://refactoring.guru/design-patterns/proxy

댓글