피드로 돌아가기
`useSyncExternalStore` — The React Hook You Didn't Know You Needed
Dev.toDev.to
Frontend

React 18 Concurrent Mode의 UI 불일치 'Tearing' 현상을 해결하는 최적의 전략

`useSyncExternalStore` — The React Hook You Didn't Know You Needed

Ankit2026년 4월 7일15intermediate

Context

React 18 Concurrent Mode의 렌더링 일시 중단 및 우선순위 조정 기능 도입. 외부 상태 저장소 참조 시 컴포넌트 간 렌더링 시점 차이로 인한 데이터 불일치 발생. UI의 일부만 업데이트되어 시각적 어긋남이 나타나는 Tearing 현상 직면.

Technical Solution

  • 외부 상태 구독을 위해 useSyncExternalStore 훅을 도입하여 React 렌더링 사이클과 외부 스토어 동기화
  • subscribe 함수를 통해 외부 저장소의 변경 사항을 감지하고 React에 알림을 보내는 Pub-Sub 구조 설계
  • getSnapshot 함수로 스토어의 현재 값을 읽어오며 Object.is 비교를 통해 불필요한 리렌더링 방지
  • 서버 사이드 렌더링(SSR) 환경의 하이드레이션 오류 방지를 위해 getServerSnapshot 폴백 값 설정
  • subscribegetSnapshot 참조를 안정적으로 유지하여 무한 루프를 방지하는 함수 정의 전략 채택
  • useEffectuseState를 조합한 기존 상태 동기화 방식의 레이스 컨디션 및 Tearing 위험 제거

Key Takeaway

React 외부의 상태를 관리할 때는 단순한 상태 복제가 아닌 React의 동시성 렌더링 엔진과 호환되는 전용 프리미티브를 사용해야 함. 상태의 안정적인 참조 유지와 불변성 관리가 렌더링 성능 및 일관성의 핵심 원칙임.


Browser API나 외부 상태 라이브러리를 구독하는 커스텀 훅 작성 시 useEffect 대신 useSyncExternalStore를 사용할 것

원문 읽기