메타프로그래밍: 자기 자신 혹은 다른 컴퓨터 프로그램을 데이터로 취급하며 프로그램을 작성, 수정하는 것. 넓은 의미에서, 런타임에 수행해야 할 작업의 일부를 컴파일 타임 동안 수행하는 프로그램을 말하기도 한다.
Proxy Pattern
- 구조 패턴 카테고리
- 클라이언트는 실제 객체 대신 Proxy 객체를 통해 작업을 요청한다(대리인 역할).
- Proxy는 실제 객체와 클라이언트 사이에 존재한다.
적용 사례
- Access Control / Validation (유저의 접근 권한 확인)
- Caching / Logging
- Debit / Check Card (banking)
체크 카드가 Proxy, 계좌 안에 있는 현금이 실제 객체라고 생각하면 된다.
구성 요소
- Client
- Subject
- Proxy
- Real Subject
Subject는 RealSubject에 대응하는 인터페이스. RealSubject와 Proxy는 모두 Subject 인터페이스를 구현해준다. 클라이언트는 RealSubject와 직접적으로 커뮤니케이션 하지 않고 Proxy를 통해 필요한 요청을 한다. Proxy는 실제 객체에서 정보를 가져와서 인터페이스를 통해 커뮤니케이션 한다. Proxy를 통해 어떤 요청이 들어왔을 때 그 요청이 RealSubject에 구현이 돼있다면 Proxy에서 그것을 확인한 뒤 처리한다. 구현이 되어있지 않다면 그것에 맞게 대처할 수 있다.
은행에 저금된 현금이 있다고 하자. 이 현금이 실제 객체다. 은행에서 그 현금과 연결된 카드가 발행되고 그 카드는 프록시 역할을 한다. 출금 요청이라는 액션이 Subject. 이 요청이 클라이언트와 상호작용하는 실제 operation.
사용 예시
// Subject 인터페이스
interface Payment {
request(amount: number): void;
}
// Real Subject 실제 객체
class Cash implements Payment {
request(amount: number) {
console.log(`결제 요청 완료. 금액: ${amount}`);
}
}
const targetObject = new Cash();
// Proxy
// new Proxy(실제 객체, 핸들러)
// 핸들러가 요청을 처리한다.
// const proxy = new Proxy(target, handler)
const paymentProxy = new Proxy(targetObject, {
// 실제 객체의 인스턴스
get: (object, prop) => {
// 핸들러: (targetObject의 참조, 인터페이스의 메서드)
// 실제 객체에 내가 요청 받은 메서드가 있는지 없는지 체크
if (prop === "request") {
return object[prop];
}
throw new Error("operation isn't implemented.")
},
});
paymentProxy.request(100); // 결제 요청 완료. 금액: 100
Proxy.revocable
Proxy.revocable(target, handler);
- Static method
- 나중에 취소가 가능한 프록시 객체를 만든다.
- 취소 후에는 다시 일반 객체처럼 동작한다.
const revocableProxy = Proxy.revocable(
{
name: "ha",
age: 10,
},
{
deleteProperty(target, key) {
return key === "age" ? false : Reflect.deleteProperty(target, key);
// age 일 때 삭제 못하도록
},
}
);
console.log(revocableProxy.proxy);
delete revocableProxy.proxy.name;
console.log(revocableProxy.proxy);
delete revocableProxy.proxy.age; // 삭제 안 됨
revocableProxy.revoke();
console.log(revocableProxy.proxy);
'부트캠프 > 자바스크립트 완벽 가이드' 카테고리의 다른 글
[JavaScript] Symbol.toStringTag (0) | 2023.03.06 |
---|---|
[JavaScript] getPrototypeOf, setPrototypeOf, isPrototypeOf (0) | 2023.03.06 |
13장. 비동기 자바스크립트 (0) | 2023.02.28 |
11장(2). 자바스크립트 표준 라이브러리 (날짜와 시간, JSON 직렬화) (0) | 2023.02.20 |
11장(1). 자바스크립트 표준 라이브러리 (Set, Map, 정규 표현식) (0) | 2023.02.20 |