피드백, 그리고 개선

202025년 09월 04일3

커뮤니티의 혼란은 React Core Team에게 쓰디쓴 약이 되었다. 그들은 비판을 회피하는 대신, 정면으로 마주하기로 결정했다. 그들의 첫 번째 임무는 쏟아지는 수천 개의 깃허브 이슈와 트윗, 블로그 게시글을 하나도 빠짐없이 읽고 분류하는 것이었다.

“이건 감정적인 비난이고… 이건 실제 프로덕션 환경에서 발생한 버그 리포트군.”
“이 질문은 ‘언제 서버 컴포넌트를 써야 하는가’에 대한 혼란을 명확히 보여주고 있어. 비슷한 질문이 벌써 수백 개째야.”

팀원들은 개발자들이 겪는 어려움의 패턴을 파악하기 시작했다. 막연한 불만 속에 숨겨진 진짜 문제점들이 모습을 드러냈다.

  • 모호한 경계: async/await를 서버 컴포넌트에서만 쓸 수 있다는 점, useState는 클라이언트 컴포넌트에서만 가능하다는 규칙이 명확하게 전달되지 않았다.
  • 데이터 캐싱의 복잡성: Next.js의 fetch는 기본적으로 강력한 캐싱 기능을 제공했지만, 많은 개발자가 이를 인지하지 못해 데이터가 갱신되지 않는 문제에 부딪혔다.
  • 부족한 디버깅 경험: 서버 컴포넌트에서 에러가 발생했을 때, 그 원인이 터미널에 찍히는지 브라우저 콘솔에 찍히는지조차 헷갈려 하는 개발자들이 많았다.

피드백은 단순히 API를 다듬는 수준을 넘어, 개발자 경험(DX, Developer Experience)의 모든 측면을 재검토하게 만들었다.

“우리가 개발자에게 너무 많은 것을 추측하게 만들었어.” 앤드류가 말했다. “React는 스스로 길을 안내해야 해. 개발자가 잘못된 길로 들어서려 하면, ‘이 길은 위험합니다’라고 명확하게 알려줘야지.”

그의 말에 따라 팀은 즉각적인 개선 작업에 착수했다.

가장 먼저, 에러 메시지를 대대적으로 개편했다. 이전에는 ‘undefined is not a function’ 같은 모호한 메시지가 출력되었다면, 이제는 “useState는 클라이언트 컴포넌트에서만 호출할 수 있습니다. 이 컴포넌트를 클라이언트 컴포넌트로 만드시려면 파일 상단에 'use client'를 추가하세요.”와 같이 구체적인 해결책을 함께 제시했다.

두 번째로, 공식 문서와 예제 코드를 보강했다. ‘서버 컴포넌트 vs 클라이언트 컴포넌트’에 대한 명확한 가이드라인을 담은 페이지를 신설하고, ‘데이터 가져오기 및 캐싱’ 패턴을 상세히 설명하는 섹션을 추가했다. 단순한 기능 설명이 아니라, ‘왜’ 이렇게 설계되었는지에 대한 철학을 전달하는 데 초점을 맞췄다.

마지막으로, Next.js 팀과의 협력을 더욱 강화했다. 커뮤니티에서 수집된 피드백을 실시간으로 공유하며, 데이터 캐시 옵션을 더 명시적으로 만들고, 빌드 시 경고 메시지를 개선하는 등 프레임워크 레벨에서의 개선을 함께 진행했다.

이 과정은 결코 쉽지 않았다. 수많은 비판에 일일이 대응하며 팀의 자존심에 상처를 입기도 했다. 하지만 그들은 멈추지 않았다. 개발자들의 목소리 속에 React 19를 진정으로 위대하게 만들 해답이 숨어있음을 알았기 때문이다.

초기의 혼란과 비판은 점차 건설적인 토론으로 바뀌어갔다. 개발자들은 자신들의 피드백이 실제로 반영되어 제품이 개선되는 것을 보며, 점차 새로운 패러다임을 이해하고 받아들이기 시작했다.

React Core Team은 이 과정을 통해 중요한 교훈을 얻었다. 위대한 기술은 단지 뛰어난 엔지니어 몇몇이 만드는 것이 아니었다. 그것은 커뮤니티와의 끊임없는 소통, 겸허한 피드백 수용, 그리고 함께 개선해 나가는 과정을 통해 비로소 완성된다는 것을. 이 값진 경험은 React 19를 더욱 단단하고 성숙하게 만드는 밑거름이 되었다.