단북
프론트엔드 기술 면접·리액트 핵심 개념

리액트 18의 동시성 기능을 설명할 수 있나요?

렌더링을 중단·재개할 수 있는 동시성 렌더링과 startTransition·useDeferredValue·자동 배칭·Suspense를 정리합니다.

리액트 18은 동시성 렌더링(Concurrent Rendering) 을 도입했습니다. 핵심은 렌더링을 중단했다가 재개하거나 우선순위를 조절할 수 있게 되었다는 점입니다. 무거운 렌더링이 진행되는 동안에도 사용자 입력 같은 급한 업데이트를 먼저 처리해 UI가 멈추지 않게 합니다.

이 기능들을 쓰려면 ReactDOM.createRoot로 앱을 마운트해야 합니다.

import { createRoot } from 'react-dom/client';
createRoot(document.getElementById('root')).render(<App />);

startTransition / useTransition

업데이트를 긴급하지 않은(transition) 것으로 표시합니다. 예를 들어 검색어 입력(긴급)과 그에 따른 큰 결과 목록 렌더링(긴급하지 않음)을 분리하면, 입력이 버벅이지 않습니다.

const [isPending, startTransition] = useTransition();
 
function onChange(e) {
  setQuery(e.target.value); // 긴급: 입력값 즉시 반영
  startTransition(() => {
    setResults(filter(e.target.value)); // 비긴급: 미뤄도 됨
  });
}

useDeferredValue

값의 “지연된 버전”을 만들어, 급한 업데이트가 끝난 뒤 따라오게 합니다. startTransition과 비슷하지만 기준으로 다룹니다.

const deferredQuery = useDeferredValue(query);

자동 배칭 (Automatic Batching)

여러 상태 업데이트를 한 번의 리렌더로 묶는 것을 배칭이라 합니다. 리액트 18부터는 이벤트 핸들러뿐 아니라 setTimeout·Promise·네이티브 이벤트 안에서도 자동으로 배칭되어 리렌더 횟수가 줄어듭니다.

Suspense

Suspense로 자식이 준비될 때까지 보여 줄 폴백 UI를 선언합니다. 18에서 SSR 스트리밍과 함께 강화되었습니다.

<Suspense fallback={<Spinner />}>
  <LazyComponent />
</Suspense>

이 모든 기능은 Fiber 아키텍처가 렌더링을 잘게 쪼갤 수 있기에 가능합니다.

useTransition / startTransition의 목적으로 옳은 것은?

이 레슨을 다 읽으셨나요?

완료 표시는 이 브라우저에 저장됩니다.