React 개발을 하다 보면 애플리케이션의 성능을 최적화해야 할 상황이 종종 생긴다. 이 때 사용할 수 있는 기법 중 하나가 Memoization이다.
Memoization은 계산 결과를 메모리에 저장해 두고 동일한 계산이 요청될 때 다시 계산하지 않고 저장된 값을 반환하는 최적화 기법이다. 이를 통해 애플리케이션의 속도를 높일 수 있다.
React.memo는 React 라이브러리에서 제공하는 고차 컴포넌트(HOC)로, 함수형 컴포넌트의 렌더 결과를 메모이징해 성능을 최적화할 수 있다.
React.memo는 props의 얕은 비교(shallow comparison)를 통해 이전과 현재의 props가 같은지 확인한다. 만약 props가 변경되지 않았다면, 이전에 렌더링된 결과를 재사용한다.
기본적인 사용법은 아래와 같다.
const MyComponent = React.memo(function MyComponent({ name }) {
return <div>{`안녕, ${name}`}</div>;
});
여기서 MyComponent
는 name
props가 변경되지 않는 한 이전 렌더링 결과를 재사용한다.
React.memo는 두 번째 인자로 커스텀 비교 함수를 받을 수 있다. 이 함수는 이전 props와 새로운 props를 인자로 받고, 두 값이 같으면 true
, 다르면 false
를 반환한다.
const areEqual = (prevProps, nextProps) => {
return prevProps.name === nextProps.name;
};
const MyComponent = React.memo(function MyComponent({ name }) {
return <div>{`안녕, ${name}`}</div>;
}, areEqual);
React.memo는 함수형 컴포넌트의 성능을 최적화하기 위한 유용한 도구다. 하지만 사용 시에는 주의점을 고려해야 한다. 성능 이슈가 실제로 발생하는 경우에만 적절히 활용하도록 하자.
React 애플리케이션에서 성능 최적화를 고려한다면 useMemo
는 중요한 훅 중 하나다. 복잡한 연산이나 빈번한 렌더링이 일어나는 경우, 이 훅을 사용해 성능을 개선할 수 있다.
useMemo
는 메모이제이션(memoization)을 통해 연산의 결과값을 저장해 둔다. 이 훅은 의존성 배열이 변경되지 않으면 이전에 계산한 값을 재사용한다.
기본 사용법은 아래와 같다.
import React, { useMemo } from 'react';
const MyComponent = ({ list }) => {
const sortedList = useMemo(() => {
return list.sort((a, b) => a - b);
}, [list]);
return (
<div>
{sortedList.map((item) => (
<p>{item}</p>
))}
</div>
);
};
여기에서 sortedList
는 list
배열이 변경될 때만 다시 정렬된다. 그 외의 경우에는 이전에 정렬된 배열을 재사용한다.
useMemo
의 두 번째 인자는 의존성 배열이다. 이 배열 내의 값이 변경되면 useMemo
내부의 코드가 다시 실행된다. 의존성 배열을 잘 관리하는 것이 중요하다.
useMemo
는 복잡한 연산이나 자주 변경되는 값에 대한 최적화에 적합하다.
useMemo
는 React에서 성능 최적화에 큰 도움을 줄 수 있다. 하지만 언제나 그렇듯, 이 훅도 적절한 상황과 조건에서 사용해야 최대의 효과를 볼 수 있다. 성능 문제가 발생할 때만 고려해서 사용하는게 바람직하다.
useCallback
은 React에서 제공하는 훅 중 하나로, 함수를 메모이징해서 성능을 최적화할 수 있는 기능을 제공한다.
useCallback
훅은 주어진 함수와 의존성 배열을 인자로 받아, 메모이징된 함수를 반환한다. 의존성 배열의 값이 변경되지 않는다면 이전에 생성된 함수를 재사용한다.
useCallback
의 기본 사용법은 다음과 같다.
import React, { useCallback } from 'react';
const MyButton = ({ onClick, label }) => {
return <button onClick={onClick}>{label}</button>;
};
const App = () => {
const handleClick = useCallback(() => {
console.log('Button clicked!');
}, []);
return <MyButton onClick={handleClick} label="클릭해줘!" />;
};
useCallback
의 두 번째 인자는 의존성 배열이다. 이 배열 내의 값이 변경되면 새로운 함수를 생성하고 메모이징한다. 배열이 비어 있다면 컴포넌트가 처음 마운트될 때 생성한 함수를 계속해서 재사용한다.
const handleClick = useCallback(() => {
console.log(`Button clicked ${count} times`);
}, [count]);
useCallback
을 무분별하게 사용하면 오히려 성능 문제가 생길 수 있다.useCallback
으로 메모이징된 함수가 클로저를 형성하므로 함수 내부에서 사용하는 외부 변수에 주의해야 한다.
useCallback
은 React 애플리케이션에서 성능 최적화를 위해 유용하게 사용할 수 있는 훅이다. 하지만 잘못 사용하면 오히려 성능 문제를 유발할 수 있으므로 적절한 상황에서만 사용해야 헌다.