(디자인 패턴) 프록시 패턴(Proxy Pattern)

Proxy
홍윤's avatar
Aug 13, 2024
(디자인 패턴) 프록시 패턴(Proxy Pattern)
💡
프록시 패턴(Proxy Pattern)은 디자인 패턴 중 구조 패턴의 하나로, 객체의 대리인(proxy) 역할을 하는 객체를 통해 다른 객체에 접근하는 방법을 제공하는 패턴입니다. 이 패턴은 접근 제어, 리소스 관리, 로깅, 캐싱, 지연 초기화 등의 다양한 목적으로 사용됩니다.
 

주요 개념

  1. 실제 객체(Real Subject):
      • 실제로 작업을 수행하는 객체입니다. 클라이언트가 원래 접근하려는 대상입니다.
  1. 프록시(Proxy) 객체:
      • 실제 객체에 대한 접근을 제어하는 대리 객체입니다. 프록시는 클라이언트와 실제 객체 사이에서 중개 역할을 하며, 실제 객체의 메소드 호출을 제어하거나 추가 기능을 수행할 수 있습니다.
  1. 인터페이스(Subject Interface):
      • 실제 객체와 프록시 객체가 공통적으로 구현하는 인터페이스입니다. 클라이언트는 인터페이스를 통해 실제 객체나 프록시 객체를 동일하게 사용할 수 있습니다.

사용 예시

  • 가상 프록시(Virtual Proxy):
    • 리소스가 무거운 객체의 생성과 초기화를 지연시켜 필요할 때만 생성하는 방식입니다. 예를 들어, 대형 이미지 파일을 로드할 때 가상 프록시를 사용해 실제 이미지 로드를 지연시킬 수 있습니다.
  • 보안 프록시(Protection Proxy):
    • 실제 객체에 대한 접근 권한을 제어하는 역할을 합니다. 예를 들어, 사용자 권한에 따라 특정 작업을 제한할 수 있습니다.
  • 원격 프록시(Remote Proxy):
    • 실제 객체가 네트워크를 통해 원격 서버에 있을 때 사용됩니다. 클라이언트는 원격 프록시를 통해 원격 객체에 접근할 수 있습니다.
  • 스마트 프록시(Smart Proxy):
    • 실제 객체에 접근할 때 추가적인 행동(로깅, 참조 카운팅, 캐싱 등)을 수행하는 프록시입니다.

장점

  • 접근 제어: 프록시 객체를 통해 실제 객체에 대한 접근을 제어하고, 보안이나 권한 관리를 할 수 있습니다.
  • 성능 최적화: 리소스가 무거운 객체의 생성을 지연시키거나 캐싱을 통해 성능을 최적화할 수 있습니다.
  • 유연성: 프록시를 사용해 실제 객체의 동작을 수정하지 않고도 다양한 기능을 추가할 수 있습니다.

단점

  • 추가 복잡성: 프록시 객체를 추가함으로써 코드의 복잡성이 증가할 수 있습니다.
  • 성능 오버헤드: 프록시 객체가 실제 객체와 클라이언트 사이에 중간 계층을 추가하므로, 성능에 약간의 오버헤드가 발생할 수 있습니다.
프록시 패턴은 실제 객체에 대한 접근을 통제하거나 최적화가 필요할 때 유용하게 사용되는 패턴입니다.
notion image
  • Forward Proxy, Reverse Proxy
notion image

1. 프록시 패턴 연습 예제 및 해설

App
package ex02; /** * Animal 생성 (abstract) * 타입 일치(다형성) = 쥐(동물), 호랑이(동물) * 문지기한테 DIP만 지켜주면 됨 */ public class App { public static void main(String[] args) { Mouse m = new Mouse(); //->mouse animal DoormanProxy doormanProxy = new DoormanProxy(new Doorman()); doormanProxy.쫒아내(m); } }
  • ‘Mouse’ 는 ‘Animal’을 상속 받아 ‘쫓아내’ 메소드를 구현한 클래스다.
  • ‘Doorman’은 ‘Animal’ 타입 객체를 처리하는 클래스이다.
  • ‘DoormanProxy’는 ‘Doorman’ 객체를 감싸는 Proxy 클래스이다.
  • ‘Doorman’ 의 기능을 대신 호출한다.

☆DoormanProxy
package ex02; public class DoormanProxy{ private Doorman doorman; public DoormanProxy(Doorman doorman) { this.doorman = doorman; } public void 쫒아내(Animal a){ System.out.println("안녕~~~"); doorman.쫒아내(a); } }
  • ‘Doorman’ 객체를 감싸는 Proxy클래스다.
  • ‘DoormanProxy’는 ‘Doomman’의 메소드를 호출하기 전에 ‘ “안녕~~”’이라는 메세지를 출력한다.
  • 그리고 ‘Doorman’ 객체의 ‘쫓아내’ 메소드를 호출하여 실제 동작을 수행한다.
  • Proxy클래스는 ‘Doorman’의 기능을 간접적으로 호출할 수 있게 하여, 호출 전후 추가적인 동작을 수행 할 수 있게 한다. 이를 통해 ‘Doorman’의 기능을 제어하고 확장 할 수 있다.
Share article

Uni