조던 워크가 제안한 단방향 데이터 흐름은 하나의 원칙이자 철학이었다. 하지만 팀원들에게 그것은 아직 낯설고, 어딘가 비현실적인 개념이었다. 그들의 머릿속에는 여전히 백본(Backbone.js)이 일으켰던 ‘업데이트 지옥’의 트라우마가 깊이 새겨져 있었다.
그 깨달음의 순간은 예상치 못한 곳에서 찾아왔다. 팀 회의에서 새로운 기능에 대한 논의가 한창일 때였다. 기획팀은 뉴스피드 게시물에 ‘설문조사’ 기능을 추가하자고 제안했다. 사용자가 선택지를 클릭하면, 실시간으로 투표 결과가 그래프로 표시되는 복잡한 기능이었다.
그 말을 듣는 순간, 맷의 얼굴이 굳어졌다. 그의 뇌리에 끔찍했던 무한 루프의 기억이 되살아났다.
“잠깐만요.” 톰이 회의를 중단시켰다. 그의 목소리는 신중했다. “이 기능을 추가했을 때, 과거와 같은 재앙이 반복되지 않으리란 보장이 있습니까? 사용자가 설문조사 항목을 클릭하는 것이, 게시물의 다른 상태를 바꾸고, 그게 또 헤더를 업데이트하고, 결국 다시 설문조사 뷰를 건드리는… 그 끔찍한 연쇄 반응 말입니다.”
회의실에 있던 개발자들의 표정이 어두워졌다. 모두가 같은 생각을 하고 있었다. 백본의 구조 아래에서는, 새로운 기능 하나가 기존 시스템 전체를 마비시킬 수 있는 잠재적인 폭탄과도 같았다.
바로 그때, 맷이 조용히 입을 열었다.
“아니요. 그런 일은 일어날 수 없습니다.”
모두의 시선이 그에게 쏠렸다. 그의 목소리에는 이전과 다른 확신이 담겨 있었다.
“조던의 방식대로라면 말입니다.”
맷은 자리에서 일어나 화이트보드로 걸어갔다. 그는 과거의 실수를 되짚었다.
“이전에는 SurveyView
가 SurveyModel
을 직접 바꿨습니다. 그리고 SurveyModel
의 변경 이벤트를 다른 뷰, 예를 들어 PostHeaderView
가 듣고 있다가 자신을 업데이트했죠. 문제는 PostHeaderView
도 다른 모델을 바꿀 수 있었다는 겁니다. 서로가 서로를 물고 뜯는 구조였어요.”
그는 마커로 어지럽게 얽힌 화살표들을 지워나갔다. 그리고 조던이 그렸던 것처럼, 위에서 아래로 향하는 단 하나의 깨끗한 화살표를 그렸다.
“하지만 새로운 방식에서는, 사용자가 설문조사 항목을 클릭하면 SurveyView
는 아무것도 바꾸지 못합니다. 그저 ‘사용자가 A 항목을 선택했습니다’라는 신호를 맨 꼭대기에 있는 거대한 데이터 저장소로 보낼 뿐이죠.”
그의 설명은 명료했다.
“신호를 받은 데이터 저장소는 자신의 상태를 갱신합니다. 그리고 그 즉시, 애플리케이션 전체에 ‘새로운 데이터가 이것이니, 모두 이걸 보고 다시 그리세요!’라고 명령을 내립니다. <App>
부터 <Newsfeed>
, <Post>
, 그리고 <SurveyView>
까지, 모든 컴포넌트는 오직 이 새로운 데이터만을 보고 자신의 모습을 새로 그립니다. <SurveyView>
가 제멋대로 PostHeaderView
를 건드릴 방법 자체가 원천적으로 차단된 겁니다.”
그 순간, 회의실에 있던 모두의 머릿속에서 모든 것이 연결되었다.
이것은 단순히 코딩 규칙이나 약속이 아니었다. 라이브러리 자체가 강제하는, 거스를 수 없는 물리 법칙과도 같았다. 데이터의 흐름은 한 방향으로 고정되어 있기에, 개발자가 실수로라도 순환 고리를 만들 가능성이 아예 사라지는 것이다.
톰은 깊은 탄성을 내뱉었다.
“버그를 잡는 수준이 아니군. 버그가 애초에 발생할 수 없는 구조를 만드는 거였어.”
단방향 데이터 흐름.
그것은 더 이상 조던 워크 혼자만의 이상이 아니었다. 팀 전체가 마침내 그 가치를, 그 위대함을 깨닫기 시작한 순간이었다. 이제 그들의 마음은 하나로 모였다.
‘이것을 반드시 성공시켜야 한다.’
하지만 모두의 가슴을 뜨겁게 달군 그 깨달음의 끝에는, 여전히 거대한 산 하나가 그들을 기다리고 있었다.
“알겠습니다. 하지만… 데이터가 조금만 바뀌어도 매번 모든 것을 다시 계산하고 그린다면, 성능은 어떡하죠?”
맷이 모두를 대신해 가장 현실적인 질문을 던졌다. 그 질문에 답하기 위해, 조던은 자신의 비장의 무기를 꺼내야만 했다.