똑같은 삽질은 2번 하지 말자
Proxy 패턴 본문
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 클래스를 넘겨줘서 프록시 클래스로 작동이 되도록 해준다.
이렇게 하면 기존의 클래스들은 건들지 않고 중간에 내가 원하는 부분들의 로직을 추가하거나 변경할 수 있다.
'Spring' 카테고리의 다른 글
스프링 시큐리티 (0) | 2019.11.18 |
---|---|
DI 컨테이너에서 관리되는 빈에 대한 통합 테스트 (0) | 2019.11.17 |
Mockito(스프링 테스트) (0) | 2019.11.17 |
스프링 테스트 (0) | 2019.11.17 |
@Validation (0) | 2019.11.14 |
Comments