릴리스 당일의 동이 트기 전, 릴리스 매니저는 마지막으로 최종 빌드된 패키지들을 점검하고 있었다. 그의 모니터에 열린 파일 중 하나는, 다른 어떤 코드 파일보다도 더 무겁게 느껴지는 텍스트 파일이었다. 바로 CHANGELOG.md 였다.
이 파일은 단순히 버전별 변경 사항을 나열한 기록이 아니었다. 그것은 React 19라는 거대한 프로젝트의 압축된 역사서이자, 개발 과정에 참여한 모든 이들의 노고가 담긴 기념비와도 같았다.
스크롤을 내리자, 수백, 수천 줄에 걸쳐 나열된 변경 사항들이 화면을 가득 채웠다.
### Added
- React Server Components: 이 한 줄의 항목 뒤에는, 세바스찬의 도발적인 질문에서 시작되어, 서버와 클라이언트의 경계를 새로 정의하기까지의 수많은 논쟁과 실험이 숨어 있었다.
- Server Actions: 데이터 ‘쓰기’의 패러다임을 바꾸기 위해, 웹 표준을 존중하며 새로운 추상화를 만들어냈던 앤드류와 로렌의 통찰력이 담겨 있었다.
useHook:useEffect의 함정을 극복하고, Promise와 Context를 ‘읽는다’는 하나의 개념으로 통합하려 했던 집요한 노력이 이 짧은 이름 안에 응축되어 있었다.useOptimistic,useFormStatus,useFormState: 사용자 경험의 마지막 한 방울까지 짜내고, 폼 상태 관리의 복잡성을 해결하기 위해 태어난 사려 깊은 훅들의 이름이 나란히 적혀 있었다.
### Changed
- Concurrency by Default: React의 심장을 동기식에서 동시성으로 교체한, 보이지 않지만 가장 근본적인 변화가 이 항목에 기록되어 있었다.
- Automatic Batching for all updates:
setTimeout안에서도 일관되게 동작하는 상태 업데이트. 개발자들의 오랜 고통을 끝낸 이 개선 뒤에는, 수많은 엣지 케이스 테스트가 있었다. - Improved Error Reporting: 개발자의 좌절을 줄이기 위해, DX 팀이 밤을 새워 다듬었던 친절한 에러 메시지들의 흔적이 여기에 남아 있었다.
### Removed
forwardRef(in most cases):ref를 일반 prop으로 취급하기로 한 결정. 또 하나의 보일러플레이트가 역사 속으로 사라졌음을 알리는 이 한 줄은, 단순함을 향한 팀의 의지를 보여주었다.
릴리스 매니저는 이 파일의 모든 줄을 천천히 훑어보았다. 각 줄마다, 특정 기능을 담당했던 개발자의 얼굴, 치열했던 코드 리뷰, 그리고 버그를 해결하고 환호하던 순간들이 스쳐 지나갔다. 어떤 항목은 단 몇 주 만에 완성되었지만, 어떤 항목은 수년의 연구와 실패를 거쳐 마침내 이 목록에 이름을 올릴 수 있었다.
이 CHANGELOG.md의 무게는 파일 크기로 측정할 수 있는 것이 아니었다. 그것은 이 프로젝트에 쏟아부은 수많은 사람들의 시간과 열정, 그리고 지성의 무게였다.
이제 곧, 이 파일은 React 19의 소스 코드와 함께 전 세계에 공개될 것이다. 대부분의 사용자들은 이 파일을 자세히 읽지 않을지도 모른다. 하지만 팀원들에게, 이것은 자신들이 걸어온 길에 대한 가장 정직하고 명예로운 기록이었다. 이 파일의 마지막 줄이 쓰인 순간, React 19의 개발은 비로소 진정으로 끝을 맺었다.


