React 18 Beta의 Concurrent Features 테스트해보기

배경

지난주 React 18 Beta가 공개되면서 Concurrent Features를 사용할 수 있게 됐다. 회사 프로젝트에 바로 적용하기엔 무리가 있어 개인 사이드 프로젝트에서 먼저 테스트해봤다.

createRoot 마이그레이션

기존 ReactDOM.render에서 createRoot로 변경하는 것부터 시작했다.

// Before
import ReactDOM from 'react-dom';
ReactDOM.render(<App />, document.getElementById('root'));

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

이것만으로도 Concurrent Rendering이 활성화된다.

startTransition 적용

검색 필터가 많은 대시보드 페이지에서 입력 지연이 있었다. startTransition으로 우선순위를 분리했다.

import { startTransition } from 'react';

const handleSearchChange = (e) => {
  const value = e.target.value;
  setInputValue(value); // 즉시 반영
  
  startTransition(() => {
    setSearchQuery(value); // 낮은 우선순위
  });
};

체감상 입력 반응성이 확실히 개선됐다. 무거운 리스트 렌더링이 입력을 막지 않았다.

useDeferredValue

필터링된 결과 표시에는 useDeferredValue를 사용했다.

const deferredQuery = useDeferredValue(searchQuery);
const filteredItems = useMemo(
  () => items.filter(item => item.name.includes(deferredQuery)),
  [deferredQuery, items]
);

startTransition과 비슷하지만 컴포넌트 경계에서 사용하기 더 편했다.

Suspense 개선

Data Fetching과 Suspense 통합도 시도했지만, 아직 라이브러리 지원이 부족했다. React Query나 SWR이 업데이트되길 기다려야 할 것 같다.

소감

Concurrent Features는 기존 코드 변경 없이도 동작하지만, 제대로 활용하려면 컴포넌트 구조를 다시 생각해봐야 한다. 내년 상반기쯤 안정화되면 회사 프로젝트에도 적용해볼 계획이다.

React 18 Beta의 Concurrent Features 테스트해보기