목적
프록시는 다른 객체를 위한 대체물을 제공할 수 있게 하는 구조적인 디자인 패턴이다. 프록시 컨트롤은 오리지날 객체에 접근하여, 요청이 그 객체를 통과하기 전/후에 어떤 작업을 할 수 있게 해준다.
문제
시스템 리소스(ex. DB)를 소비하는 수많은 객체들이 있고, 가끔 그들이 필요할 때가 있다.
방법1. Lazy Initialization
- 그 객체가 정말로 필요할 때만 객체를 생성
- 모든 클라이언트는 지연된 초기화 코드를 실행
- 하지만 이는 많은 양의 복제 코드를 만들게 된다.
방법2. 객체 클래스에 직접 코드를 삽입
- 하지만 항상 가능하진 않음
- 예컨대 closed 3rd-party library의 일부분인 클래스는 어떻게 할 수 없다.
해결
- 오리지널 서비스 객체와 동일한 인터페이스로 Proxy object를 생성
- Proxy object를 모든 클라이언트에게 전달한다.
- 클라이언트로부터 요청을 받으면, Proxy는 실제로 서비스 객체를 생성하고 모든 작업을 위임한다.
- proxy는 객체로 위장하여, lazy initialization / result caching / logging / access control 등을 수행할 수 있다.
- 클래스의 중요 로직 전/후에, 해당 클래스를 변경하지 않고도 특정 작업을 수행할 수 있게 한다.
결론
proxy obeject는 오리지널 서비스 객체와 동일한 인터페이스로 생성
- real service object를 기대하는 클라이언트에게 전달될 수 있다.
- 원하는 작업이 추가된 상태로!
- proxy object = 오리지널 객체로 위장한 객체!
현실예제
- CreditCard Class와 Cash Class는 동일한 인터페이스 Payment를 구현한다.
- CreditCard는 Cash를 위한 Proxy이다.
- 따라서 결제수단이 필요한 어느 곳이든 Cash를 대체할 수 있다.
구조
- Service Interface
- Service
- Service Interface를 구현한다.
- 비즈니스 로직 제공 클래스
- Proxy
- Service Interface를 구현한다.
- Service object를 reference field로 가리키고 있는 클래스
- 프록시 작업이 끝난 후 서비스 객체에게 요청을 전달한다.
- Client
- 같은 인터페이스를 구현하는 Service Object && Proxy Object 모두를 사용할 수 있다.
번역
'학습 > Java' 카테고리의 다른 글
[java] Stack & Heap과 Reference의 개념 (0) | 2020.06.28 |
---|---|
[java] 익명 클래스와 람다식 (0) | 2020.06.10 |
[java] Annotation Processor란? (추가공부 필요) (0) | 2020.03.21 |
[java] Optional 클래스 (0) | 2020.02.29 |
[java] Enum의 개념과 사용법 (0) | 2020.02.23 |
댓글