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 패턴은 객체가 특정 기능을 직접 수행하지 않고, 그 기능을 다른 객체(델리게이트)에게 위임하는 패턴으로, 코드의 결합도를 낮추고 유연성을 높입니다.
- 이 두 패턴은 객체 간의 관계를 설정하는 방식과 목적이 다르며, 각기 다른 상황에서 유용하게 사용될 수 있습니다.
'Spring Study' 카테고리의 다른 글
Java Instrument API vs ASM(Abstract Syntax Manipulation) (0) | 2024.09.03 |
---|---|
Mixin Pattern (자바에선 다중상속 허용X -> 믹스인디자인패턴으로 흉내) (0) | 2024.08.28 |
Delegate Pattern (위임 패턴) (0) | 2024.08.28 |
[ AOP 포인트컷 ] 클래스 필터(ClassFilter)와 메서드 매처(MethodMatcher) (0) | 2024.08.27 |
FactoryBean과 ProxyFactoryBean (0) | 2024.08.26 |