선택적 하이드레이션의 완성

262025년 09월 10일3

서버 컴포넌트는 불필요한 자바스크립트를 제거했고, 스트리밍과 Suspense는 뼈대를 빠르게 보여주었다. 하지만 그 뼈대에 생명을 불어넣는 ‘하이드레이션’ 과정은 여전히 풀어야 할 마지막 숙제였다. React Core Team은 자신들이 가진 모든 무기를 조합하여, 마침내 이 오래된 난제를 정복할 준비를 마쳤다.

화이트보드에는 복잡한 소셜 미디어 피드 페이지의 구조가 그려져 있었다.

  • Header (서버 컴포넌트): 정적 로고와 메뉴.
  • Main Content (클라이언트 컴포넌트):
    • Post (서버 컴포넌트): 게시물 본문과 이미지.
    • CommentInput (클라이언트 컴포넌트): 사용자가 댓글을 입력하는 상호작용 영역.
  • Sidebar (Suspense로 감싸여 있음):
    • AdBanner (클라이언트 컴포넌트): 외부 스크립트를 로드해야 해서 로딩이 매우 느린 광고 배너.

이전의 React라면, 이 페이지 전체의 자바스크립트가 다운로드되고, Header부터 Sidebar까지 순서대로 하이드레이션이 끝나야만 사용자는 댓글을 입력할 수 있었다. 특히 느린 AdBanner가 전체의 발목을 잡았다.

“이제, 이 시나리오에서 사용자가 페이지가 로드되자마자 댓글 입력창을 클릭한다고 가정해봅시다.”

세바스찬 마크바게가 펜으로 <CommentInput> 영역을 가리켰다.

“사용자의 의도는 명확합니다. ‘나는 지금 당장 댓글을 쓰고 싶다.’ 이것이 바로 우리가 가장 먼저 반응해야 할 최우선 순위의 이벤트입니다.”

바로 그 순간, 서버 컴포넌트, Suspense, 그리고 동시성이라는 세 개의 축이 하나의 톱니바퀴처럼 맞물려 돌아가기 시작했다.

  1. 서버 컴포넌트와 스트리밍: 서버는 AdBanner를 기다리지 않는다. Header, Post, CommentInput의 뼈대와 AdBannerfallback(로딩 스켈레톤)이 담긴 초기 HTML을 즉시 스트리밍한다. 사용자는 거의 즉시 페이지의 구조를 본다.

  2. 사용자의 상호작용: 사용자가 CommentInput 영역을 클릭한다.

  3. 동시성 렌더러의 감지: React의 동시성 엔진이 이 클릭 이벤트를 감지한다. 그리고 이것이 다른 어떤 작업보다 우선순위가 높은 ‘긴급 업데이트’임을 인지한다.

  4. 선택적 하이드레이션의 실행: React는 더 이상 앱 전체를 순서대로 하이드레이션하지 않는다. 동시성 엔진의 지시에 따라, 사용자가 상호작용한 <CommentInput> 컴포넌트와 그에 필요한 자바스크립트를 최우선으로 찾아 ‘선택적으로’ 하이드레이션한다.

결과는 놀라웠다.

사이드바의 광고 배너(AdBanner) 스크립트가 아직 다운로드 중임에도 불구하고, 사용자는 CommentInput에 즉시 타이핑을 시작할 수 있었다. 앱이 살아난 것이다. 더 이상 전체 앱이 준비될 때까지 기다리는 ‘죽은 화면’은 존재하지 않았다.

느린 광고 배너의 하이드레이션은 백그라운드에서 조용히 진행되다가, 모든 준비가 끝나면 사용자 모르게 화면에 나타났다. 사용자의 핵심적인 작업 흐름은 전혀 방해받지 않았다.

“우리가 해냈어.”

로렌 탄이 나지막이 말했다. 그녀의 목소리에는 벅찬 감동이 서려 있었다.

이것이 바로 React 19가 꿈꾸던 사용자 경험이었다. 서버 컴포넌트가 불필요한 작업을 덜어내고, Suspense가 로딩의 경계를 설정하며, 동시성이 그 경계들 사이에서 우선순위를 정해 가장 중요한 부분부터 생명을 불어넣는다.

개별적으로 존재하던 기능들이 하나의 목표, 즉 ‘끊김 없는 상호작용’을 위해 완벽하게 협력하는 순간이었다. 하이드레이션은 더 이상 넘어야 할 벽이 아니었다. 사용자의 의도를 따라 흐르는, 지능적인 강물로 다시 태어난 것이다. React는 이제 UI를 그리는 도구를 넘어, 사용자의 시간을 존중하고 경험의 흐름을 지휘하는 오케스트라의 지휘자로 거듭나고 있었다.