공유/React, Next

[React] Context API vs Zustand 렌더링 비교

구하천포 2024. 9. 10. 19:19

Context API vs Zustand 렌더링 비교

React에서 상태 관리를 위한 라이브러리는 다양합니다.
내장된 Context API부터 Redux, MobX, Recoil, Zustand 등 여러 가지가 있습니다.
각 라이브러리의 장단점은 사용자에 따라 다르게 느껴질 수 있지만, 이번 글에서는 Zustand를 사용한 경험을 바탕으로 렌더링 최적화에 대해 살펴보려고 합니다.

많은 글에서 Zustand와 같은 라이브러리를 사용하면 Context API에 비해 렌더링이 더 최적화된다고 언급됩니다.
그러나 실제로 이를 테스트해본 글은 찾기 어렵습니다.
이번 글에서는 실제로 렌더링이 어떻게 최적화되는지 직접 확인해보겠습니다.

결과

빠르게 결과부터 확인해봅시다.

• Context API - 코드
• Zustand 실패 - 코드
• Zustand 성공 - 코드

결론은 Zustand를 개발자가 의도한 대로 잘 사용하면 렌더링 최적화가 가능하다는 것입니다.

아래 이미지를 참고하세요.

Context API와 Zustand를 제대로 사용하지 않으면, 상태와 상관없이 모든 컴포넌트가 다시 렌더링됩니다.
이는 Zustand를 최적화하지 못했을 때 발생하는 현상입니다.

왜 그런지 아래 코드를 살펴봅시다.

const { age, ageIncrement, ageDecrement } = useStore();

이 코드는 store에서 전체 상태 값을 반환한 후 구조분해 할당을 통해 사용하는 방식입니다.
여기서 문제는 전체 상태 값을 반환하기 때문에, 상태 중 하나라도 변경되면 모든 상태가 변경된 것으로 인식하고 컴포넌트를 다시 렌더링하게 됩니다.

이는 상태를 담고 있는 객체가 변경되었으니 React가 렌더링해야 한다고 판단하는 것입니다.
이 문제를 해결하려면 selector 패턴을 이용해 원하는 상태만 선택해야 합니다.

const age = useStore(state => state.age);
const ageIncrement = useStore(state => state.ageIncrement);
const ageDecrement = useStore(state => state.ageDecrement);

위 코드처럼 필요한 상태만 선택해 가져오면 불필요한 렌더링을 막을 수 있습니다.
아래 이미지를 보면, 상태가 변경되지 않는 한 렌더링이 발생하지 않는 것을 확인할 수 있습니다.

결론

Zustand를 사용할 때는 구조분해 할당을 피하고, 선택적 상태 구독을 통해 렌더링을 최적화할 수 있습니다.
이를 통해 Context API보다 효율적인 상태 관리를 할 수 있습니다.

반응형