Spring
Proxy 패턴
곽빵
2019. 11. 13. 14:11
1. 프록시 패턴 정의
실제 기능을 수행하는 객체Real Object 대신 가상의 객체Proxy Object를 사용해 로직의 흐름을 제어하는 디자인 패턴입니다.
2. 프록시 패턴 특징
- 원래 하려던 기능을 수행하며 그외의 부가적인 작업(로깅, 인증, 네트워크 통신 등)을 수행하기에 좋습니다.
- 비용이 많이 드는 연산(DB 쿼리, 대용량 텍스트 파일 등)을 실제로 필요한 시점에 수행할 수 있습니다.
- 사용자 입장에서는 프록시 객체나 실제 객체나 사용법은 유사하므로 사용성이 좋습니다.
결제 인터페이스
public interface Payment {
void pay(int amount);
}
현금 결제 클래스
public class Cash implements Payment{
@Override
public void pay(int amount) {
System.out.println(amount + " 현금 결제 ");
}
}
클라이언트 결제 클래스
// 클라이언트
public class Store {
Payment payment;
public Store(Payment payment) {
this.payment = payment;
}
public void buySomething(int amount) {
payment.pay(-100);
}
}
그리고 Proxy Class 입니다. 원래 현금결제에 시간이 얼마나 걸리는지 체크하는 기능이 달려있습니다.
public class CashPerf implements Payment{
// 기존의 클래스를 가져온다.
Payment cash = new Cash();
@Override
public void pay(int amount) {
// 달아주고싶은 기능을 재정의
StopWatch stopWatch = new StopWatch();
stopWatch.start();
cash.pay(amount);
stopWatch.end();
System.out.println(stopWatch.print());
}
}
public class StoreTest {
public void testPay() {
Payment cashPerf = new CashPerf();
Store store = new Store(cashPerf);
store.buySomething(-100);
}
}
이렇게 Store 클래스 밖에서 프록시 클래스로 Cash 클래스를 넘겨줘서 프록시 클래스로 작동이 되도록 해준다.
이렇게 하면 기존의 클래스들은 건들지 않고 중간에 내가 원하는 부분들의 로직을 추가하거나 변경할 수 있다.