마법 거울, 자바스크립트 Proxy의 재발견
제4화
발행일: 2025년 05월 27일
다이시 카토의 눈은 모니터 화면에 고정된 채, 자바스크립트 명세서의 깊은 심연을 헤엄치고 있었다. 그의 머릿속은 온통 하나의 질문으로 가득 차 있었다.
'어떻게 객체의 '직접적인 수정'을 감지할 것인가?'
단순히 state.count++
라고 썼을 때, 그 변화를 시스템이 알아채고 반응하게 만들 방법. 그것이 문제의 핵심이었다.
과거에도 비슷한 시도들은 있었다. Object.observe
같은 기능이 제안되었지만, 표준에서 제외된 지 오래였다. AngularJS 시절에 유행했던 '더티 체킹(Dirty Checking)' 방식은 주기적으로 이전 상태와 현재 상태를 비교하는 방식이었지만, 객체가 복잡해질수록 성능 저하가 심각했다. 비효율의 극치였다.
"뭔가… 더 근본적인 방법이 있을 텐데."
카토는 포기하지 않았다. 자바스크립트라는 언어 자체에, 마치 숨겨진 보물처럼, 이 문제를 해결할 열쇠가 잠들어 있을 거라는 강한 예감이 들었다. 그는 언어의 메타 프로그래밍(Metaprogramming) 영역, 즉 코드 자체를 조작하거나 코드의 동작 방식을 바꾸는 고급 기능들을 샅샅이 뒤지기 시작했다.
그리고 마침내, 그의 눈이 번뜩였다.
"Proxy!"
그의 입에서 나지막한 탄성이 터져 나왔다. 마치 오랫동안 잊고 지냈던 강력한 마법 주문을 다시 떠올린 듯한 표정이었다.
Proxy 객체. ES2015(ES6)에서 표준으로 도입된 기능. 이것은 단순한 객체가 아니었다. 이름 그대로, 다른 객체를 위한 '대리자(Proxy)' 역할을 수행하는 특별한 존재였다. Proxy는 목표 객체(Target Object)에 대한 기본적인 작업들인 속성 읽기(get
), 속성 쓰기(set
), 속성 삭제(deleteProperty
), 함수 호출(apply
) 등을 중간에서 가로채(intercept)고, 개발자가 정의한 커스텀 로직, 즉 '트랩(Trap)'을 실행할 수 있게 해주는 강력한 메커니즘이었다.
const target = { message: 'hello' };
const handler = {
get(target, prop, receiver) {
console.log(`속성 '${prop}'을 읽으려고 합니다!`);
return Reflect.get(...arguments);
},
set(target, prop, value, receiver) {
console.log(`속성 '${prop}'에 값 '${value}'를 설정하려고 합니다!`);
return Reflect.set(...arguments);
},
};
const proxy = new Proxy(target, handler);
console.log(proxy.message); // "속성 'message'을 읽으려고 합니다!" 출력 후 "hello" 출력
proxy.message = 'world'; // "속성 'message'에 값 'world'를 설정하려고 합니다!" 출력
"이거다…!"
카토의 심장이 다시 격렬하게 뛰기 시작했다. 그는 Proxy의 잠재력에 새삼 전율했다. 이것이야말로 그가 찾던 해답이었다.
Proxy를 이용하면, 상태 객체를 감싸는 투명한 '마법 거울'을 만들 수 있었다. 개발자는 그저 거울에 비친 객체(Proxy)를 자연스럽게 조작하면 된다. proxyState.count++
라고 쓰거나 proxyState.user.name = 'newName'
이라고 할당하는 순간, 거울 뒤에 숨겨진 set
트랩이 그 변경을 즉시 감지하고, 필요한 알림을 발생시키거나 추가적인 로직을 실행할 수 있는 것이다!
더 이상 set
함수를 명시적으로 호출할 필요가 없다. 스프레드 문법으로 고통받을 필요도 없다. Immer처럼 내부적으로 어떤 일이 일어나는지 신경 쓸 필요 없이, 그저 평범한 자바스크립트 코드를 작성하면, Proxy라는 마법 거울이 모든 변경을 알아서 비추고 반응해 줄 터였다.
"객체 변경을… 투명하게 감지할 수 있잖아! 완벽해!"
그의 얼굴에 흥분과 희열이 교차했다. 마치 오랫동안 풀리지 않던 난제의 실마리를 잡은 탐정처럼, 그의 눈빛은 확신으로 가득 찼다. Zustand와 Jotai를 만들 때와는 또 다른 종류의 짜릿함이었다. 이것은 기존의 방식을 개선하는 것을 넘어, 상태를 다루는 방식 자체를 근본적으로 뒤흔들 수 있는 잠재력을 지니고 있었다.
자바스크립트의 깊은 곳에 잠들어 있던 고대의 마법, Proxy. 다이시 카토는 이제 이 강력한 도구를 길들여, 개발자들이 꿈꿔왔던 가장 직관적인 상태 관리 경험을 현실로 만들 준비를 하고 있었다. 세 번째 혁명의 구체적인 청사진이 그의 머릿속에서 빠르게 그려지기 시작했다.