회의실의 공기는 팽팽한 긴장감으로 가득했다. 모든 눈이 프로젝터 스크린에 고정되었다. 스크린에는 500개의 행(row)을 가진 테이블이 띄워져 있었다. 각 행에는 랜덤한 숫자와 ‘업데이트’ 버튼이 있었다.
“이 페이지는 500개의 컴포넌트로 이루어져 있습니다.”
조던 워크가 설명했다. “각 행이 독립적인 컴포넌트죠. 지금부터 매초마다, 이 500개 중 랜덤한 10개의 행에 있는 숫자를 새로운 값으로 업데이트할 겁니다. 그리고 매 업데이트마다, 제 라이브러리는 전체 500개 행에 대한 버추얼 DOM 트리를 새로 생성하고, 이전 트리와 비교하여 변경된 10개만 실제 DOM에 반영할 겁니다.”
데이빗이 팔짱을 끼며 비꼬는 투로 말했다.
“1초에 열 번씩이요? 아마 몇 초 안에 브라우저가 죽겠군요.”
조던은 대답 대신, 조용히 스크립트를 실행했다.
startDemo()
모두가 숨을 죽였다. 1초, 2초, 3초…
아무 일도 일어나지 않는 것처럼 보였다. 테이블은 고요했다. 하지만 자세히 보니, 테이블 곳곳의 숫자들만 미세하게, 하지만 끊임없이 바뀌고 있었다. 1초에 열 번씩, 마치 살아있는 유기체처럼.
가장 놀라운 것은 브라우저의 반응이었다. CPU 사용률은 안정적이었고, 스크롤은 버벅임 하나 없이 부드러웠다. 페이지는 전혀 느려지지 않았다.
“...말도 안 돼.”
누군가 나지막이 중얼거렸다. 그들의 상식으로는 불가능한 일이었다. 매초 500개 컴포넌트의 렌더 함수를 다시 실행하고, 수천 개의 노드를 가진 버추얼 DOM 트리를 비교하는데도 페이지가 이토록 부드럽게 동작한다는 것은 마법과도 같았다.
데이빗은 자신의 눈을 의심했다. 그는 자리에서 일어나 스크린 앞으로 다가갔다. 그는 브라우저 개발자 도구를 열어, 실제 DOM의 변화를 추적하는 ‘페인트 플래싱(Paint Flashing)’ 기능을 켰다. 이 기능을 켜면, 화면에서 다시 그려지는 모든 영역이 녹색으로 깜빡인다.
데모를 다시 실행하자, 경이로운 광경이 펼쳐졌다.
테이블 전체가 녹색으로 번쩍이는 대신, 오직 숫자가 바뀌는 10개의 작은 셀(cell) 주위에서만 아주 희미한 녹색 불빛이 반짝였다 사라졌다. 조던의 라이브러리가, 약속했던 대로 정확하게 변경된 부분만 찾아내어 최소한의 DOM 업데이트를 수행하고 있음을 명백하게 보여주는 증거였다.
“어떻게… 어떻게 이게 가능한 겁니까?” 맷이 경외감에 찬 목소리로 물었다.
“비교 알고리즘 덕분입니다.” 조던이 차분하게 대답했다. “버추얼 DOM 객체를 비교하는 것은 자바스크립트 메모리 안에서 일어나기 때문에 지극히 빠릅니다. 실제 병목 구간인 DOM 조작은, 보시다시피 꼭 필요한 10번만 일어나고 있죠. 이 모든 과정이 16밀리초(60fps) 안에 끝나기 때문에, 우리 눈에는 부드럽게 보이는 겁니다.”
회의실을 지배하던 차가운 의심과 냉소는 어느새 사라져 있었다. 그 자리에는 놀라움과 혼란, 그리고 희미한 흥분이 뒤섞여 있었다. 그들은 방금, 자신들의 오랜 상식이 무너지는 순간을 목격했다.
그것은 거대한 패러다임의 전환이었다. 개발자의 영리함에 의존하여 성능을 쥐어짜 내던 시대에서, 똑똑한 라이브러리에게 모든 것을 위임하는 새로운 시대의 가능성을 눈앞에서 본 것이다.
톰은 굳은 표정으로 조던을 바라보았다. 그의 머릿속은 복잡했다. 이 기술이 가진 엄청난 잠재력과 동시에, 이것을 페이스북 전체 시스템에 도입했을 때 겪게 될 거대한 혼란이 교차했다.
하지만 한 가지는 확실했다. 조던 워크가 만든 이것은, 단순한 실험이나 장난이 아니었다. 진짜였다.