보이지 않는 거미줄, 의존성 그래프
제7화
발행일: 2025년 05월 19일
Jotai의 첫 코드 라인이 세상에 그 모습을 드러냈다. atom()
함수는 독립적인 상태 조각들을 탄생시켰고, useAtom()
훅은 그것들을 컴포넌트와 우아하게 연결했다. 다이시 카토는 자신이 만든 작은 프로토타입이 매끄럽게 작동하는 것을 보며 잠시 만족감에 젖었다. 간결함, 직관성. 그가 추구했던 가치들이 코드 안에 숨 쉬고 있었다.
하지만 그 평화는 오래가지 못했다. 마치 고요한 수면 아래 꿈틀대는 거대한 심해어처럼, 아토믹 모델의 가장 근본적이고 까다로운 문제가 서서히 고개를 들기 시작했다.
그것은 바로 ‘관계’의 문제였다.
독립적인 원자들. 그것만으로는 부족했다. 현실의 애플리케이션 상태는 거미줄처럼 복잡하게 얽혀 있었다. 사용자의 테마 설정(원자 A)이 바뀌면, 특정 컴포넌트의 스타일(파생 원자 B)이 바뀌어야 하고, 그 스타일 값에 따라 또 다른 애니메이션 효과(파생 원자 C)가 적용되어야 할 수도 있다.
A -> B -> C
이런 의존성의 사슬. 카토가 ‘함수로서의 존재’라고 정의했던 파생 원자들이 바로 이 관계를 표현하는 매개체였다. fullNameAtom
이 firstNameAtom
과 lastNameAtom
에 의존하듯, 수많은 원자와 파생 원자들이 서로 보이지 않는 실로 연결되어 거대한 네트워크를 형성할 터였다.
‘의존성 그래프(Dependency Graph).’
카토는 이 기술 용어를 떠올리며 등골이 서늘해지는 것을 느꼈다. 이건 단순히 개념적인 문제가 아니었다. Jotai가 제대로 작동하기 위한 핵심 기술, 넘어서야 할 첫 번째 거대한 기술적 난관이었다.
“문제는… 이 보이지 않는 거미줄을 어떻게 관리하느냐야.”
그는 키보드에서 손을 떼고 의자 깊숙이 몸을 기댔다. 그의 머릿속은 복잡한 상념으로 가득 찼다.
어떤 원자(예: firstNameAtom
)의 값이 변경되었다고 가정해보자. Jotai는 이 변경 사항을 정확히 어떤 파생 원자들(fullNameAtom
등)과, 또 그 파생 원자들을 구독하는 어떤 컴포넌트들에게만 효율적으로 전파해야 한다. 마치 거미줄의 특정 지점에 작은 진동이 발생했을 때, 그 진동이 정확히 연결된 실들만을 따라 퍼져나가야 하는 것처럼.
만약 이 전파 과정이 비효율적이라면? 관련 없는 원자나 컴포넌트까지 깨우게 된다면? 그것은 결국 Zustand가 해결하려 했던 Context API의 문제, 즉 불필요한 업데이트의 재앙으로 되돌아가는 꼴이었다. 아토믹 모델의 장점은 순식간에 사라지고 말 터였다.
“자동화… 그래, 핵심은 자동화야.”
Zustand에서는 개발자가 셀렉터 함수를 통해 명시적으로 필요한 상태 조각을 ‘선택’했다. 하지만 Jotai의 파생 원자는 그저 함수일 뿐, 자신이 어떤 원자에 의존하는지 get()
함수 호출을 통해 암시적으로 드러낼 뿐이었다.
Jotai 라이브러리는 이 암시적인 의존성을 스스로 파악하고, 내부적으로 이 거대한 의존성 그래프를 실시간으로 구축하고 갱신해야 했다. 그리고 상태 변경이 발생했을 때, 이 그래프를 따라 최소한의 경로로 업데이트를 전파해야 했다. 개발자는 아무것도 신경 쓰지 않도록, 모든 것이 마법처럼 일어나야 했다.
“하지만 어떻게?”
카토는 여러 가지 시나리오를 떠올렸다.
- 순환 참조: 만약 원자 A가 원자 B에 의존하고, 원자 B가 다시 원자 A에 의존한다면? 무한 루프에 빠지지 않도록 어떻게 방지할 것인가?
- 동적 의존성: 파생 원자 함수 내부의 조건문에 따라 의존하는 원자가 달라진다면? 이 변화무쌍한 관계를 어떻게 실시간으로 추적할 것인가?
- 불필요한 재계산 방지: 어떤 원자가 변경되었지만, 최종적으로 파생 원자의 결과값은 변하지 않았다면? 그 파생 원자에 의존하는 컴포넌트들은 리렌더링되지 않도록 어떻게 최적화할 것인가?
머릿속이 터질 것 같았다. 마치 수백 가닥의 엉킨 실타래를 풀어야 하는 기분이었다. 하나의 실을 잘못 당기면 전체가 더 엉망이 되어버릴지도 모르는 위태로운 작업.
카토는 빈 종이에 원과 화살표를 그려가며 의존성 그래프를 시각화해보려 애썼다. 하지만 원자가 수십, 수백 개로 늘어나는 순간, 그 관계는 인간의 머리로 감당하기 어려운 복잡성을 띠기 시작했다.
“이건… 정말 어려운 문제인데.”
그는 깊은 한숨을 내쉬었다. 아토믹 스테이트라는 아이디어의 아름다움 뒤에는, 이처럼 복잡하고 정교한 기술적 기반이 필요하다는 것을 절감했다. 보이지 않는 거미줄을 엮고 관리하는 기술. 이것을 해결하지 못하면 Jotai는 결코 세상의 빛을 볼 수 없을 터였다.
그의 눈앞에 놓인 첫 번째 거대한 장벽. 카토는 이 벽을 넘어서기 위한 실마리를 찾아야 했다. 그의 탐구는 이제 알고리즘과 자료구조, 그리고 어쩌면 이미 이 문제를 고민했을 다른 선구자들의 흔적을 향해 나아가기 시작했다. 보이지 않는 거미줄과의 싸움이 시작된 것이다.