본문 바로가기
Spring Study

Proxy Pattern ( Delegate Pattern 에서의 '위임' 과의 차이 )

by xogns93 2024. 8. 28.

Proxy Pattern 

 

정의: 프록시 패턴(Proxy Pattern)은 다른 객체에 대한 접근을 제어하기 위해 그 객체의 대리자 또는 대리 객체를 제공하는 디자인 패턴입니다. 프록시 객체는 타겟 객체를 대신하여 클라이언트와 상호작용하며, 타겟 객체에 대한 접근을 제어하거나 추가 작업을 수행할 수 있습니다.

목적: 원래 객체에 대한 접근을 제어하거나, 원래 객체와의 상호작용 전에 추가적인 작업(로깅, 접근 제어, 캐싱 등)을 수행할 수 있도록 하는 것.

예시:

  • A는 클라이언트 클래스(Client).
  • B는 실제 작업을 수행하는 타겟 클래스(Target).
  • C는 프록시 클래스(Proxy)로, 클라이언트의 요청을 타겟 클래스에 전달하고, 타겟 클래스의 메서드 실행을 제어합니다.
// B
public interface Service {
    void performOperation();
}

// B
public class RealService implements Service {
    @Override
    public void performOperation() {
        System.out.println("RealService: 실제 작업 수행");
    }
}

// C
public class ProxyService implements Service {
    private RealService realService;

    public ProxyService(RealService realService) {
        this.realService = realService;
    }

    @Override
    public void performOperation() {
        System.out.println("ProxyService: 작업을 RealService로 위임하기 전에 추가 작업 수행");
        realService.performOperation(); // 위임
    }
}

// A
public class Client {
    public static void main(String[] args) {
        Service service = new ProxyService(new RealService());
        service.performOperation(); // 프록시를 통해 작업 수행
    }
}

 

  • 위임: 프록시 클래스가 타겟 객체의 메서드를 호출하여, 실제 작업을 타겟 객체에 위임합니다.
  • 결합도: 프록시 패턴은 클라이언트와 타겟 객체 간의 결합도를 낮추고, 추가적인 기능을 프록시 객체에서 처리할 수 있게 합니다.

 

Proxy 패턴을 적용한 예시코드 : 

// 타겟 객체
public interface PaymentService {
    void processPayment(double amount);
}

// 실제 서비스 객체
public class RealPaymentService implements PaymentService {
    @Override
    public void processPayment(double amount) {
        System.out.println("Processing payment of $" + amount);
    }
}

// 프록시 객체
public class PaymentServiceProxy implements PaymentService {
    private RealPaymentService realPaymentService;

    public PaymentServiceProxy(RealPaymentService realPaymentService) {
        this.realPaymentService = realPaymentService;
    }

    @Override
    public void processPayment(double amount) {
        System.out.println("Logging: Payment of $" + amount + " is about to be processed.");
        realPaymentService.processPayment(amount); // 작업을 타겟 객체로 위임
        System.out.println("Logging: Payment of $" + amount + " has been processed.");
    }
}

// 클라이언트
public class Client {
    public static void main(String[] args) {
        PaymentService paymentService = new PaymentServiceProxy(new RealPaymentService());
        paymentService.processPayment(100.0); // 프록시를 통해 결제 처리
    }
}

 

 

 

 

 

Proxy 패턴 vs. Delegate 패턴

  • Proxy 패턴:
    • 타겟 객체에 대한 접근을 프록시 객체가 대리하고, 타겟 객체의 메서드를 호출하여 작업을 위임합니다.
    • 주요 목적은 접근 제어, 로깅, 트랜잭션 관리 등과 같은 부가 기능을 추가하는 것입니다.
  • Delegate 패턴:
    • 객체의 특정 기능을 다른 객체(델리게이트)에게 위임하는 패턴입니다.
    • 객체 간의 결합도를 낮추고, 다른 객체가 기능을 대신 수행하게 하여 유연성을 높입니다.

 

결론

  • Proxy 패턴은 클라이언트가 실제 객체와 상호작용하는 대신 프록시 객체와 상호작용하도록 하여, 접근을 제어하거나 추가 작업을 수행할 수 있게 합니다.
  • Delegate 패턴은 객체가 특정 기능을 직접 수행하지 않고, 그 기능을 다른 객체(델리게이트)에게 위임하는 패턴으로, 코드의 결합도를 낮추고 유연성을 높입니다.
  • 이 두 패턴은 객체 간의 관계를 설정하는 방식과 목적이 다르며, 각기 다른 상황에서 유용하게 사용될 수 있습니다.