동이 트기 전 가장 어두운 시간

952025년 11월 18일3

릴리스까지 남은 시간은 이제 불과 몇 시간. 메타 캠퍼스는 깊은 어둠에 잠겨 있었지만, React Core Team의 사무실 몇몇 곳에는 여전히 불이 켜져 있었다. 릴리스 매니저와 핵심 엔지니어 몇 명은 만일의 사태에 대비해 사무실에 남아 마지막 밤을 지새우고 있었다.

앤드류 클라크는 자신의 집 서재에서 잠을 이루지 못하고 있었다. 그는 커피 한 잔을 들고 모니터 앞에 앉았다. 화면에는 아무것도 실행하고 있지 않은 검은 터미널 창 하나만 덩그러니 열려 있었다. 그 위에서 하얀 커서가 규칙적으로 깜빡이고 있었다.

그는 몇 시간 뒤, 릴리스 매니저가 저 터미널 창에 입력하게 될 단 하나의 명령어를 떠올렸다.

npm publish

너무나 단순한 두 단어. 하지만 그 두 단어 뒤에는 지난 몇 년간 팀이 쏟아부은 수백만 시간의 노력이 담겨 있었다.

그는 깜빡이는 커서를 보며, 길고 길었던 여정을 조용히 되새겼다.

실리콘밸리의 그림자를 드리웠던 로딩 스피너에 대한 좌절감. 번들이라는 거대한 괴물과 싸웠던 날들. 세바스찬이 던졌던, “만약 컴포넌트가 브라우저로 전송되지 않는다면?”이라는 도발적인 질문이 회의실의 공기를 바꾸었던 그 순간.

첫 번째 서버 컴포넌트 프로토타입이 투박한 텍스트를 화면에 뱉어냈을 때의 전율. 커뮤니티의 거센 비판과 혼란 속에서 소통의 중요성을 뼈저리게 깨달았던 시간들. use 훅이 useEffect의 복잡성을 단 한 줄로 대체했을 때의 희열. 그리고 마지막 순간까지 팀을 괴롭혔던, 동시성 렌더러의 미세한 버그를 잡고 안도의 한숨을 내쉬었던 기억까지.

그 모든 순간이 주마등처럼 그의 뇌리를 스쳐 지나갔다.

수많은 갈림길이 있었고, 수없이 많은 기술적 선택의 순간들이 있었다. 때로는 격렬하게 논쟁했고, 때로는 서로의 아이디어에 감탄했다. 그 모든 과정이 모여 지금의 React 19를 만들었다.

이것이 과연 옳은 길이었을까? 커뮤니티는 이 거대한 변화를 받아들여 줄까?

알 수 없었다. 주사위는 이미 던져졌다. 그들이 할 수 있는 모든 것을 다했고, 이제 남은 것은 세상의 평가를 겸허하게 기다리는 것뿐이었다.

창밖으로 동이 트기 전의 희미한 여명이 비치기 시작했다. 밤의 가장 깊은 어둠이 지나가고 있었다.

앤드류는 자리에서 일어났다. 그는 더 이상 과거를 회상하지 않았다. 그의 시선은 이제 곧 밝아올 아침, 그리고 React가 열어갈 새로운 시대를 향하고 있었다. 그는 깜빡이는 커서를 뒤로하고, 역사의 다음 페이지가 펼쳐질 그 순간을 맞이하기 위해 마음을 다잡았다. 모든 준비는 끝났다.