useMemo
는 React Hook 중 하나로, 계산된 값을 메모이제이션(Memoization)하여 성능을 최적화하는 데 사용됩니다. 주로 컴포넌트가 렌더링될 때 불필요한 재계산을 방지하고자 할 때 사용됩니다.
useMemo
사용 시기useMemo
사용 여부데이터를 불러오는 작업과는 다른 맥락에서 사용됩니다. 데이터 불러오기는 비동기 작업으로, 주로 useEffect
와 함께 사용됩니다. useMemo
는 주로 계산된 값을 저장하는 데 사용됩니다. 따라서 데이터를 불러오는 작업 자체에는 useMemo
를 사용하지 않습니다.
그러나 데이터를 불러온 후 그 데이터를 기반으로 한 계산이나 가공 작업이 비싸다면, 이 경우에 useMemo
를 사용하여 그 계산된 결과를 메모이제이션할 수 있습니다.
import React, { useMemo } from 'react';
const ExpensiveComponent = ({ items }) => {
const total = useMemo(() => {
console.log('Calculating total...');
return items.reduce((sum, item) => sum + item.value, 0);
}, [items]);
return (
<div>
<p>Total: {total}</p>
</div>
);
};
위 예시에서는 items
배열의 값이 변경되지 않는 한, 총합을 다시 계산하지 않습니다. 이는 불필요한 계산을 방지하여 성능을 최적화합니다.
import React, { useMemo } from 'react';
const FilteredList = ({ list, filter }) => {
const filteredList = useMemo(() => {
console.log('Filtering list...');
return list.filter(item => item.includes(filter));
}, [list, filter]);
return (
<ul>
{filteredList.map((item, index) => (
<li key={index}>{item}</li>
))}
</ul>
);
};
여기서 filter
와 list
가 변경되지 않는 한, 필터링 작업은 다시 수행되지 않습니다. 이는 리스트의 크기가 클 때 유용합니다.
import React, { useEffect, useState, useMemo } from 'react';
const DataFetchingComponent = () => {
const [data, setData] = useState([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetch('https://api.example.com/data')
.then(response => response.json())
.then(fetchedData => {
setData(fetchedData);
setLoading(false);
});
}, []);
const processedData = useMemo(() => {
console.log('Processing data...');
return data.map(item => ({
...item,
processedValue: item.value * 2,
}));
}, [data]);
if (loading) {
return <div>Loading...</div>;
}
return (
<ul>
{processedData.map((item, index) => (
<li key={index}>{item.processedValue}</li>
))}
</ul>
);
};
이 예시에서는 데이터를 불러온 후, 해당 데이터를 가공하는 작업이 포함되어 있습니다. 데이터를 불러오는 것은 useEffect
로 처리하고, 가공된 데이터를 useMemo
로 저장하여 불필요한 재가공을 방지합니다.
useMemo
는 주로 비싼 계산 작업을 메모이제이션하여 성능을 최적화할 때 사용됩니다.useMemo
는 계산된 값이 변하지 않는 한, 동일한 계산을 다시 수행하지 않도록 합니다.