๐ŸณReact | ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์— Debounce ์ ์šฉํ•˜๊ธฐ

์›์˜ยท2023๋…„ 8์›” 20์ผ
1

์ƒˆ๋กœ์šด ์ง€์‹๐Ÿ’ก

๋ชฉ๋ก ๋ณด๊ธฐ
15/15
post-thumbnail

๐Ÿง์ƒํ™ฉ

ํ”„๋กœ์ ํŠธ์˜ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ํ•œ ๊ธ€์ž์”ฉ ์ž…๋ ฅ์ด ๋  ๋•Œ๋งˆ๋‹ค ๊ทธ ๊ฐ’์œผ๋กœ API ์š”์ฒญ์„ ํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค.
ํ•„์š” ์ด์ƒ์˜ ์š”์ฒญ์ด ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ์—ˆ๊ณ , ์‹ค์ œ๋กœ ์ฒด๊ฐ ์‹œ๊ฐ„๋„ ๊ธธ์—ˆ๋‹ค.๐Ÿ’€ ์ผ๋‹จ ๋งˆ๊ฐ ๋‚ ์งœ๋ฅผ ์ง€ํ‚ค๋Š๋ผ ์ด๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ๋ฆฌํŒฉํ† ๋ง ๊ธฐ๊ฐ„ ๋™์•ˆ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ํ•ด๋ณด๊ธฐ๋กœ ํ•จโ—
์ฐพ์•„๋ณด๋‹ˆ, Debounce ๊ธฐ๋Šฅ์„ ์ ์šฉํ•ด ์š”์ฒญ์„ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ๊ณ , ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ณด๊ธฐ๋กœ ๊ฒฐ์ •๐Ÿคฉ


๐Ÿ”ŽDebounce

  • ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ณผ ๊ฐ™์€ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ์ถ”๊ฐ€์ ์ธ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์„ ์ œ์–ดํ•˜๋Š” ๊ธฐ์ˆ 
  • ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์œผ๋กœ ์˜ˆ๋ฅผ ๋“ค๋ฉด,
    ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๋™์•ˆ์— ๋งค ์ž…๋ ฅ๋งˆ๋‹ค ๊ฒ€์ƒ‰์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ , ์ž…๋ ฅ์ด ๋๋‚œ ํ›„ ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ์ถ”๊ฐ€ ์ž…๋ ฅ์ด ์—†๋‹ค๋ฉด ๊ฒ€์ƒ‰์„ ์‹คํ–‰

๐Ÿ’ก์‚ฌ์šฉ ๋ฐฉ๋ฒ•

  • useEffect๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅ๊ฐ’ query๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ๋””๋ฐ”์šด์Šค๋ฅผ ์ ์šฉํ•˜์—ฌ API ์š”์ฒญ ์ง€์—ฐ์‹œํ‚ด

  • ํŽ˜์ด์ง€ ๋‚ด์—์„œ ์‚ฌ์šฉ

// DebouncedSearch.jsx
import React, { useState, useEffect } from 'react';

function DebouncedSearch() {
  const [query, setQuery] = useState('');
  const [searchResults, setSearchResults] = useState([]);
  
  // ์ž…๋ ฅ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํƒ€์ด๋จธ ์„ค์ •
  useEffect(() => {
    const delayDebounceTimer = setTimeout(() => {
      // ์—ฌ๊ธฐ์— API ์š”์ฒญ ์ฝ”๋“œ ๋„ฃ์œผ๋ฉด ๋จ
      // ๋ฐ›์•„์˜จ ๊ฐ’์„ setSearchResults์— ์ €์žฅ
    }, 1000); // 1s ๋””๋ฐ”์šด์Šค ์ง€์—ฐ ์‹œ๊ฐ„

    // ์ด์ „์— ์„ค์ •ํ•œ ํƒ€์ด๋จธ๋ฅผ ํด๋ฆฌ์–ดํ•˜์—ฌ ๋””๋ฐ”์šด์Šค ์ทจ์†Œ
    return () => clearTimeout(delayDebounceTimer);
  }, [query]);

  function handleInputChange(event) {
    setQuery(event.target.value);
  }

  return (
    <div>
      <input
        type="text"
        value={query}
        onChange={handleInputChange}
        placeholder="Search"
      />
      <ul>
        {searchResults.map((result, index) => (
          <li key={index}>{result}</li>
        ))}
      </ul>
    </div>
  );
}

export default DebouncedSearch;
  • custom hook์œผ๋กœ ์‚ฌ์šฉ
// useDebounce.jsx
import { useEffect, useState } from 'react';

export default function useDebounce(value, delay) {
  const [debouncedValue, setDebouncedValue] = useState(value)

  useEffect(()=>{
    const timer = setTimeout(()=>{
      setDebouncedValue(value)
    }, delay)
    return () => clearTimeout(timer)
  }, [value])

  return debouncedValue
}
// DebouncedSearch.jsx
import React, { useState } from 'react';
import useDebounce from './useDebounce'; // useDebounce ์ปค์Šคํ…€ ํ›… ์ž„ํฌํŠธ

function DebouncedSearch() {
  const [query, setQuery] = useState('');
  const [searchResults, setSearchResults] = useState([]);

  const debouncedQuery = useDebounce(query, 1000); // 1s ๋””๋ฐ”์šด์Šค ์ง€์—ฐ ์‹œ๊ฐ„

  useEffect(() => {
    // ์—ฌ๊ธฐ์— API ์š”์ฒญ ์ฝ”๋“œ ๋„ฃ์œผ๋ฉด ๋จ
  	// ๋ฐ›์•„์˜จ ๊ฐ’์„ setSearchResults์— ์ €์žฅ
  }, [debouncedQuery]);

  function handleInputChange(event) {
    setQuery(event.target.value);
  }

  return (
    <div>
      <input
        type="text"
        value={query}
        onChange={handleInputChange}
        placeholder="Search"
      />
      <ul>
        {searchResults.map((result, index) => (
          <li key={index}>{result}</li>
        ))}
      </ul>
    </div>
  );
}

export default DebouncedSearch;

๐Ÿ’กํ”„๋กœ์ ํŠธ Debounce ์ ์šฉ X

tadak ๊ฒ€์ƒ‰ ์‹œ API ์š”์ฒญ
t โžก๏ธ ta โžก๏ธ tad โžก๏ธ tada โžก๏ธ tadak

  • ์ฝ˜์†”
    tadak ํ•œ ๊ธ€์ž์”ฉ ์ž…๋ ฅ ํ•  ๋•Œ๋งˆ๋‹ค ์š”์ฒญ ๋ณด๋‚ด์ง
  • ๋„คํŠธ์›Œํฌ
    ์ „์ฒด ์š”์ฒญ 472๊ฐœ, ์™„๋ฃŒ๊นŒ์ง€ ์•ฝ 23.9์ดˆ

๐Ÿ’กํ”„๋กœ์ ํŠธ Debounce ์ ์šฉ O

delay๋ฅผ 1์ดˆ๋กœ ์„ค์ •ํ•˜๊ณ  tadak ๊ฒ€์ƒ‰ ์‹œ API ์š”์ฒญ
tadak โžก๏ธ 1์ดˆ๋™์•ˆ ์ž…๋ ฅ ์—†์„ ์‹œ ์š”์ฒญ

  • ์ฝ˜์†”
    tadak ์ดํ›„ 1์ดˆ๋™์•ˆ ์ถ”๊ฐ€ ์ž…๋ ฅ์ด ์—†์„ ๋•Œ ํ•œ๋ฒˆ๋งŒ ์š”์ฒญ ๋ณด๋‚ด์ง

  • ๋„คํŠธ์›Œํฌ
    ์ „์ฒด ์š”์ฒญ 12๊ฐœ, ์™„๋ฃŒ๊นŒ์ง€ ์•ฝ 4.8์ดˆ


์š”์ฒญ ํšŸ์ˆ˜๊ฐ€ ๋ˆˆ์— ๋„๊ฒŒ ์ค„์—ˆ๊ณ ,
๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ํ™”๋ฉด์— ๋ณด์—ฌ์ค„๋•Œ๊นŒ์ง€์˜ ์‹œ๊ฐ„๋„ ํ˜„์ €ํžˆ ์ค€ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๐Ÿ‘๐Ÿปโ—
Debounce ๊ธฐ๋Šฅ์€ ๊ฒ€์ƒ‰ ๋ง๊ณ ๋„ ๋ธŒ๋ผ์šฐ์ € ์œˆ๋„์šฐ ํฌ๊ธฐ ๋ฆฌ์‚ฌ์ด์ง•, ์ž๋™์™„์„ฑ, ์ง€๋„ ํ™•๋Œ€ยท์ถ•์†Œ ๋“ฑ ๋งŽ์€ ๊ณณ์— ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ํ•˜๋‹ˆ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์œ ์šฉํ•˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„๊ฑฐ๊ฐ™๋‹ค๐Ÿค—

profile
ํ™”์ดํŒ…~~^ใ…^/

0๊ฐœ์˜ ๋Œ“๊ธ€