각자의 자리에서 곪아 터지고 있던 문제들은 마침내 하나의 지점으로 수렴했다. 메타의 가상 회의실, 화면 속에는 React Core Team의 핵심 멤버들이 모두 모여 있었다. 앤드류 클라크, 세바스찬 마크바게, 조쉬 스토리, 로렌 탄. 그들의 얼굴에는 무거운 침묵과 긴장감이 감돌았다. 평소의 자유로운 기술 토론과는 사뭇 다른 분위기였다.
가장 먼저 침묵을 깬 것은 앤드류였다.
“모두가 같은 문제를 보고 있을 거라 생각합니다.”
그의 목소리는 차분했지만, 한 단어 한 단어에 무게가 실려 있었다.
“비대해지는 번들 사이즈, 클라이언트에서 시작되는 연쇄적인 데이터 요청, 그리고 SSR이 만든 하이드레이션 병목 현상까지. 이 모든 문제의 뿌리는 하나로 이어져 있습니다.”
앤드류는 잠시 말을 멈추고 화면 속 동료들을 둘러보았다. 모두의 표정에서 동의의 기색을 읽을 수 있었다.
“우리는 개발자들이 UI의 복잡성을 쉽게 다룰 수 있도록 React를 만들었습니다. 하지만 지금, 역설적이게도 React 자체가 웹 애플리케이션의 복잡성을 키우는 주범이 되어가고 있습니다.”
그것은 팀의 정체성을 뒤흔드는 고백이었다.
조쉬가 마이크를 켰다. “맞습니다. 우리는 클라이언트라는 한정된 공간 안에서 모든 것을 해결하려고만 했습니다. 렌더링, 데이터 페칭, 상태 관리, 이벤트 처리까지 전부요. 클라이언트는 이미 과부하 상태입니다.”
그의 말에 로렌이 고개를 끄덕이며 말을 이었다. “서버 데이터를 클라이언트 상태 관리 라이브러리로 관리하는 패턴이 대표적이죠. 그건 마치 망치 하나로 못질부터 나사 조이기, 용접까지 다 하려는 것과 같아요. 각자에게 맞는 도구가 필요한데, 우리는 개발자들에게 그런 도구를 주지 못했습니다.”
논의가 진행될수록, 그들이 마주한 문제들이 단순한 버그나 개선점이 아니라는 사실이 명확해졌다. 그것은 React의 패러다임 자체가 도달한 한계였다.
지금까지의 React는 ‘클라이언트’라는 무대 위에서 펼쳐지는 연극과도 같았다. 서버는 단지 무대 장치(HTML)와 소품(JSON 데이터)을 배달해 주는 역할에 그쳤다. 모든 배우(컴포넌트)는 무대 위로 올라와야만 연기를 시작할 수 있었다.
하지만 그 무대가 이제 관객(사용자)이 감당할 수 없을 만큼 붐비고 복잡해진 것이다.
회의 내내 조용히 듣고만 있던 세바스찬 마크바게가 드디어 입을 열었다. 그의 시선은 모니터 너머의 허공, 그보다 더 먼 미래를 향해 있는 듯했다.
“부분적인 최적화는 이제 의미가 없습니다. 코드 스플리팅을 더 잘하고, 하이드레이션 로직을 조금 개선하는 걸로는 이 문제를 해결할 수 없어요.”
그의 말에 모두가 숨을 죽였다.
“우리가 바꿔야 할 것은 무대 자체가 아니라, 연극의 연출 방식입니다. 어떤 배우는 무대 뒤(서버)에 남아 목소리만으로 연기할 수도 있어야 합니다. 모든 배우가 반드시 무대 위로 올라올 필요는 없어요.”
그 순간, 회의실의 공기가 바뀌었다. 막연하게 맴돌던 문제의식에 구체적인 방향성이 제시되었다. ‘서버’라는 공간을 더 이상 데이터 창고가 아닌, React 애플리케이션의 또 다른 실행 환경으로 바라보는 관점의 전환이었다.
앤드류는 결심을 굳혔다.
“좋습니다. 그럼 오늘부로, 이 근본적인 문제들을 해결하기 위한 새로운 프로젝트를 시작합니다.”
그의 선언에 반대하는 사람은 아무도 없었다. 이것은 더 이상 미룰 수 없는 과제이자, React가 다음 시대로 나아가기 위해 반드시 넘어야 할 산이었다. 길고 험난한 여정이 될 터였다. 어쩌면 수많은 개발자들에게 익숙했던 개발 방식을 완전히 뒤엎어야 할지도 모른다.
하지만 그들의 눈에는 두려움 대신, 거대한 도전을 앞둔 엔지니어 특유의 비장함과 결의가 가득 차 있었다. 운명적인 화상 회의가 끝났을 때, React의 역사는 새로운 장을 향한 첫 페이지를 조용히 넘기고 있었다.