동시성 렌더링(Concurrent Rendering)은 React가 렌더를 중단·재개·폐기할 수 있게 하고, 업데이트에 우선순위를 매겨 급한 것(입력)을 먼저 처리하는 렌더링 방식이다. React 18에서 본격 도입됐고 Fiber가 그 기반이다.
- 중단 가능한 렌더: 렌더를 작은 단위로 쪼개 사이사이에 브라우저에 제어권을 돌려준다. 긴 렌더가 메인 스레드를 오래 막지 않는다(타임 슬라이싱(Time Slicing), 이벤트 루프)
- 우선순위: 타이핑·클릭 같은 긴급 업데이트가 무거운 결과 렌더보다 먼저 처리된다. 개발자는 useTransition과 useDeferredValue로 "급하지 않음"을 표시한다
- 자동 배칭(Automatic Batching): React 18부터는
setTimeout, Promise, 네이티브 이벤트 안의 여러setState도 한 번의 렌더로 묶인다. 이전에는 React 이벤트 핸들러 안에서만 묶였다 - Suspense, 스트리밍 SSR, 선택적 하이드레이션이 같은 기반 위에서 동작한다
- 대가: 렌더가 여러 번 돌거나 버려질 수 있으니 렌더는 순수해야 한다(React의 규칙과 렌더 순수성). React 밖의 스토어를 렌더 중에 읽으면 컴포넌트마다 다른 값을 보는 상태 찢어짐(Tearing)이 생길 수 있다
동시성은 "빠르게 계산"이 아니라 "반응성을 지키도록 일의 순서를 조정"하는 것이다. 사용자가 느끼는 응답성 기준은 도허티 임계·INP(Interaction to Next Paint)와 연결된다.