2020년, 캘리포니아의 햇살은 여전히 눈부셨지만, 웹의 세계에는 보이지 않는 그림자가 드리우고 있었다. 기술의 정점이자 혁신의 심장인 실리콘밸리에서조차, 사용자들은 똑같은 경험을 하고 있었다. 바로 ‘기다림’이라는 이름의 고문이었다.
샌프란시스코의 한 카페, 창가에 앉은 여성이 스마트폰 화면을 초조하게 매만졌다. 방금 막 화제가 된 쇼핑몰의 여름 세일 페이지를 클릭했지만, 화면에 떠오른 것은 하얀 배경 위에서 하염없이 빙글빙글 돌아가는 로딩 스피너뿐이었다. 1초, 2초… 인내심의 한계는 찰나와도 같았다. 그녀는 미간을 찌푸리며 미련 없이 앱을 닫아버렸다.
수천 킬로미터 떨어진 곳, 메타(Meta)의 캠퍼스에 있는 앤드류 클라크(Andrew Clark)는 마치 그 여성을 직접 보고 있기라도 한 것처럼, 이 모든 상황을 꿰뚫고 있었다. 그의 모니터에도 똑같은 로딩 스피너가 돌고 있었다. 물론 이건 실제 서비스가 아닌, 성능 분석 도구 위에서 재현된 시뮬레이션이었다. 하지만 그에게 이 작은 원은 단순한 애니메이션이 아니었다. 그것은 거대한 실패의 상징이었다.
“또 이 문제로군.”
나지막한 그의 독백에는 깊은 피로감이 묻어났다.
React. 그가 속한 팀이 세상에 내놓은 이 위대한 라이브러리는 웹 개발의 패러다임을 송두리째 바꿔 놓았다. 복잡한 UI를 마치 레고 블록처럼 조합 가능한 컴포넌트 단위로 관리하게 만들었고, 선언적인 방식으로 UI를 구축하는 아름다움을 개발자들에게 선사했다. 덕분에 세상에는 그 어느 때보다 화려하고 동적인 웹 애플리케이션들이 넘쳐났다.
하지만 성공은 언제나 그림자를 낳는 법이다.
문제는 명확했다. 사용자의 브라우저에서 모든 것을 처리하는 SPA(Single Page Application) 아키텍처. 이 방식은 한번 로딩된 후에는 놀랍도록 부드러운 사용자 경험을 제공했지만, 바로 그 ‘한번 로딩’이 거대한 장벽이 되어가고 있었다.
애플리케이션이 복잡해질수록, 사용자의 브라우저가 최초에 내려받아야 하는 자바스크립트의 양은 눈덩이처럼 불어났다. 수십, 수백 개의 컴포넌트, 라이브러리, 상태 관리 로직들이 하나의 거대한 덩어리, ‘번들(Bundle)’이 되어 사용자에게 전송되었다. 사용자는 이 거대한 코드 뭉치를 모두 내려받고, 파싱하고, 실행할 때까지 하염없이 기다려야 했다. 화면 위에서 돌아가는 스피너는 바로 그 기다림의 시간을 대변하는 표식이었다.
“우리는 사용자에게 너무 많은 짐을 지우고 있어.”
앤드류는 생각했다. 마치 이사를 가는데, 집 안의 모든 가구와 잡동사니를 현관문 앞에 전부 꺼내놓고 나서야 문을 열어주는 꼴이었다. 손님은 당장 소파에 앉고 싶을 뿐인데도 말이다.
이것은 단순히 몇몇 웹사이트의 문제가 아니었다. React 생태계 전체가 직면한 구조적인 한계였다. 개발자들은 코드 스플리팅(Code-splitting), 레이지 로딩(Lazy-loading) 같은 기법으로 이 문제를 해결하려 애썼지만, 그것은 임시방편에 불과했다. 복잡성을 해결하기 위해 또 다른 복잡성을 더하는 악순환이 반복될 뿐이었다.
앤드류는 의자 깊숙이 몸을 묻었다. 자신들이 만든 도구가, 세상을 더 나은 곳으로 만들고자 했던 그 열정의 산물이, 이제는 웹의 발목을 잡는 족쇄가 되어가고 있었다. 이대로라면 React가 쌓아 올린 모든 혁신은 ‘느리고 무거운 프레임워크’라는 오명 아래 빛이 바랠 터였다.
기존의 방식을 개선하는 것만으로는 부족했다. 부분적인 수정이나 최적화로는 이 거대한 흐름을 되돌릴 수 없었다.
그의 머릿속에 하나의 생각이 뇌리를 스쳤다.
‘만약… 만약 이 모든 짐을 사용자가 짊어지지 않아도 된다면?’
그것은 React의 근본 철학을 흔드는 위험한 생각이었다. 하지만 동시에, 이 교착 상태를 벗어날 유일한 열쇠처럼 느껴졌다. 어둠이 짙게 깔린 실리콘밸리의 밤, 앤드류 클라크의 눈빛이 스피너의 궤적 너머, 아주 새로운 가능성을 향하고 있었다.
근본부터 다시 생각해야 할 때가 온 것이었다.