구독 최적화, Recoil과의 만남

8

발행일: 2025년 05월 19일

의존성 그래프. 그것은 Jotai의 심장을 관통하는 대동맥이자, 동시에 가장 풀기 어려운 고르디우스의 매듭이었다. 다이시 카토는 며칠 밤낮을 이 보이지 않는 거미줄과 씨름했다. 그의 책상 위에는 커피 자국이 선명한 빈 종이들이 수북이 쌓여갔다. 복잡하게 얽힌 원과 화살표들, 그래프 탐색 알고리즘(DFS, BFS, 위상 정렬…)의 흔적, 메모이제이션 기법에 대한 고민들이 그의 고뇌를 고스란히 보여주고 있었다.

“단순히 연결하는 것만으로는 부족해. 핵심은 ‘최적화된 전파’야.”

그는 닥치는 대로 관련 자료를 파고들었다. 그래프 이론, 반응형 프로그래밍(Reactive Programming) 논문, 심지어는 게임 엔진이나 데이터베이스 시스템에서 유사한 의존성 문제를 어떻게 해결하는지까지. 마치 미지의 영역을 탐험하는 고고학자처럼, 그는 작은 실마리라도 놓치지 않으려 애썼다.

다양한 데이터 구조와 알고리즘을 조합하며 프로토타입 코드를 수정하고 또 수정했다. WeakMap을 이용해 가비지 컬렉션의 부담을 덜면서도 동적인 의존성을 추적하는 방법, 상태 변경 시 최소한의 노드만 다시 계산하도록 영리하게 캐싱(caching)하는 기법… 조금씩 윤곽이 잡히기 시작했지만, 여전히 완벽한 해답이라고 확신하기에는 부족함이 느껴졌다. 마치 안갯속에서 희미하게 보이는 등대를 향해 노를 젓는 기분이었다.

그러던 어느 날, 그는 잠시 머리를 식힐 겸 최신 기술 트렌드를 살펴보던 중이었다. 우연히 클릭한 한 기술 블로그 포스트. 제목은 ‘Facebook(현 Meta)의 새로운 상태 관리 라이브러리, Recoil을 소개합니다’.

“Recoil…?”

처음 들어보는 이름이었다. 하지만 페이스북이라는 이름값 때문에 그는 무심코 글을 읽어 내려갔다. 그리고… 그의 눈이 점점 커지기 시작했다.

Recoil 역시 ‘아토믹 스테이트’ 개념을 기반으로 하고 있었다! 상태를 ‘atom’이라는 독립적인 단위로 정의하고, ‘selector’라는 개념을 통해 파생 상태를 다루며, 자동으로 의존성을 추적하여 최적화된 업데이트를 수행한다는 설명.

순간, 그의 등 뒤로 식은땀이 흘렀다. 온몸의 피가 차갑게 식는 듯한 느낌이었다.

“나만… 나만 이런 생각을 한 게 아니었어!”

세상에 이런 우연이 있나. 자신이 몇 주간 밤낮으로 씨름하며 도달했던 바로 그 아이디어를, 저 거대한 테크 기업 페이스북에서도 똑같이 구현하여 발표한 것이다! 마치 자신이 발견했다고 믿었던 신대륙에 이미 다른 탐험가의 깃발이 꽂혀 있는 것을 발견한 기분이었다.

그는 허탈감과 동시에 묘한 안도감을 느꼈다. 자신의 아이디어가 터무니없는 것이 아니었다는 반증. 페이스북의 엔지니어들 역시 같은 문제의식을 느끼고 비슷한 해답에 도달했다는 사실은, 아토믹 스테이트 모델의 잠재력을 역설적으로 증명하는 것이었다.

카토는 즉시 Recoil의 공식 문서와 API 레퍼런스를 파고들었다. 비슷한 철학에서 출발했지만, 세부적인 구현 방식과 API 디자인에는 미묘한 차이점들이 존재했다.

가장 눈에 띄는 차이는 상태 식별 방식이었다. Recoil은 atom과 selector를 정의할 때 고유한 문자열 키(string key)를 사용했다. 전역적으로 유일해야 하는 이 키는 디버깅에는 유용했지만, 때로는 작명에 대한 부담이나 잠재적인 충돌 가능성을 안고 있었다.

반면, 카토가 구상하고 있던 Jotai는 별도의 키 없이, atom() 함수가 반환하는 객체 참조(object reference) 자체를 식별자로 사용하는 방식이었다. 더 간결하고 자바스크립트의 본성에 가까운 접근 방식이라고 그는 생각했다.

“그래, 분명 달라. 지향점도 미묘하게 다를 수 있어.”

Recoil은 페이스북 내부의 복잡한 요구사항을 해결하기 위해 탄생했을 가능성이 높았다. 다양한 기능과 설정 옵션을 제공하는 만큼, 라이브러리 자체의 크기나 복잡성도 무시할 수 없을 터였다.

하지만 카토가 추구하는 Jotai는 달랐다. 그는 극단적인 간결함과 최소주의를 지향했다. 핵심 기능은 최대한 작고 가볍게 유지하되, 필요한 기능은 확장 가능하도록. 번들 사이즈에 민감한 환경이나, 점진적인 도입을 원하는 개발자들에게 더 매력적인 선택지가 될 수 있을 터였다.

Recoil의 존재는 더 이상 좌절이 아니었다. 오히려 강력한 자극제이자, 참고할 수 있는 선구자의 발자취였다. 그는 Recoil의 구현 방식에서 영감을 얻기도 하고, 반대로 Jotai만의 차별점을 더욱 명확히 인식하며 개발 방향을 다듬어 나갔다.

“경쟁자인가? 아니, 어쩌면… 이 길을 함께 걸어갈 동반자일지도.”

의존성 그래프라는 거대한 산 앞에서 만난 예상치 못한 존재, Recoil. 카토는 이 만남을 통해 자신의 목표를 더욱 선명하게 설정할 수 있었다. 그는 다시 키보드 앞에 앉았다. 그의 눈빛은 이제 단순한 문제 해결을 넘어, Jotai만의 고유한 가치를 증명하겠다는 새로운 투지로 불타오르고 있었다. 보이지 않는 거미줄과의 싸움은 계속되었지만, 이제 그는 더 이상 혼자가 아니었다.