백본(Backbone.js)이 가져다준 짧은 평화는 오래가지 못했다. 얼마 지나지 않아, 개발팀은 이전과는 비교할 수 없는 거대한 재앙에 직면했다. 그들은 그것을 ‘업데이트 지옥(Update Hell)’이라 불렀다.
사건은 페이스북의 메인 뉴스피드 기능에서 터졌다. 뉴스피드는 수십 개의 모델과 뷰가 얽혀있는, 페이스북 애플리케이션의 가장 복잡한 부분이었다.
한 사용자가 친구의 게시물에 ‘좋아요’ 버튼을 눌렀다. 지극히 평범한 행동이었다. 하지만 그 순간, 사용자의 브라우저는 응답을 멈추고 CPU 팬이 미친 듯이 돌기 시작했다. 페이지 전체가 얼어붙었다.
“또야!”
뉴스피드 팀의 개발자 한 명이 비명을 지르듯 외쳤다. 팀 전체가 그의 모니터로 몰려들었다. 브라우저를 강제 종료하고 다시 디버깅 모드로 접속했다. 그리고 ‘좋아요’ 버튼을 다시 클릭했다.
디버거의 콘솔 창에는 끝없이 반복되는 로그가 폭포수처럼 쏟아지고 있었다.
PostView: Rendering...
LikeModel: Changed!
NotificationModel: Changed!
HeaderView: Rendering...
PostModel: Something changed, re-fetching...
PostView: Rendering...
LikeModel: Changed!
...
그들은 무한 루프에 빠진 것이다.
팀 리더 톰은 화이트보드 앞에 서서 처참한 심정으로 이벤트의 흐름을 그리기 시작했다.
- 사용자가
PostView
의 ‘좋아요’ 버튼을 클릭한다. PostView
는LikeModel
의 상태를 변경한다. (likes: 1
)LikeModel
의 변경 이벤트(change:likes
)가 발생한다.- 이 이벤트를 듣고 있던
PostView
는 ‘좋아요’ 카운트를 갱신하기 위해 자신을 다시 렌더링한다. (첫 번째 업데이트) - 동시에, 이 이벤트를 듣고 있던
NotificationModel
은 새 알림 데이터를 생성한다. NotificationModel
의 변경 이벤트가 발생한다.- 이 이벤트를 듣고 있던
HeaderView
는 상단 알림 아이콘을 갱신하기 위해 자신을 다시 렌더링한다. (두 번째 업데이트) - 그런데 문제는 여기였다.
HeaderView
는 알림 아이콘뿐만 아니라 뉴스피드의 전반적인 상태도 관리하는 복잡한 로직을 가지고 있었다.HeaderView
는 렌더링 과정에서, ‘혹시 최신 게시물 정보가 바뀌었을지 모르니’PostModel
에게 데이터를 다시 가져오라는 명령을 내렸다. PostModel
은 서버에서 데이터를 새로 가져오면서 자신의 상태를 갱신하고, 변경 이벤트를 발생시킨다.- 이 이벤트를 듣고 있던
PostView
는 게시물 전체를 다시 그려야 한다고 판단, 자신을 또다시 렌더링한다. (세 번째 업데이트) - 그리고 이 과정에서
PostView
는 자신이 관리하는LikeModel
의 상태를 다시 한번 확인하고, 이는 또 다른 연쇄 이벤트를…
결국 A
가 B
를 바꾸고, B
가 C
를 바꾸고, C
가 다시 A
를 바꾸는 끔찍한 순환 고리가 완성된 것이다. 데이터의 흐름은 이제 양방향을 넘어, 어디로 튈지 모르는 미친 공처럼 객체들 사이를 헤집고 다녔다.
개발자들은 절망했다. 이 고리를 끊으려면 HeaderView
가 PostModel
을 건드리지 않게 하거나, PostView
가 PostModel
의 특정 변화에는 반응하지 않도록 예외 처리를 해야 했다. 하지만 그런 ‘땜질’은 또 다른 곳에서 예측 불가능한 버그를 낳을 것이 뻔했다.
그들이 머리를 맞대고 고통스러워하고 있을 때, 회의실 뒤편에서 모든 것을 지켜보던 조던 워크가 나지막이 말했다.
“이벤트 리스너가 너무 많아서 생기는 문제입니다.”
모두의 시선이 그에게 향했다.
“모든 뷰가 모든 모델의 변화에 귀를 기울이고 있으니, 이런 연쇄 반응이 생기는 겁니다. 만약… 아무도 서로에게 귀 기울이지 않는다면 어떨까요?”
톰이 미간을 찌푸리며 되물었다.
“그럼 데이터가 바뀐 걸 어떻게 압니까?”
“알 필요 없습니다.”
조던의 대답은 충격적이었다.
“데이터가 바뀌면, 그냥 처음부터 끝까지, 모든 것을 다시 그리는 겁니다. 언제나.”
회의실에 침묵이 흘렀다. 그건 미친 소리였다. ‘좋아요’ 버튼 하나 눌렀다고 수백 개의 게시물과 댓글, 채팅창까지 화면 전체를 다시 그린다고? 아무리 컴퓨터가 빨라도 그런 식으로는 성능을 감당할 수 없을 터였다.
“성능은 어떡하고요? 페이지 전체가 마비될 겁니다.” 맷이 반박했다.
“네, 지금 방식으로는 그렇겠죠.”
조던은 맷의 눈을 똑바로 바라보았다. 그의 눈빛에는 불가능에 도전하려는 자의 기묘한 확신이 서려 있었다.
“그래서 우리에겐 새로운 방식이 필요한 겁니다. 눈에 보이는 진짜 세상이 아니라, 보이지 않는 세상에서 먼저 모든 것을 그려보고, 바뀐 부분만 찾아내서 현실에 딱 한 번만 반영하는 기술. 그런 게 있다면 가능할지도 모릅니다.”
보이지 않는 세상. 바뀐 부분만 찾아내는 기술.
그의 말은 공상 과학 소설처럼 들렸지만, 업데이트 지옥의 한복판에 서 있던 개발자들의 뇌리에 그 단어들이 깊이 박히기 시작했다.