자동 배칭 기능의 프로토타입이 완성되고, 팀 내부에서 데모가 진행되었다. 조쉬 스토리는 Promise
의 .then()
콜백 안에서 세 개의 setState
를 연달아 호출하는 코드를 보여주었다. 그리고 개발자 도구의 프로파일러를 통해, 이 세 번의 호출이 단 한 번의 리렌더링만 유발하는 것을 증명해 보였다.
데모를 지켜보던 한 젊은 엔지니어의 입에서 무심코 한 마디가 흘러나왔다.
“와… 그런데, 이건 왜 진작 안 됐던 거죠? 너무나 당연해 보이는데요.”
그 순수한 질문에 회의실에는 잠시 정적이 흘렀다. 그리고 이내 곳곳에서 공감의 웃음이 터져 나왔다. 그 질문이야말로, 자동 배칭 기능의 성공을 증명하는 최고의 찬사였기 때문이다.
“좋은 질문이야.” 앤드류가 미소를 지으며 말했다. “그 대답은 React의 진화 과정 자체에 숨어있지.”
그는 React의 역사를 간략하게 회상했다.
“초창기 React는 동기식(synchronous) 렌더링 모델을 기반으로 했어. setState
가 호출되면, 렌더링은 즉시, 그리고 중단 없이 이루어져야만 했지. 그 구조 하에서는 React가 통제할 수 있는 이벤트 핸들러의 실행 컨텍스트가 끝나는 시점을 아는 것이, 배칭을 구현할 수 있는 유일한 방법이었어. 비동기 콜백은 말 그대로 React의 관측 범위를 벗어난 미지의 영역이었고.”
그의 설명은 과거의 기술적 제약을 명확히 보여주었다. 그 당시에는 불가능했던 것이 당연했다.
“하지만 React 18과 함께 동시성 렌더러라는 새로운 심장을 갖게 되면서, 모든 것이 바뀌었지.” 세바스찬이 말을 이었다. “우리는 이제 렌더링을 멈추고, 재개하고, 여러 업데이트를 동시에 처리할 수 있는 능력을 갖게 됐어. 업데이트를 즉시 실행할 필요가 없어진 거야. 아주 잠깐의 여유를 갖고, 다른 업데이트가 더 들어오는지 지켜볼 수 있게 된 거지.”
그 ‘아주 잠깐의 여유’. 그것이 바로 자동 배칭을 가능하게 한 핵심 열쇠였다. 동시성이라는 새로운 패러다임이 도입되었기에, 비로소 과거에는 불가능했던 ‘당연한 일’이 가능해진 것이다.
“왜 진작 안 됐을까?” 라는 질문은, 그 기능이 사용자에게 얼마나 직관적이고 올바르게 느껴지는지를 보여주는 반증이었다. 최고의 기술은 종종 마법처럼 보이는 것이 아니라, ‘원래 그랬어야 하는 것’처럼 느껴지는 법이다.
팀원들은 뿌듯함을 느꼈다. 그들은 단순히 버그를 고치거나 새로운 기능을 추가한 것이 아니었다. React의 동작 방식을 더 일관되고, 더 예측 가능하게 만들어, 프레임워크의 근본적인 모델을 바로잡고 있었다.
자동 배칭은 React가 과거의 기술적 부채를 청산하고, 마침내 ‘올바른’ 방식으로 나아가고 있음을 보여주는 명백한 증거였다. 개발자들은 더 이상 불일치에 대해 고민할 필요 없이, 오직 애플리케이션의 로직에만 집중할 수 있게 될 터였다. 이 작은 변화가 가져올 생산성의 향상은 결코 작지 않을 것이었다. 그들은 지금, React의 역사를 바로잡고 있었다.