JAVA/DesignPattern

Design Pattern 디자인 패턴 Proxy Pattern 프록시 패턴

호두밥 2021. 12. 20. 19:26

Proxy Pattern 프록시 패턴

구조패턴으로 프록시 패턴은 다른  클래스의 기능을 대신하는 클래스입니다.  

프록시 객체는 외부에서 원래 객체의 기능을 사용할 수 있는 인터페이스 역할을 합니다.  또한 프록시 객체에서 원래 객체의 기능을 사용하기 전후에 로직을 추가할 수도 있습니다. 

Proxy의 종류

Virtual Proxy (가상 프록시) : 객체가 필요할 때 생성하기 / 지연 생성(초기화)

가끔 필요한 객체인데, 항상 메모리에 생성되어 있어서 시스템 자원 낭비가 있는 경우에 사용합니다. 프로그램이 실행될때 객체를 생성하지 않고, 객체가 필요해졌을 때 생성합니다. 

Protection Proxy(보호 프록시) :  접근 제한

지정된 고객만이 서비스 객체에 접근할 수 있도록 접근 제한을 해야할 때 사용합니다. 

Remote Proxy(원격 프록시) : 원격 서비스의 로컬 실행

서비스 객체가 원격 서버에 있을때 사용합니다. 프록시 객체는 네트워크와 관련된 복잡한 것들을 모두 처리한 뒤, 고객의 요청을 네트워크를 통해 서비스객체로 전달합니다. 

Logging Proxy(로깅 프록시) : 로그 요청

서비스 객체의 요청을 이력으로 남겨야 할 때 사용합니다. 프록시 객체는 서비스가 실행되기 전에 요청에 대해 로그를 남기는 작업을 수행합니다. 

Caching Proxy(캐싱 프록시) : 요청 결과 캐싱

고객의 요청 결과를 캐싱하고, 캐시의 라이프사이클을 관리해야 할 때 사용합니다. 매번 동일한 결과를 생성하는 요청이 반복되는 경우, 캐싱을 통해 결과를 구현할 수 있습니다.

Smart Reference (객체 참조)

프록시에서, 고객이 서비스를 사용할 때 사용하는 객체를 추적할 수 잇습니다. 만약 어떤 고객도 사용하지 않는 객체가 있다면 그 객체를 삭제할 수도 있습니다. 

또 프록시는 고객이 서비스 객체를 변경했는지를 알 수 있습니다. 변경되지 않은 객체는 다른 고객들도 재사용할 수 있습니다. 

장단점

장점

  • 고객이 모르게 서비스 객체를 관리할 수 있습니다.
  • 고객이 신경쓰지 않는 상태로, 서비스 객체의 라이프사이클을 관리할 수 있습니다.
  • 프록시는 서비스 객체가 준비되지 않았거나, 사용할 수 없는 상태여도 작동합니다.
  • 서비스나 고객을 변경하지 않고도 새로운 프록시를 추가할 수 있습니다. (개방폐쇄원칙)

단점

  • 많은 양의 새로운 클래스를 추가해야하는 경우, 코드가 복잡해질 수 있습니다.
  • 서비스 응답이 지연될 수 있습니다.

Proxy Pattern 프록시 패턴 구현

Shape

public interface Shape {
    void draw();
}

Circle

public class Circle implements Shape{

    public Circle() {
        System.out.println("Before Draw");
    }

    @Override
    public void draw() {
        System.out.println("Draw Circle");
    }
}

ShapeProxy

public class ShapeProxy implements Shape{

    private Shape shape;

    @Override
    public void draw() {
        if(null == shape){
            shape = new Circle();
        }
        shape.draw();
    }
}

Main

public class Main {
    public static void main(String[] args) {
        ShapeProxy shapeProxy = new ShapeProxy();
        shapeProxy.draw();
        shapeProxy.draw();
    }
}
Before Draw
Draw Circle
Draw Circle

 

참조