React์ useDeferredValue ํ ์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ก, ์ฑ๋ฅ์ด ๋ฐ์ด๋๊ณ ๋ฐ์์ฑ์ด ์ข์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ์ด์ , ์ฌ์ฉ ์ฌ๋ก ๋ฐ ๊ตฌํ ์ ๋ต์ ํ์ํฉ๋๋ค.
React useDeferredValue: ํฅ์๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํ ์ง์ฐ๋ ๊ฐ ์ ๋ฐ์ดํธ ๋ง์คํฐํ๊ธฐ
๋์์์ด ์งํํ๋ ์น ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ฑ๋ฅ์ด ๋ฐ์ด๋๊ณ ๋ฐ์์ฑ์ด ์ข์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋๋ ๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. UI ๊ตฌ์ถ์ ๋๋ฆฌ ์ฌ์ฉ๋๋ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ React๋ ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํ ๋ค์ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ทธ์ค useDeferredValue ํ
์ UI์ ๋ ์ค์ํ ๋ถ๋ถ์ ๋ํ ์
๋ฐ์ดํธ๋ฅผ ์ง์ฐ์์ผ ์ ๋ฐ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๋ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ผ๋ก ๋๋ณด์
๋๋ค. ์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ useDeferredValue์ ๋ณต์ก์ฑ์ ๊น์ด ํ๊ณ ๋ค์ด ๊ทธ ์ด์ , ์ฌ์ฉ ์ฌ๋ก ๋ฐ ์ค์ ๊ตฌํ ์ ๋ต์ ํ์ํฉ๋๋ค.
์ง์ฐ๋ ์ ๋ฐ์ดํธ์ ํ์์ฑ ์ดํดํ๊ธฐ
useDeferredValue์ ์ธ๋ถ ์ฌํญ์ ์ดํด๋ณด๊ธฐ ์ ์, ์ด ํ
์ด ํด๊ฒฐํ๋ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ง์ React ์ ํ๋ฆฌ์ผ์ด์
์์ ํน์ UI ์์๋ ๋ค๋ฅธ ์์๋ณด๋ค ๋ ์ค์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฒ์ ์
๋ ฅ ํ๋๋ ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ์ ๊ณตํ์ฌ ๋งค์ฐ ๋ฐ์์ฑ์ด ์ข์์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ฒ์ ๊ฒฐ๊ณผ ๋ชฉ๋ก์ ์ค์ํ์ง๋ง ๋ฐ๋์ ์ฆ๊ฐ์ ์ผ๋ก ์
๋ฐ์ดํธ๋ ํ์๋ ์์ต๋๋ค. ๊ฒ์ ๊ฒฐ๊ณผ์ ์
๋ฐ์ดํธ๋ฅผ ์ง์ฐํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ด ์
๋ ฅ ํ๋์ ๋ฐ์์ฑ์ ์ฐ์ ์ํ ์ ์์ด ๋ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
์ฌ์ฉ์๊ฐ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ํํฐ๋งํ๋ ๊ฒ์ ์ฐฝ์ ์ฟผ๋ฆฌ๋ฅผ ์ ๋ ฅํ๋ ์๋๋ฆฌ์ค๋ฅผ ๊ณ ๋ คํด ๋ณด์ธ์. ๊ฐ ํค ์ ๋ ฅ์ ์ ์ฒด ๋ชฉ๋ก์ ๋ค์ ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํ์ฌ ๋์ ๋๋ ์ง์ฐ๊ณผ ๋ต๋ตํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๋ฐํ ์ ์์ต๋๋ค. ๋ชฉ๋ก์ ์ ๋ฐ์ดํธ๋ฅผ ์ง์ฐํจ์ผ๋ก์จ React๋ ์ ๋ ฅ ํ๋๋ฅผ ๋น ๋ฅด๊ฒ ๋ ๋๋งํ๋ ๋ฐ ์ง์คํ ์ ์์ผ๋ฏ๋ก, ๋ชฉ๋ก์ด ์ ๋ฐ์ดํธ๋๋ ๋ฐ ์๊ฐ์ด ์กฐ๊ธ ๊ฑธ๋ฆฌ๋๋ผ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ๋ฐ์์ฑ์ด ์ข๊ฒ ๋๊ปด์ง๋๋ค.
useDeferredValue ์๊ฐ: ์ง์ฐ๋ ์ ๋ฐ์ดํธ๋ฅผ ์ํ React์ ์๋ฃจ์
React 18์ ๋์
๋ useDeferredValue ํ
์ ๊ฐ์ ๋ํ ์
๋ฐ์ดํธ๋ฅผ ์ง์ฐํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด ํ
์ ๊ฐ์ ์
๋ ฅ์ผ๋ก ๋ฐ์๋ค์ด๊ณ , ํด๋น ๊ฐ์ ์๋กญ๊ณ ์ง์ฐ๋ ๋ฒ์ ์ ๋ฐํํฉ๋๋ค. React๋ ์ง์ฐ๋ ๊ฐ์ด ๊ฒฐ๊ตญ ์ต์ ๊ฐ์ผ๋ก ์
๋ฐ์ดํธ๋ ๊ฒ์ ๋ณด์ฅํ์ง๋ง, ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ๊ณ ๋ฐ์์ฑ์ ์ ์งํ๊ธฐ ์ํด ์
๋ฐ์ดํธ๋ฅผ ์ง์ฐํ ์ ์์ต๋๋ค.
useDeferredValue์ ์๋ ๋ฐฉ์
๋ด๋ถ์ ์ผ๋ก useDeferredValue๋ React์ ๋์์ฑ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ์ง์ฐ๋ ๊ฐ์ ๋ํ ์
๋ฐ์ดํธ๋ฅผ ๋ฎ์ ์ฐ์ ์์๋ก ์ค์ผ์ค๋งํฉ๋๋ค. useDeferredValue์ ์ ๊ฐ์ด ์ ๋ฌ๋ ๋, React๋ ์ง์ฐ๋ ๊ฐ์ ์ฆ์ ์
๋ฐ์ดํธํ์ง ์์ต๋๋ค. ๋์ , ๋ฉ์ธ ์ค๋ ๋๊ฐ ์ ํด ์ํ๊ฐ ๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ์
๋ฐ์ดํธ๋ฅผ ์ค์ผ์ค๋งํฉ๋๋ค. ์ด๋ ์ฌ์ฉ์ ์
๋ ฅ ์ฒ๋ฆฌ ๋ฐ ์ค์ํ UI ์
๋ฐ์ดํธ์ ๊ฐ์ ๊ณ ์ฐ์ ์์ ์์
์ด ๋ ์ค์ํ ์
๋ฐ์ดํธ์ ์ํด ์ฐจ๋จ๋์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
ํต์ฌ ์์น์ ์ฐ์ ์์ ์ง์ ์
๋๋ค. React๋ ์ธ์ง๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ฅ ํฌ๊ฒ ๊ธฐ์ฌํ๋ ์์
์ ์ฐ์ ์ํฉ๋๋ค. ๊ฐ์ useDeferredValue๋ฅผ ํ์ํจ์ผ๋ก์จ ์ฐ๋ฆฌ๋ React์๊ฒ "์ด ๋ณ๊ฒฝ์ *์ง๊ธ ๋น์ฅ* ์ผ์ด๋ ํ์๊ฐ ์์ต๋๋ค. ๋ ์ค์ํ ์
๋ฐ์ดํธ๊ฐ ๋จผ์ ์๋ฃ๋๋๋ก ํ๊ณ , ์๊ฐ์ด ์์ ๋ ์ด๊ฒ์ ๋ ๋๋งํ์ธ์"๋ผ๊ณ ๋งํ๋ ๊ฒ์
๋๋ค.
useDeferredValue์ ์ฌ์ฉ ์ฌ๋ก
useDeferredValue๋ ํนํ ๋ค์๊ณผ ๊ฐ์ ์๋๋ฆฌ์ค์์ ์ ์ฉํฉ๋๋ค.
- ๋๊ท๋ชจ ๋ชฉ๋ก ๋๋ ํ ์ด๋ธ ๋ ๋๋ง: ๋ชฉ๋ก ์ ๋ฐ์ดํธ๋ฅผ ์ง์ฐํ๋ฉด ํํฐ๋ง ๋๋ ์ ๋ ฌ ์์ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐ์์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
- ๋ณต์กํ UI ์์ ์ ๋ฐ์ดํธ: UI ์์๊ฐ ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ ๋๋ ๋ ๋๋ง ์์ ์ ํฌํจํ๋ ๊ฒฝ์ฐ, ์ ๋ฐ์ดํธ๋ฅผ ์ง์ฐํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋๋ ค์ง๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
- API์์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ: ๊ฐ์ ธ์จ ๋ฐ์ดํฐ์ ํ์๋ฅผ ์ง์ฐํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ด๊ธฐ ์๋ฆฌ ํ์์ UI๋ฅผ ๋น ๋ฅด๊ฒ ๋ ๋๋งํ ์ ์์ด, ๋ฐ์ดํฐ๊ฐ ๊ฐ์ ธ์์ง๋ ๋์ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
- ์๋ ์์ฑ ๊ธฐ๋ฅ์ด ์๋ ๊ฒ์ ์ ๋ ฅ: ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋, ์ ์์ ์ ๋ ฅ ํ๋๊ฐ ๋ฐ์์ฑ์ ์ ์งํ๋๋ก ์ง์ฐ๋ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ตฌ์ฒด์ ์ธ ์์์ ํจ๊ป ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ค์ useDeferredValue ํ์ฉ ์ฌ๋ก
์์ 1: ํํฐ๋ง ๊ธฐ๋ฅ์ด ์๋ ๋๊ท๋ชจ ๋ชฉ๋ก ๋ ๋๋ง
๋๊ท๋ชจ ํญ๋ชฉ ๋ชฉ๋ก์ ๋ ๋๋งํ๊ณ ์ฌ์ฉ์๊ฐ ๊ฒ์ ์ฟผ๋ฆฌ์ ๋ฐ๋ผ ๋ชฉ๋ก์ ํํฐ๋งํ ์ ์๋๋ก ํ๋ ์ปดํฌ๋ํธ๋ฅผ ๊ณ ๋ คํด ๋ณด์ธ์.
import React, { useState, useDeferredValue } from 'react';
function LargeList({
items
}) {
const [query, setQuery] = useState('');
const deferredQuery = useDeferredValue(query);
const filteredItems = items.filter(item =>
item.toLowerCase().includes(deferredQuery.toLowerCase())
);
const handleChange = (event) => {
setQuery(event.target.value);
};
return (
<div>
<input type="text" value={query} onChange={handleChange} placeholder="Search..." />
<ul>
{filteredItems.map(item => (
<li key={item}>{item}</li>
))}
</ul>
</div>
);
}
export default LargeList;
์ด ์์์์ useDeferredValue๋ query๋ฅผ ๊ธฐ๋ฐ์ผ๋ก filteredItems์ ์
๋ฐ์ดํธ๋ฅผ ์ง์ฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์
๋ ฅ ํ๋์ ์
๋ ฅํ ๋ query ์ํ๋ ์ฆ์ ์
๋ฐ์ดํธ๋์ด ์
๋ ฅ ํ๋์ ๋ฐ์์ฑ์ ์ ์งํฉ๋๋ค. ๊ทธ๋ฌ๋ filteredItems๋ ๋ฉ์ธ ์ค๋ ๋๊ฐ ์ ํด ์ํ์ผ ๋๋ง ์
๋ฐ์ดํธ๋๋ฏ๋ก, ๋ชฉ๋ก ๋ ๋๋ง์ด ์
๋ ฅ ํ๋๋ฅผ ์ฐจ๋จํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ์ ๋ฐ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํต๋๋ค. ์ฐธ๊ณ : `filteredItems`์ ๋ ๋๋ง์ ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋๋ ํ๋ก์ธ์ค์ด๋ฏ๋ก ์ง์ฐํ๊ธฐ์ ์ข์ ํ๋ณด์
๋๋ค.
์์ 2: ๋ณต์กํ UI ์์ ์ ๋ฐ์ดํธ
์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ๋ผ ๋ณต์กํ ์ฐจํธ๋ ๊ทธ๋ํ๋ฅผ ํ์ํ๋ ์ปดํฌ๋ํธ๋ฅผ ์์ํด ๋ณด์ธ์. ์ฐจํธ ๋ ๋๋ง์๋ ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ ๋ฐ ๋ ๋๋ง ์์ ์ด ํฌํจ๋ ์ ์์ต๋๋ค. ์ฐจํธ ์ ๋ฐ์ดํธ๋ฅผ ์ง์ฐํจ์ผ๋ก์จ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฐจํธ๊ฐ ๋ ๋๋ง๋๋ ๋์์๋ ๋ฐ์์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
import React, { useState, useDeferredValue, useMemo } from 'react';
import { Chart } from 'chart.js/auto'; // Or any charting library
function ComplexChart({
data
}) {
const [filter, setFilter] = useState('all');
const deferredFilter = useDeferredValue(filter);
// Expensive data processing based on the filter
const processedData = useMemo(() => {
// Simulate a long processing time
let startTime = performance.now();
while (performance.now() - startTime < 50) { /* Do nothing */ }
if (deferredFilter === 'all') {
return data;
} else {
return data.filter(item => item.category === deferredFilter);
}
}, [data, deferredFilter]);
const chartConfig = {
type: 'bar',
data: {
labels: processedData.map(item => item.label),
datasets: [{
label: 'Data Points',
data: processedData.map(item => item.value)
}]
}
};
React.useEffect(() => {
const ctx = document.getElementById('myChart').getContext('2d');
new Chart(ctx, chartConfig);
}, [chartConfig]);
const handleChange = (event) => {
setFilter(event.target.value);
};
return (
<div>
<select value={filter} onChange={handleChange}>
<option value="all">All Categories</option>
<option value="category1">Category 1</option>
<option value="category2">Category 2</option>
</select>
<canvas id="myChart" width="400" height="200"></canvas>
</div>
);
}
export default ComplexChart;
์ด ์๋๋ฆฌ์ค์์ processedData๋ deferredFilter๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์๋ฉ๋๋ค. ๋๋กญ๋ค์ด ์ ํ์ด ๋ณ๊ฒฝ๋ ๋ `filter` ์ํ๋ ์ฆ์ ์
๋ฐ์ดํธ๋์ง๋ง, ๋น์ฉ์ด ๋ง์ด ๋๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ(์ง์ฐ์ผ๋ก ์๋ฎฌ๋ ์ด์
๋จ)๋ React๊ฐ ์ฌ์ ์๊ฐ์ด ์์ ๋๋ง ๋ฐ์ํฉ๋๋ค. ์ฌ์ฉ์๋ ํํฐ ์ต์
์ ๋ณ๊ฒฝํ ๋ ์ฆ๊ฐ์ ์ธ ๋ฐ์์ฑ์ ๊ฒฝํํ๋ฉฐ, ์ฐจํธ๊ฐ ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํ๋ ๋ฐ ์งง์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋๋ผ๋ ๋ง์
๋๋ค.
์์ 3: API์์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
API์์ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ์ ํ์๋ฅผ ์ง์ฐํ๋ฉด ์ด๊ธฐ ๋ก๋ ์๊ฐ์ ๊ฐ์ ํ๊ณ ๋ ๋ถ๋๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ UI๋ฅผ ๋ ๋๋งํ๋ ๋์ , ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฆ์ ์๋ฆฌ ํ์์ UI๋ฅผ ๋ ๋๋งํ๊ณ ๋ฐ์ดํฐ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํด์ง๋ฉด ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ก ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
import React, { useState, useEffect, useDeferredValue } from 'react';
function DataDisplay() {
const [data, setData] = useState(null);
const deferredData = useDeferredValue(data);
useEffect(() => {
async function fetchData() {
const response = await fetch('https://api.example.com/data');
const jsonData = await response.json();
setData(jsonData);
}
fetchData();
}, []);
return (
<div>
{deferredData ? (
<ul>
{deferredData.map(item => (
<li key={item.id}>{item.name}</li>
))}
</ul>
) : (
<p>Loading data...</p>
)}
</div>
);
}
export default DataDisplay;
์ฌ๊ธฐ์ "๋ฐ์ดํฐ ๋ก๋ ์ค..." ๋ฉ์์ง๊ฐ ์ฒ์์ ํ์๋ฉ๋๋ค. `data`๊ฐ ๊ฐ์ ธ์์ง๋ฉด useDeferredValue๋ฅผ ํตํด `deferredData`์ ํ ๋น๋ฉ๋๋ค. React๋ "๋ฐ์ดํฐ ๋ก๋ ์ค..." ๋ฉ์์ง๋ฅผ ๋น ๋ฅด๊ฒ ํ์ํ๋ ๊ฒ์ ์ฐ์ ์ํ๊ณ , ๋ฐ์ดํฐ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ ์ด๊ธฐ ๋ ๋๋ง์ ์ฐจ๋จํ์ง ์๊ณ ํญ๋ชฉ ๋ชฉ๋ก์ ๋ ๋๋งํฉ๋๋ค. ์ด๊ฒ์ ์ธ์ง๋ ์ฑ๋ฅ์ ํฅ์์ํค๋ ์ผ๋ฐ์ ์ธ ํจํด์
๋๋ค.
์์ 4: ์๋ ์์ฑ ๊ธฐ๋ฅ์ด ์๋ ๊ฒ์ ์ ๋ ฅ
์๋ ์์ฑ ๊ธฐ๋ฅ์ด ์๋ ๊ฒ์ ์ ๋ ฅ์ด ์๋ ์๋๋ฆฌ์ค์์, ์๋ ์์ฑ ๊ฒฐ๊ณผ์ ํ์๋ฅผ ์ง์ฐํ๋ฉด ์ ๋ ฅ ํ๋๊ฐ ๋ ๋ฐ์์ฑ์ด ์ข๊ฒ ๋๊ปด์ง ์ ์์ต๋๋ค.
import React, { useState, useDeferredValue, useEffect } from 'react';
function SearchWithSuggestions() {
const [searchTerm, setSearchTerm] = useState('');
const deferredSearchTerm = useDeferredValue(searchTerm);
const [suggestions, setSuggestions] = useState([]);
useEffect(() => {
// Simulate fetching suggestions from an API based on the search term
async function fetchSuggestions() {
if (deferredSearchTerm) {
const response = await fetch(`https://api.example.com/suggestions?q=${deferredSearchTerm}`);
const data = await response.json();
setSuggestions(data);
} else {
setSuggestions([]);
}
}
fetchSuggestions();
}, [deferredSearchTerm]);
const handleChange = (event) => {
setSearchTerm(event.target.value);
};
return (
<div>
<input type="text" value={searchTerm} onChange={handleChange} placeholder="Search..." />
<ul>
{suggestions.map(suggestion => (
<li key={suggestion.id}>{suggestion.label}</li>
))}
</ul>
</div>
);
}
export default SearchWithSuggestions;
searchTerm์ ์ฌ์ฉ์ ์
๋ ฅ์ ์ฆ์ ์
๋ฐ์ดํธ๋์ด ๋ฐ์์ฑ์ ๋ณด์ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ์์ ๊ฐ์ ธ์ค๋ ๋น๊ต์ ๋น์ฉ์ด ๋ง์ด ๋๋ API ํธ์ถ๊ณผ ๊ทธ์ ๋ฐ๋ฅธ ๋ ๋๋ง์ deferredSearchTerm์ ๊ธฐ๋ฐ์ผ๋ก ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค. ์ด๋ ๊ฒ์ ์ ์์ด ์ง์ฐ๋์ด ์ฌ์ฉ์์ ํ์ดํ ๊ฒฝํ์ ๋ฐฉํดํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
useDeferredValue ์ฌ์ฉ์ ์ด์
useDeferredValue๋ฅผ ์ฌ์ฉํ๋ ์ฃผ๋ ์ด์ ์ ํฅ์๋ ์ฌ์ฉ์ ๊ฒฝํ์
๋๋ค. UI์ ๋ ์ค์ํ ๋ถ๋ถ์ ๋ํ ์
๋ฐ์ดํธ๋ฅผ ์ง์ฐํจ์ผ๋ก์จ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐ์์ฑ์ ์ฐ์ ์ํ๊ณ ์ฌ์ฉ์์๊ฒ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ด๋ ๋ ๋ถ๋๋ฝ๊ณ ์ฆ๊ฑฐ์ด ์ฌ์ฉ์ ์ํธ ์์ฉ์ ๊ฐ์ ธ์ต๋๋ค.
๊ตฌ์ฒด์ ์ผ๋ก, useDeferredValue๋ ๋ค์์ ๋์ต๋๋ค.
- ๋ฐ์์ฑ ์ ์ง: ์ฌ์ฉ์ ์ ๋ ฅ ๋ฐ ๊ธฐํ ๊ณ ์ฐ์ ์์ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ฉ์ธ ์ค๋ ๋๋ฅผ ๋น์ ๋ก๋๋ค.
- ์ธ์ง๋ ์ง์ฐ ์๊ฐ ๊ฐ์: ์ค์ํ UI ์์๊ฐ ์ฆ์ ์ ๋ฐ์ดํธ๋๋ฏ๋ก ์ฌ์ฉ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ๋น ๋ฅด๋ค๊ณ ๋๋๋๋ค.
- ์ฑ๋ฅ ์ต์ ํ: ๋ถํ์ํ ์ฌ๋ ๋๋ง์ ๋ฐฉ์งํ๊ณ ๋ธ๋ผ์ฐ์ ์ ์ ๋ฐ์ ์ธ ์์ ๋ถํ๋ฅผ ์ค์ ๋๋ค.
- ํฅ์๋ UX: ๋ ๋ถ๋๋ฝ๊ณ ์ง๊ด์ ์ธ ์ํธ ์์ฉ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
๊ณ ๋ ค ์ฌํญ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
useDeferredValue๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง, ์ ์คํ๊ฒ ์ฌ์ฉํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ์ฌ๋ฐ๋ฅธ ํ๋ณด ์๋ณ: ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์คํ๊ฒ ๋ถ์ํ์ฌ ์ง์ฐ๋ ์
๋ฐ์ดํธ์ ์ด์ ์ ์ป์ ์ ์๋ UI ์์๋ฅผ ์๋ณํ์ญ์์ค. ๋ชจ๋ ๊ฐ์
useDeferredValue๋ฅผ ๋งน๋ชฉ์ ์ผ๋ก ์ ์ฉํ์ง ๋ง์ญ์์ค. - ๊ณผ๋ํ ์ง์ฐ ๋ฐฉ์ง: ๋๋ฌด ๋ง์ ์ ๋ฐ์ดํธ๋ฅผ ์ง์ฐํ๋ฉด UI๊ฐ ์ค๋๋๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ด ํผ๋์ค๋ฌ์์ง ์ ์์ต๋๋ค. ๋ฐ์์ฑ๊ณผ ๋ฐ์ดํฐ ์ ํ์ฑ ์ฌ์ด์ ์ฌ๋ฐ๋ฅธ ๊ท ํ์ ์ฐพ์ผ์ญ์์ค.
- ์ฑ๋ฅ ์ธก์ : ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ฑ๋ฅ์ ๋ํ
useDeferredValue์ ์ํฅ์ ์ธก์ ํ์ญ์์ค. ์ด๊ฒ์ด ์ค์ ๋ก ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ๊ณ ์๋์ง ํ์ธํ์ญ์์ค. React Profiler๋ ํ๋ฅญํ ์ ํ์ ๋๋ค. - ๋์ ๊ณ ๋ ค: ์ด๋ค ๊ฒฝ์ฐ์๋ ๋ฉ๋ชจ์ด์ ์ด์
๋๋ ๊ฐ์ํ์ ๊ฐ์ ๋ค๋ฅธ ์ต์ ํ ๊ธฐ์ ์ด
useDeferredValue๋ณด๋ค ๋ ์ ์ ํ ์ ์์ต๋๋ค.useMemo,useCallback, ๊ทธ๋ฆฌ๊ณ ์๋์ฐ๋ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ(`react-window`์ ๊ฐ์)๋ ํน์ ๋ ๋๋ง ์๋๋ฆฌ์ค๋ฅผ ์ต์ ํํ๋ ๋ฐ ์ข์ต๋๋ค. - ์ ํ ํ์๊ธฐ ์ฌ์ฉ: ์ง์ฐ๋ ๊ฐ์ด ์ ๋ฐ์ดํธ๋๊ณ ์์์ ๋ํ๋ด๋ ์๊ฐ์ ์ ํธ(์: ๋ก๋ฉ ์คํผ๋ ๋๋ ๋ฏธ๋ฌํ ์ ๋๋ฉ์ด์ )๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์ด๋ ์ฌ์ฉ์๊ฐ UI๊ฐ ๋ฉ์ถ ๊ฒ์ด ์๋๋ฉฐ ๋ฐ์ดํฐ๊ฐ ๊ณง ์ ๋ฐ์ดํธ๋ ๊ฒ์์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ์ ์ญ์ ๊ด์ : ๋ค๋ฅธ ์ง์ญ์ ๋คํธ์ํฌ ์ํ์ ์ ์ํ์ญ์์ค. ํ ์์น์์๋ ๊ฐ์งํ ์ ์๋ ์ง์ฐ์ด ๋ค๋ฅธ ์์น์์๋ ๋์ ๋๊ฒ ๋๊ปด์ง ์ ์์ต๋๋ค.
useDeferredValue vs. useTransition
React๋ ๋ํ UI ์
๋ฐ์ดํธ๋ฅผ ์ต์ ํํ๊ธฐ ์ํ ๋ ๋ค๋ฅธ ๋ฉ์ปค๋์ฆ์ธ useTransition ํ
์ ์ ๊ณตํฉ๋๋ค. useDeferredValue์ useTransition ๋ชจ๋ ๋ฐ์์ฑ์ ๊ฐ์ ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ์ง๋ง, ์ฝ๊ฐ ๋ค๋ฅธ ๋ชฉ์ ์ ๊ฐ์ง๋๋ค.
useTransition์ ์ผ๋ฐ์ ์ผ๋ก ๊ฒฝ๋ก ๊ฐ ํ์ ๋๋ UI ์์ ํ ๊ธ๊ณผ ๊ฐ์ ์ํ ์ ํ์ ์ฌ์ฉ๋ฉ๋๋ค. ํน์ ์ํ ์
๋ฐ์ดํธ๋ฅผ ์ ํ์ผ๋ก ํ์ํ ์ ์๋๋ก ํ๋ฉฐ, React๋ ์ด๋ฅผ ๋ฎ์ ์ฐ์ ์์๋ก ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋ ์ ํ์ด ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ๊ณ ์ง์ฐ์ ์ ๋ฐํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
๋ฐ๋ฉด์ useDeferredValue๋ ๊ฐ์ ๋ํ ์
๋ฐ์ดํธ๋ฅผ ์ง์ฐํ๊ธฐ ์ํด ํน๋ณํ ์ค๊ณ๋์์ต๋๋ค. ์ฌ์ฉ์ ์
๋ ฅ ๋๋ ๋ค๋ฅธ ์ธ๋ถ ์์ค์์ ํ์๋ ๊ฐ์ด ์๊ณ , ํด๋น ๊ฐ์ ๋ํ ์
๋ฐ์ดํธ๊ฐ UI๋ฅผ ์ฐจ๋จํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ์ถ์ ๋ ๊ฐ์ฅ ์ ์ฉํฉ๋๋ค. useDeferredValue๋ ๋ณด์กฐ์ ์ด๊ฑฐ๋ ๋ ์ค์ํ UI ์
๋ฐ์ดํธ๋ฅผ ๊ตฌ๋ํ๋ ๊ฐ์ ์ต์ ํํ๊ธฐ ์ํ ์ ๋ฌธ ๋๊ตฌ๋ก ์๊ฐํ ์ ์์ผ๋ฉฐ, useTransition์ ์ ์ฒด ์ํ ์ ํ์ ์ฐ์ ์์๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
์์ฝํ์๋ฉด:
- useTransition: ์ํ ์ ๋ฐ์ดํธ๋ฅผ ๋ฎ์ ์ฐ์ ์์ ์ ํ์ผ๋ก ํ์ํฉ๋๋ค. ๊ฒฝ๋ก ๋ณ๊ฒฝ ๋๋ UI ์์ ํ ๊ธ์ ์ด์์ ์ ๋๋ค.
- useDeferredValue: ํน์ ๊ฐ์ ๋ํ ์ ๋ฐ์ดํธ๋ฅผ ์ง์ฐ์์ผ, ํด๋น ๊ฐ์ ์์กดํ๋ UI ๋ถ๋ถ์ด ๋์ค์ ์ ๋ฐ์ดํธ๋๋๋ก ํฉ๋๋ค. ์ ๋ ฅ ํํฐ๋ง ๋๋ ๋๋ฆฐ ์์ค์์ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ๋ฐ ํ์ํฉ๋๋ค.
๊ฒฐ๋ก : ํ์ํ React ์ฑ๋ฅ์ ์ํ ์ง์ฐ๋ ์ ๋ฐ์ดํธ ์์ฉ
React์ useDeferredValue ํ
์ UI์ ๋ ์ค์ํ ๋ถ๋ถ์ ๋ํ ์
๋ฐ์ดํธ๋ฅผ ์ง์ฐ์์ผ ์ฌ์ฉ์ ๊ฒฝํ์ ์ต์ ํํ๋ ๊ฐ๋ ฅํ๊ณ ์ฐ์ํ ์๋ฃจ์
์ ์ ๊ณตํฉ๋๋ค. ์ง์ฐ๋ ์
๋ฐ์ดํธ์ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ useDeferredValue๋ฅผ ์ ์คํ๊ฒ ์ ์ฉํจ์ผ๋ก์จ, ๋ ๋ฐ์์ฑ์ด ์ข๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋๋ฉฐ ์ฆ๊ฑฐ์ด React ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์ง์ฐ๋ ์
๋ฐ์ดํธ์ ์ ํฉํ ํ๋ณด๋ฅผ ์ ์คํ๊ฒ ์๋ณํ๊ณ , ์ฑ๋ฅ ๊ฐ์ ์ ์ธก์ ํ๋ฉฐ, ํ์์ ๋ฐ๋ผ ๋์ฒด ์ต์ ํ ๊ธฐ์ ์ ๊ณ ๋ คํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค. ์ด๋ฌํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์์ฉํจ์ผ๋ก์จ useDeferredValue์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ๋ฐํํ๊ณ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์ฐ์ํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
์น ๊ฐ๋ฐ์ด ๊ณ์ ์งํํจ์ ๋ฐ๋ผ, ์ง์ฐ๋ ์
๋ฐ์ดํธ์ ๊ฐ์ ๊ธฐ์ ์ ๊ณ ์ฑ๋ฅ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ๋ ๋ฐ ์ ์ ๋ ์ค์ํด์ง ๊ฒ์
๋๋ค. useDeferredValue ๋ฐ ๊ธฐํ React ์ต์ ํ ๋๊ตฌ๋ฅผ ์๋ฌํ๋ ๊ฒ์ ํ์ํ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ง๋ค๊ณ ์ ํ๋ ๋ชจ๋ ๊ฐ๋ฐ์์๊ฒ ํ์์ ์ผ ๊ฒ์
๋๋ค.