React 18 Beta의 Concurrent Rendering 실험
배경
6월에 React 18 Working Group이 공개되고, 이번 주 드디어 Beta 버전이 릴리즈됐다. 관리자 대시보드의 대용량 테이블 렌더링이 느린 문제가 있었는데, Concurrent Rendering으로 개선할 수 있을지 테스트해봤다.
기존 문제
검색어 입력 시 5000개 row를 필터링하는데, 타이핑이 버벅이는 현상이 있었다. debounce를 적용했지만 UX가 여전히 부자연스러웠다.
const [query, setQuery] = useState('');
const filtered = data.filter(item =>
item.name.includes(query)
); // 매 입력마다 blocking
startTransition 적용
React 18의 startTransition을 사용해 필터링을 낮은 우선순위로 처리했다.
import { startTransition } from 'react';
const [query, setQuery] = useState('');
const [deferredQuery, setDeferredQuery] = useState('');
const handleChange = (e) => {
setQuery(e.target.value); // 즉시 반영
startTransition(() => {
setDeferredQuery(e.target.value); // 낮은 우선순위
});
};
const filtered = data.filter(item =>
item.name.includes(deferredQuery)
);
결과
입력 필드는 즉각 반응하고, 테이블 업데이트는 자연스럽게 지연된다. 사용자 입력을 blocking하지 않아 체감 성능이 확실히 좋아졌다.
주의사항
- 아직 Beta라 프로덕션 적용은 보류
isPending상태로 로딩 인디케이터 표시 가능- 모든 상태 업데이트를 transition으로 감쌀 필요는 없음
React 18 정식 릴리즈 때 본격 도입 검토 예정이다.