WeakMap.clear() 메서드란?
WeakMap 객체의 clear() 메서드는 해당 WeakMap에 저장된 모든 키/값(key/value) 쌍을 한 번에 삭제하는 기능을 합니다. 일반 Map과 달리 WeakMap은 키로 사용된 객체가 더 이상 참조되지 않으면 자동으로 가비지 컬렉션 대상이 되는데, clear()는 이러한 내부 정리 과정과 무관하게 저장된 모든 데이터를 즉시 비워버리는 역할을 했습니다.
표준 사양에서 제거된 이유
중요한 점은 이 메서드가 현재 ECMAScript 표준 사양에서 제거되었다는 것입니다. clear()는 가비지 컬렉터의 내부 동작 타이밍을 외부에서 추측할 수 있게 만들어 보안상 부작용(사이드 채널 공격 가능성)을 일으킬 수 있어 표준에서 제외되었습니다.
따라서 최신 자바스크립트 환경에서는 WeakMap.prototype.clear를 직접 호출할 수 없습니다. 하지만 WeakMap 객체를 감싸는 래퍼(Wrapper) 클래스를 작성하고 그 안에서 clear 기능을 직접 구현하면 동일한 효과를 얻을 수 있습니다.
구현 예제: ClearableWeakMap
아래 코드는 WeakMap을 내부에 두고 clear, delete, get, has, set 메서드를 지원하는 래퍼 클래스입니다.
class ClearableWeakMap {
constructor(init) {
this._wm = new WeakMap(init)
}
clear() {
// 새로운 빈 WeakMap으로 교체하여 모든 데이터를 제거
this._wm = new WeakMap()
}
delete(k) {
return this._wm.delete(k)
}
get(k) {
return this._wm.get(k)
}
has(k) {
return this._wm.has(k)
}
set(k, v) {
this._wm.set(k, v)
return this
}
}동작 방식 설명
clear()의 핵심 아이디어는 단순합니다. 기존 WeakMap의 내용을 하나씩 지우는 대신, 새로운 빈 WeakMap 인스턴스로 교체하는 것입니다. 이렇게 하면 기존 객체에 대한 참조가 끊기므로 저장되어 있던 모든 키/값 쌍은 곧바로 가비지 컬렉션의 대상이 됩니다.
또한 set() 메서드가 this를 반환하도록 작성되어 있어, 다음과 같이 메서드 체이닝(method chaining)도 가능합니다.
const cwm = new ClearableWeakMap(); cwm.set(obj1, 'data1').set(obj2, 'data2'); cwm.has(obj1); // true cwm.clear(); cwm.has(obj1); // false
정리
WeakMap.prototype.clear()는 원래 모든 키/값 쌍을 제거하기 위한 메서드였습니다.- 보안상의 이유로 현재 표준 사양에는 포함되어 있지 않습니다.
- 래퍼 클래스를 활용하면 얼마든지 동일한 기능을 직접 구현할 수 있습니다.