조던 워크의 회상, 그리고 새로운 시대의 서막

1002025년 11월 23일4

시간은 흘러 2014년의 어느 늦은 밤, 페이스북 캠퍼스는 고요함에 잠겨 있었다. 하지만 조던 워크의 모니터 불빛은 꺼질 줄 몰랐다. 그는 더 이상 자신만의 코드 에디터를 보고 있지 않았다. 그의 눈앞에는 수천 명의 개발자들이 활동하는, 활기 넘치는 리액트의 GitHub 저장소 페이지가 펼쳐져 있었다.

그는 천천히 스크롤을 내렸다.
세계 각국의 개발자들이 올린 이슈들, 자신들의 프로젝트에 리액트를 적용하며 겪은 경험을 공유하는 글들, 그리고 리액트의 발전에 기여하기 위해 보내온 수많은 코드 기여(Pull Request)들.

그는 불과 몇 년 전, 스파게티 코드 속에서 절망하던 동료들의 얼굴을 떠올렸다.
사라지지 않는 유령 같았던 알림 아이콘 버그. 하나의 문제를 해결하면 두 개의 새로운 문제가 터져 나오던 끔찍한 연쇄 반응. 개발자들이 ‘무엇을 바꿔야 할지’가 아니라, 자신의 변경이 ‘어떤 재앙을 불러올지’를 먼저 걱정해야 했던 그 혼돈의 시대.

그 모든 혼돈의 중심에서, 그는 스탠다드 ML의 순수함 속에서 보았던 하나의 단순한 진리를 떠올렸었다.

UI = f(data)

UI는 데이터의 함수일 뿐이라는, 너무나도 당연해서 오히려 혁명적이었던 그 아이디어.
그는 그 진리를 자바스크립트의 세계에 구현하기 위한 긴 여정을 시작했다.

성능이라는 거대한 벽은 ‘버추얼 DOM’이라는 역발상으로 넘어섰다. 실제 세계를 건드리기 전에, 가상의 세계에서 모든 것을 시뮬레이션하는 기법.

복잡하게 얽힌 의존성은 ‘컴포넌트’라는 독립된 부품의 개념으로 끊어냈다. 각 부품은 오직 자신의 역할에만 충실하면 되었다.

예측 불가능한 상태 변화는, propsstate라는 두 개의 명확한 데이터 소유권과, setState라는 단 하나의 변경 통로를 통해 질서를 부여했다.

외부 세계와의 위험한 소통은 componentDidMountcomponentWillUnmount라는 ‘생명주기’의 문을 통해서만 안전하게 이루어지도록 했다.

물론, 그 길은 순탄치 않았다.
JSConf 무대 위에서 마주해야 했던 차가운 청중들의 시선, ‘이건 후퇴다’라고 외치던 온라인 커뮤니티의 격렬한 반발. JSX의 낯선 문법은 한동안 리액트의 발목을 잡는 족쇄처럼 여겨졌다.

하지만 결국, 진실은 코드를 통해 스스로를 증명했다.
기존 프레임워크의 복잡성에 지쳐있던 개발자들이, 직접 리액트를 써보고 그 안정성과 단순함에 감탄하기 시작했다. 인스타그램과 같은 거대 서비스가 리액트를 전면적으로 채택하며 그 가능성을 세상에 증명했다.

조던은 모니터에서 눈을 떼고, 사무실 한쪽에 띄워져 있는 현재 페이스북의 뉴스피드 화면을 바라보았다.

이제 그의 눈에 보이는 것은 더 이상 하나의 거대한 웹페이지가 아니었다.
그것은 수많은 독립적인 컴포넌트들이 각자의 propsstate를 가지고, 서로에게 영향을 주지 않으면서도 완벽한 조화를 이루어 살아 숨 쉬는 거대한 생태계였다. <Story> 컴포넌트가 <LikeButton>을 품고, <LikeButton>setState를 통해 스스로의 모습을 바꾸며, 이 모든 과정이 버추얼 DOM 안에서 효율적으로 처리되고 있었다.

그가 꿈꿨던 질서가, 바로 그의 눈앞에 펼쳐져 있었다.

물론 이것이 끝은 아닐 터였다. 기술은 끊임없이 진화할 것이고, 오늘의 해결책은 내일의 낡은 유산이 될지도 모른다. 하지만 한 가지는 분명했다.

리액트는 웹을 개발하는 방식에 대한 사람들의 생각을 영원히 바꾸어 놓았다.
명령형에서 선언형으로. DOM 중심에서 상태 중심으로.

조던 워크는 조용히 자리에서 일어났다. 그의 역할은 여기까지였다. 그는 혼돈의 원소들로 새로운 질서를 빚어내는 코드의 연금술사였다. 그의 손에서 탄생한 React.createClass라는 현자의 돌은, 이제 세상의 수많은 개발자들의 손에 쥐어졌다.

새로운 시대의 서막이 열리고 있었다.
설계도는 완성되었고, 공장은 가동을 시작했다. 이제 이 강력한 도구로 무엇을 만들어낼 것인지는, 온전히 세상의 몫으로 남겨졌다.