React 메모: 간단한 메모로 React 성능 향상
React 애플리케이션은 불필요한 재렌더링이 성능에 큰 영향을 미칠 수 있는 대규모 데이터 세트와 복잡한 구성 요소를 다루는 경우가 많습니다. 이 문제를 해결하기 위해 React는 구성 요소를 최적화하고 렌더링 시간을 줄이는 간단하면서도 강력한 도구인 React.memo를 제공합니다. 이 가이드에서는 React Memo의 작동 방식, 유용한 이유, 구현 방법을 단계별로 살펴보겠습니다.
React.memo는 기능적 구성 요소를 메모하는 데 도움이 되는 React의 고차 구성 요소(HOC)입니다. 메모화는 입력을 기반으로 함수의 출력을 캐싱하는 프로세스이므로 함수는 동일한 입력에 대한 결과를 다시 계산할 필요가 없습니다. React Memo는 비슷하게 작동합니다. 즉, 구성 요소의 마지막 렌더링된 출력을 "기억"하고 props가 변경될 때만 다시 렌더링합니다.
React에서는 상위 구성 요소가 다시 렌더링될 때마다 구성 요소가 다시 렌더링됩니다. 구성 요소의 출력이 상위 항목의 변경 사항에 의존하지 않는 경우 이로 인해 비효율성이 발생할 수 있습니다. 예를 들어 구성요소가 많은 복잡한 UI에서는 과도한 재렌더링으로 인해 지연이 발생할 수 있습니다. React Memo를 사용하면 필요한 경우에만 구성 요소를 업데이트하여 이를 최적화할 수 있습니다.
상위 구성 요소가 다시 렌더링되면 해당 하위 구성 요소도 다시 렌더링됩니다. 이로 인해 특히 구성 요소가 정적 데이터를 표시하거나 변경되지 않는 소품에 의존하는 경우 성능 병목 현상이 발생할 수 있습니다.
구성 요소가 깊게 중첩된 애플리케이션은 누적된 다시 렌더링으로 인해 성능이 저하될 수 있습니다. React Memo를 사용한 메모 기능은 업데이트가 필요하지 않은 구성 요소가 다시 렌더링되는 것을 방지하여 앱의 응답성을 향상시킵니다.
React Memo의 기본 구현을 살펴보겠습니다. 메모이제이션을 사용하지 않는 간단한 구성요소부터 시작하여 React Memo를 추가하면 어떤 차이가 있는지 살펴보겠습니다.
import React, { useState } from 'react'; function Counter({ count }) { console.log('Counter component re-rendered'); return <h1>Count: {count}</h1>; } function App() { const [count, setCount] = useState(0); const [text, setText] = useState(''); return ( <div> <Counter count={count} /> <button onClick={() => setCount(count + 1)}>Increment Count</button> <input type="text" value={text} onChange={(e) => setText(e.target.value)} placeholder="Type something..." /> </div> ); } export default App;
이 예에서는 입력 필드에 입력할 때마다 개수 값이 동일하게 유지되더라도 Counter 구성 요소가 다시 렌더링됩니다. 이는 React Memo를 통해 방지할 수 있는 불필요한 재렌더링입니다.
이제 Counter 컴포넌트를 React.memo로 래핑하여 최적화해 보겠습니다.
import React, { useState } from 'react'; function Counter({ count }) { console.log('Counter component re-rendered'); return <h1>Count: {count}</h1>; } function App() { const [count, setCount] = useState(0); const [text, setText] = useState(''); return ( <div> <Counter count={count} /> <button onClick={() => setCount(count + 1)}>Increment Count</button> <input type="text" value={text} onChange={(e) => setText(e.target.value)} placeholder="Type something..." /> </div> ); } export default App;
React.memo를 사용하면 Counter 구성 요소는 count prop이 변경된 경우에만 다시 렌더링됩니다. 이제 입력 필드에 입력해도 더 이상 카운터가 다시 렌더링되지 않아 성능이 크게 최적화됩니다.
React Memo의 실제 이점을 알아보기 위해 좀 더 복잡한 예를 살펴보겠습니다. 각 항목 옆에 '좋아요' 버튼이 있는 항목 목록이 있다고 가정해 보겠습니다. 개별 항목에 좋아요를 표시할 때 React Memo가 과도한 재렌더링을 어떻게 방지할 수 있는지 보여드리겠습니다.
import React, { useState } from 'react'; const Counter = React.memo(function Counter({ count }) { console.log('Counter component re-rendered'); return <h1>Count: {count}</h1>; }); function App() { const [count, setCount] = useState(0); const [text, setText] = useState(''); return ( <div> <Counter count={count} /> <button onClick={() => setCount(count + 1)}>Increment Count</button> <input type="text" value={text} onChange={(e) => setText(e.target.value)} placeholder="Type something..." /> </div> ); } export default App;
위 코드에서는 한 항목에 좋아요를 표시하면 한 항목의 좋아요만 변경되더라도 모든 항목이 다시 렌더링됩니다.
import React, { useState } from 'react'; function Item({ item, onLike }) { console.log(`Rendering ${item.name}`); return ( <div> <h2>{item.name}</h2> <button onClick={() => onLike(item.id)}>Like</button> </div> ); } function ItemList() { const [items, setItems] = useState([ { id: 1, name: 'Item 1', likes: 0 }, { id: 2, name: 'Item 2', likes: 0 }, { id: 3, name: 'Item 3', likes: 0 }, ]); const handleLike = (id) => { setItems((prevItems) => prevItems.map((item) => item.id === id ? { ...item, likes: item.likes + 1 } : item ) ); }; return ( <div> {items.map((item) => ( <Item key={item.id} item={item} onLike={handleLike} /> ))} </div> ); } export default ItemList;
이제 클릭한 좋아요 항목만 다시 렌더링되므로 UI가 훨씬 빠르고 효율적이 됩니다.
React Memo는 특정 시나리오에서 유용하지만, 어디에서나 사용하면 실질적인 이점을 추가하지 못한 채 코드가 복잡해질 수 있습니다. 특히 효과적일 수 있는 몇 가지 주요 상황은 다음과 같습니다.
얕은 비교: React Memo는 얕은 비교를 수행합니다. 즉, 깊이 중첩된 객체나 배열의 변경 사항을 감지하지 못합니다. 복잡한 props를 전달하는 경우 useMemo 또는 useCallback 사용을 고려해보세요.
성능 모니터링: React DevTools를 사용하여 메모이제이션으로 실제로 이점을 얻는 구성 요소를 식별합니다. React Memo를 과도하게 사용하면 코드가 복잡해지고 성능 향상은 미미할 수 있습니다.
아니요, React Memo는 기능적 구성요소에만 사용됩니다. 그러나 클래스 구성 요소의 경우 PureComponent를 사용하면 유사한 동작을 달성할 수 있습니다.
React Memo는 불필요한 재렌더링을 줄이고 React 애플리케이션 성능을 향상시키는 귀중한 도구입니다. 순수 기능 구성 요소나 정적 UI 요소에 선택적으로 사용하면 구조를 복잡하게 하지 않고도 React 앱을 최적화할 수 있습니다. 다음 단계에 따라 예제를 시도하고 계속 실험하여 프로젝트에 가장 적합한 메모 전략을 찾으세요!
위 내용은 React Memo로 불필요한 재렌더링에 작별 인사하기: 단계별 튜토리얼의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!