📙 정의

특정 객체로의 접근을 제어하는 대리인(특정 객체를 대변하는 객체)를 제공하는 구조로서

프록시가 요청의 처리(예: 초기화 지연, 로깅, 액세스 제어, 캐싱 등)를 완료하면, 그 후 처리된 요청을 서비스 객체에 전달하는 방식이에요.

그렇기 때문에 프록시에서는 서비스 객체를 참조하고 있어야 합니다.

// 다형성을 위한 Interface
interface Subject {
	void operation();
}

// Real Subject
class RealSubject implements Subject {

	@Override
  public void operation() {
	  System.out.println("원본 도착");
  }

}

// Proxy
class Proxy implements Subject {
    private RealSubject subject; // 대상 객체를 composition

    Proxy(RealSubject subject) {
        this.subject = subject;
    }

		@Override
    public void operation() {
        System.out.println("프록시지롱~");
        subject.operation(); // 위임
        /* do something */

    }
}

// Client 에서의 호출
class Client {
    public static void main(String[] args) {
        Subject sub = new Proxy(new RealSubject());
        sub.operation();
    }
}

여기서 잠깐!

Client에서 Proxy 객체를 만들 때, new Proxy(new RealSubject()); 호출하는 것… 조금 짜치죠?

클라이언트는 원본 객체와 동일한 메서드를 호출하기 때문에 논리적으로 모르는 것은 맞습니다만.. 보는 우리가 불편하잖아요?

재미삼아 리팩토링을 해봅시다!

// 임시 프록시 팩토리
abstract class SubjectProxyFactory {
	private static final RealSubject REAL_SUBJECT = new RealSubject();

  public static Subject createProxy() {
      return new Proxy(REAL_SUBJECT);
  }
}

// Client 에서의 호출
class Client {
    public static void main(String[] args) {
        Subject proxy = ProxyFactory.createProxy();
        sub.operation();
    }
}

정말 재미로만 진행한 것은 아니구요!

실제로 가장 흔히 쓰이는 Proxy 객체 생성 기법이 진짜 객체의 인스턴스를 생성해서 프록시 객체를 리턴하는 Factory 를 사용하는 방법입니다! (사실 제 코드도 상당히 짜치고 건강하지 못한 코드처럼 보이지만…넘어가시죠 ㅋㅋ)

---
title: 기본 구조
---
classDiagram
    Subject <-- Client
    Subject <|-- RealSubject : implements
    Subject <|-- Proxy : implements
    RealSubject <-- Proxy : composition
    class Client {
    }
    
    class Subject {
	    <<interface>>
	    + operation()
    }
    
    class Proxy {
      - subject : Subject
	    + operation()
	    //(부가 메서드)
    }
    class RealSubject {
	    + operation()
    }