useDeferredValue: 지연된 값 처리로 성능 최적화하기
리액트에서는 성능 최적화를 위해 useDeferredValue라는 훅을 제공합니다. 컴포넌트가 값의 변화에 즉각적으로 반응하는 대신, 덜 중요한 작업을 지연시켜 렌더링이 막히는 문제를 해결해줍니다. 이 글에서는 useDeferredValue의 동작 방식, 사용 예제, 그리고 언제 어떻게 활용하면 좋은지 알아보겠습니다.
🌟 useDeferredValue란?
useDeferredValue는 리액트 18에서 도입된 훅으로, 급하지 않은 상태 업데이트를 지연(deferred) 처리하도록 도와줍니다.
주요 개념
• 지연 처리: 급하지 않은 값 변화는 렌더링 우선순위가 낮아야 합니다. 이를 통해 중요한 작업(예: 사용자 입력)에 방해받지 않도록 합니다.
• 성능 최적화: 입력 필드와 같이 실시간으로 렌더링이 발생하는 UI에서 성능 저하를 줄여줍니다.
🛠️ useDeferredValue 문법
const deferredValue = useDeferredValue(value);
매개변수
• value: 지연 처리가 필요한 값.
반환값
• deferredValue: 리액트가 처리 우선순위를 낮춰 지연 업데이트한 값.
🧑💻 사용 예제
예제 1: 검색 필터링
문제 상황
입력 필드가 많고, 입력할 때마다 필터링된 리스트가 렌더링되어 성능이 저하됩니다.
코드
import React, { useState, useDeferredValue } from "react";
const SearchComponent = () => {
const [search, setSearch] = useState("");
const deferredSearch = useDeferredValue(search); // 지연된 검색 값
const handleChange = (e) => setSearch(e.target.value);
const filteredItems = items.filter((item) =>
item.includes(deferredSearch)
);
return (
<div>
<input
type="text"
value={search}
onChange={handleChange}
placeholder="Search..."
/>
<ul>
{filteredItems.map((item, index) => (
<li key={index}>{item}</li>
))}
</ul>
</div>
);
};
const items = ["Apple", "Banana", "Cherry", "Date", "Elderberry"];
export default SearchComponent;
작동 원리
• search: 사용자가 입력하는 즉시 업데이트.
• deferredSearch: 필터링 및 렌더링 작업은 지연 처리되어 성능 문제를 최소화.
예제 2: 복잡한 데이터 처리
문제 상황
대규모 데이터셋을 렌더링할 때 입력 필드에 입력할 때마다 UI가 느려지는 문제가 발생합니다.
코드
import React, { useState, useDeferredValue } from "react";
const ExpensiveRenderingComponent = () => {
const [input, setInput] = useState("");
const deferredInput = useDeferredValue(input); // 지연된 입력 값
const renderHeavyList = () => {
return Array.from({ length: 5000 }, (_, i) => (
<div key={i}>
Item {i} - {deferredInput}
</div>
));
};
return (
<div>
<input
type="text"
value={input}
onChange={(e) => setInput(e.target.value)}
placeholder="Type something..."
/>
<div>{renderHeavyList()}</div>
</div>
);
};
export default ExpensiveRenderingComponent;
🔍 useDeferredValue와 useTransition의 차이점
특징 useDeferredValue useTransition
역할 값 업데이트를 지연 처리. 상태 변경을 지연 처리.
적용 대상 값 (예: 검색어, 입력 값 등). 상태 업데이트 (예: 라우팅, 큰 UI 변경 등).
사용 방식 반환된 지연 값을 사용. startTransition로 지연 상태를 직접 정의.
사용 예 - 검색 필터링- 큰 데이터 렌더링 지연 - 페이지 전환- 탭 변경- 리스트 재정렬
📌 useDeferredValue의 주요 특징
1. 저비용 렌더링
• 값만 지연시키므로 비용이 적고, 간단한 UI에서 매우 효과적입니다.
2. 우선순위 기반 렌더링
• 리액트가 우선순위를 스스로 판단하여 처리합니다.
3. 호환성
• 기존 컴포넌트와 함께 사용하기 쉽고, 코드 수정이 간단합니다.
🚩 주의사항
1. 값 참조 주의
• deferredValue는 지연되기 때문에 최신 상태가 아닐 수 있습니다. 이를 염두에 두고 사용하세요.
2. 불필요한 사용
• 단순 UI에서는 굳이 사용하지 않아도 됩니다. 복잡한 상태나 대규모 렌더링 작업에 적합합니다.
3. 렌더링 반복
• 잘못된 설계로 인해 지연된 값이 불필요하게 많은 렌더링을 유발할 수 있으니 조심해야 합니다.
🎯 언제 사용해야 할까?
• 입력 필드와 데이터 필터링:
• 사용자가 입력한 값을 기반으로 리스트를 필터링하거나 검색할 때.
• 큰 데이터 렌더링:
• 렌더링 성능이 중요한 대규모 데이터셋.
• 사용자 입력 우선 처리:
• 입력 지연으로 UX를 개선해야 할 때.
✨ 결론
useDeferredValue는 리액트가 제공하는 훅 중에서도 간단하지만 강력한 성능 최적화 도구입니다. 지연된 값을 처리하여 불필요한 렌더링을 줄이고, 사용자 경험을 부드럽게 만들어 줍니다. 복잡한 애플리케이션에서 성능 문제가 발생한다면, useDeferredValue를 꼭 한 번 고려해 보세요.
🌷전설의 개발자가 되어봅시당!🌷
'Front-end > React' 카테고리의 다른 글
🌟 React의 Transition vs Suspense: 언제, 어떻게 사용하면 좋을까? 🌟 (0) | 2025.03.24 |
---|---|
MDX: Markdown과 React의 아름다운 만남 ✨ (1) | 2025.03.01 |
[React] Render Props: 컴포넌트 재사용성을 한 단계 업그레이드하기 🎨 (0) | 2025.02.25 |
React: Lifting State Up 🏋️♀️ (0) | 2025.02.24 |
React의 Composition vs Inheritance 🌟 (0) | 2025.02.22 |