startTransition
의 개념은 강력했지만, 개발자들에게는 실제 눈으로 보고 경험할 수 있는 명확한 예시가 필요했다. React Core Team은 이 새로운 API의 가치를 가장 극적으로 보여줄 수 있는 시나리오로, ‘실시간 검색창’을 선택했다.
조쉬 스토리가 팀원들 앞에서 두 개의 검색창 데모를 준비했다. 하나는 startTransition
이 적용되지 않은 전통적인 방식이었고, 다른 하나는 startTransition
을 사용한 새로운 방식이었다.
먼저, 전통적인 방식의 검색창을 시연했다.
// Before: No Transition
const [inputValue, setInputValue] = useState('');
const [searchResult, setSearchResult] = useState([]);
const handleChange = (e) => {
const newQuery = e.target.value;
setInputValue(newQuery); // 입력값 업데이트
const result = search(newQuery); // 검색 결과 업데이트
setSearchResult(result);
};
조쉬는 입력창에 ‘react’라는 단어를 빠른 속도로 타이핑하기 시작했다. r
, e
, a
, c
, t
.
결과는 끔찍했다.
r
을 입력하는 순간, setInputValue
와 setSearchResult
가 동시에 실행되며 전체 컴포넌트가 리렌더링되었다. 곧이어 e
를 입력하자 또다시 모든 것이 리렌더링되었다. 키를 누를 때마다, 방대한 목록을 필터링하는 무거운 search
함수가 실행되고 화면 전체가 다시 그려졌다.
사용자 입장에서 이 경험은 명백한 ‘버벅임’이었다. 타이핑은 뚝뚝 끊겼고, 입력창에 글자가 나타나는 것조차 한 박자씩 늦었다. 애플리케이션이 사용자의 속도를 따라오지 못하는 것이다.
“이것이 바로 우리가 지난 몇 년간 당연하게 여겨왔던 문제입니다.”
조쉬가 말했다. 개발자들은 이 문제를 해결하기 위해 debounce
나 throttle
같은 복잡한 기법을 직접 구현해야만 했다.
“이제 startTransition
을 적용한 버전을 보시죠.”
그는 두 번째 데모를 화면에 띄웠다. 코드는 단지 상태 업데이트 하나를 startTransition
으로 감쌌을 뿐이었다.
// After: With Transition
// ... 상태 선언은 동일
const handleChange = (e) => {
setInputValue(e.target.value); // 긴급한 업데이트
startTransition(() => {
setSearchResult(search(e.target.value)); // 덜 긴급한 업데이트
});
};
다시 한번, 그는 같은 속도로 ‘react’를 타이핑했다.
놀라운 변화가 일어났다.
입력창의 inputValue
는 그의 타이핑 속도를 완벽하게 따라왔다. r
, e
, a
, c
, t
가 한 치의 지연도 없이 즉각적으로 화면에 나타났다. 그가 타이핑하는 동안, 아래의 검색 결과 목록은 이전 상태를 그대로 유지하고 있었다. React가 긴급한 입력값 업데이트를 먼저 처리하기 위해, 검색 결과 렌더링을 계속해서 ‘보류’하고 있었기 때문이다.
조쉬가 잠시 타이핑을 멈추자, 그제야 React는 보류했던 setSearchResult
를 실행했다. 아래의 검색 결과 목록이 최종 입력값인 ‘react’에 맞춰 부드럽게 갱신되었다.
두 데모의 차이는 극명했다.
- Before: 모든 키 입력마다 UI 전체가 버벅인다.
- After: 타이핑은 완벽하게 부드럽고, 검색 결과는 사용자의 입력이 멈춘 후에만 업데이트된다.
팀원들은 박수를 쳤다. 이것은 복잡한 debounce
로직 없이, 단지 상태 업데이트의 ‘의도’를 React에게 알려주는 것만으로 이뤄낸 성과였다.
isPending
이라는 상태를 활용하면 전환이 진행 중일 때 로딩 스피너를 보여주는 것도 가능했다.
const [isPending, startTransition] = useTransition();
// ...
{isPending && <Spinner />}
이 간단한 검색창 예시는 startTransition
이 단순한 성능 최적화 도구가 아님을 증명했다. 그것은 사용자의 입력과 시스템의 피드백 사이의 관계를 재정의하는, 사용자 경험 설계의 새로운 도구였다. React는 이제 개발자에게 묻고 있었다. “당신의 앱에서 무엇이 가장 중요합니까? 사용자의 다음 행동입니까, 아니면 시스템의 즉각적인 반응입니까?” 그리고 그 질문에 대한 답을 코드에 표현할 수 있는 우아한 방법을 제공했다.