특정 객체로의 접근을 제어하는 대리인(특정 객체를 대변하는 객체)를 제공하는 구조로서
프록시가 요청의 처리(예: 초기화 지연, 로깅, 액세스 제어, 캐싱 등)를 완료하면, 그 후 처리된 요청을 서비스 객체에 전달하는 방식이에요.
그렇기 때문에 프록시에서는 서비스 객체를 참조하고 있어야 합니다.
// 다형성을 위한 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()
}