React.memo
는 **컴포넌트의 불필요한 리렌더링을 방지하는 고차 컴포넌트(HOC, Higher-Order Component)**입니다.
즉, props
가 변경되지 않으면 기존 렌더링 결과를 재사용하여 성능을 최적화합니다.
import { useState } from "react";
function Child({ count }: { count: number }) {
console.log("Child 컴포넌트 렌더링!");
return <p>Count: {count}</p>;
}
export default function Parent() {
const [count, setCount] = useState(0);
const [text, setText] = useState("");
return (
<div>
<Child count={count} />
<button onClick={() => setCount(count + 1)}>Increase Count</button>
<input value={text} onChange={(e) => setText(e.target.value)} />
</div>
);
}
❗ 부모(Parent
)가 다시 렌더링되면 모든 자식 컴포넌트도 리렌더링 되어 text
값을 변경해도 Child
컴포넌트가 불필요하게 리렌더링됩니다.
import { useState } from "react";
import React from "react";
const Child = React.memo(({ count }: { count: number }) => {
console.log("Child 컴포넌트 렌더링!");
return <p>Count: {count}</p>;
});
export default function Parent() {
const [count, setCount] = useState(0);
const [text, setText] = useState("");
return (
<div>
<Child count={count} />
<button onClick={() => setCount(count + 1)}>Increase Count</button>
<input value={text} onChange={(e) => setText(e.target.value)} />
</div>
);
}
✔️ text
값을 변경해도 Child
컴포넌트는 리렌더링 되지 않습니다.
✔️ Child
컴포넌트의 props.count
가 변경될 때만 다시 렌더링됩니다.
React.memo
는 객체, 배열, 함수 타입의 props가 변경되면 다시 렌더링됩니다.
이를 방지하려면 useCallback
을 함께 사용해야 합니다.
import { useState, useCallback } from "react";
import React from "react";
const Child = React.memo(({ onClick }: { onClick: () => void }) => {
console.log("Child 컴포넌트 렌더링!");
return <button onClick={onClick}>Click Me</button>;
});
export default function Parent() {
const [count, setCount] = useState(0);
// useCallback을 사용하여 함수를 메모이제이션
const handleClick = useCallback(() => {
console.log("Button clicked!");
}, []);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>Increase Count</button>
<Child onClick={handleClick} />
</div>
);
}
💡 왜
useCallback
이 필요한가?
onClick
이 부모에서 매번 새로 생성되면Child
는 React.memo를 적용해도 매번 리렌더링됩니다.useCallback
을 사용하면onClick
이 메모이제이션되어,Child
가 다시 렌더링되지 않습니다.
props
가 변경되지 않아야 효과가 있음React.memo
는 props
가 변경되면 여전히 리렌더링useCallback
, useMemo
를 함께 사용하면 더 효과적state
가 변경되면 React.memo
를 적용해도 자식이 영향을 받을 수 있음React.memo
를 사용하지 않아도 큰 차이가 없음