프록시: 다른 객체에 대한 대체물을 제공할 수 있는 구조 디자인 패턴
https://refactoring.guru/images/patterns/diagrams/proxy/structure-2x.png
// 서비스의 인터페이스 부분으로 프록시가 서비스 객체로 위장하기 위해서는 인터페이스를 따라야 함
interface Subject {
request(): void;
}
// 실제 비즈니스 로직을 작성하는 서비스 부분
class RealSubject implements Subject {
public request(): void {
console.log('RealSubject: Handling request.');
}
}
// 서비스 객체를 레퍼런스로 받는 프록시 객체
// 클라이언트 요청의 처리를 마치고 실제 서비스 로직을 처리해 클라이언트에 결과를 전달함
class Proxy implements Subject {
private realSubject: RealSubject;
constructor(realSubject: RealSubject) {
this.realSubject = realSubject;
}
public request(): void {
if (this.checkAccess()) {
this.realSubject.request();
this.logAccess();
}
}
private checkAccess(): boolean {
console.log('Proxy: Checking access prior to firing a real request.');
return true;
}
private logAccess(): void {
console.log('Proxy: Logging the time of request.');
}
}
// 이제 클라이언트는 프록시 인터페이스를 통해 실제 코드와 상호작용함
function clientCode(subject: Subject) {
// ...
subject.request();
// ...
}
console.log('Client: Executing the client code with a real subject:');
const realSubject = new RealSubject();
clientCode(realSubject); //RealSubject: Handling request.
console.log('');
console.log('Client: Executing the same client code with a proxy:');
const proxy = new Proxy(realSubject);
clientCode(proxy);
/*
Proxy: Checking access prior to firing a real request.
RealSubject: Handling request.
Proxy: Logging the time of request.
*/