반응형
안녕하세요 😊
React에서 검색 기능이나 필터링 기능을 만들다 보면, 입력할 때마다 화면이 순간적으로 버벅거리는 경험을 하신 적 있으실 겁니다.
특히 데이터가 많거나 무거운 연산을 수행할 경우, 사용자가 타이핑하는 속도를 UI가 따라가지 못해 불편해질 수 있습니다.
이때 React가 제공하는 useDeferredValue Hook을 사용하면 문제를 쉽게 해결할 수 있습니다.
📍 1. useDeferredValue란?
- useDeferredValue는 값 업데이트를 지연 처리하여,
사용자 인터랙션(입력)은 바로 반영되지만 무거운 연산은 조금 늦게 처리되도록 도와주는 Hook입니다. - 즉, UI 우선 / 연산 지연이라는 전략을 통해 UX를 개선합니다.
📍 2. 기본 사용법
import { useState, useDeferredValue } from "react";
function Search({ data }) {
const [query, setQuery] = useState("");
const deferredQuery = useDeferredValue(query);
const filtered = data.filter(item =>
item.toLowerCase().includes(deferredQuery.toLowerCase())
);
return (
<div>
<input
value={query}
onChange={e => setQuery(e.target.value)}
placeholder="검색어 입력"
/>
<ul>
{filtered.map((d, i) => <li key={i}>{d}</li>)}
</ul>
</div>
);
}
👉 여기서 중요한 점은
- query는 입력 즉시 업데이트됩니다.
- 하지만 filtered는 **지연된 값(deferredQuery)**을 사용하므로, 연산이 살짝 늦게 따라옵니다.
결과적으로 입력창은 즉시 반응하고, 데이터 필터링은 살짝 늦게 반영되어 부드러운 UX가 만들어집니다.
📍 3. 언제 사용하면 좋을까?
- 검색창: 입력할 때마다 전체 데이터 필터링이 필요한 경우
- 자동완성: API 요청을 최적화하고 싶을 때
- 대시보드 필터링: 대용량 데이터를 조건별로 즉시 반영해야 할 때
- 애니메이션/전환과 동시에 무거운 작업이 있는 경우
📍 4. useDeferredValue vs debounce 차이
많이들 헷갈려 하시는 부분입니다.
구분 | useDeferredValue | debounce |
제공 | React 내장 Hook | 직접 구현(JS) or 외부 라이브러리 |
처리 방식 | 값 업데이트를 React 스케줄링에 맞춰 지연 | 마지막 입력 후 일정 시간 뒤 실행 |
주 목적 | UI 끊김 방지, 부드러운 사용자 경험 | API 호출 최적화, 불필요한 실행 방지 |
👉 정리하면,
- API 호출 줄이고 싶다 → debounce
- UI 반응성을 개선하고 싶다 → useDeferredValue
📍 5. 실무 팁
- 검색창 + API 호출
- useDeferredValue로 UI 반응성 확보
- debounce로 API 호출 횟수 줄이기
→ 두 가지를 함께 사용하면 최적의 UX
- 대량 데이터 테이블 필터링
- useDeferredValue로 입력과 테이블 렌더링을 분리
- 입력창은 부드럽고, 데이터는 살짝 늦게 반영
- React 18 이상에서만 사용 가능
- Concurrent Rendering 기능을 기반으로 하므로, React 18 이상 환경에서만 동작합니다.
✅ 마무리
useDeferredValue는 React에서 UI 반응성을 유지하면서 무거운 연산을 지연 처리할 수 있는 강력한 Hook입니다.
검색, 필터링, 대시보드 같은 UI에서 활용하면 사용자 경험을 크게 개선할 수 있으니 꼭 기억해두세요.
반응형
'React, Vue' 카테고리의 다른 글
React 초보 탈출! useState, useEffect로 컴포넌트 상태와 생명주기 완벽하게 다루기 (0) | 2025.10.07 |
---|---|
Suspense 제대로 쓰기 – 데이터 로딩 UX와 코드 스플리팅 동시 개선 (0) | 2025.09.10 |
useImperativeHandle – 부모가 자식의 함수를 직접 호출하는 방법 (0) | 2025.09.08 |
useMemo – 불필요한 연산 줄여 성능 최적화하기 (0) | 2025.08.30 |
React Suspense & lazy() – 코드 스플리팅으로 로딩 속도 최적화하기 (0) | 2025.08.25 |