Front-end/React

useDeferredValue: 지연된 값 처리로 성능 최적화하기

xeunnie 2025. 4. 3. 21:05
728x90
반응형

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를 꼭 한 번 고려해 보세요.
 
🌷전설의 개발자가 되어봅시당!🌷

728x90
반응형