똑같은 삽질은 2번 하지 말자

Proxy 패턴 본문

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 클래스를 넘겨줘서 프록시 클래스로 작동이 되도록 해준다.

 

이렇게 하면 기존의 클래스들은 건들지 않고 중간에 내가 원하는 부분들의 로직을 추가하거나 변경할 수 있다.

'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