프론트엔드 개발에서 React로 애플리케이션을 구축할 때, 컴포넌트는 자체적인 지역 상태를 갖습니다. 그러나 애플리케이션이 커지고 복잡해지며 여러 컴포넌트 간에 데이터를 공유해야 할 때, 지역 상태만 사용하면 문제가 발생하는데요. 전역 상태 관리로 이 문제를 해결할 수 있습니다.
전역 상태를 효과적으로 관리하려면, 적절한 라이브러리를 사용해야 합니다. React에서는 전역 상태 관리 라이브러리로 Redux, Zustand, Jotai를 많이 이용하는데요. 이 글에서는 Redux, Zustand의 특징과 장단점을 살펴보겠습니다.
지역 상태 사용 시 문제점
앞서 ‘애플리케이션이 커지고 복잡해지며 여러 컴포넌트 간에 데이터를 공유해야 할 때, 지역 상태만 사용하면 문제가 발생한다’고 언급했는데요. 구체적으로 어떤 문제가 일어나는지 알아보겠습니다.
- Prop Drilling: 상위 컴포넌트에서 하위 컴포넌트로 필요한 상태나 함수를 전달하기 위해 중간 컴포넌트가 불필요하게 props를 전달합니다.
- 어려운 상태 동기화: 여러 컴포넌트에서 동일한 상태를 관리할 때, 각 컴포넌트의 상태를 일일이 동기화하기가 복잡하고, 오류도 발생합니다.
- 코드 복잡도 증가: 상태 관리 로직이 여러 곳에 분산돼 가독성과 유지보수성이 떨어집니다.
이러한 문제를 해결하려면 전역 상태를 관리해야 하는데요. 이로써 애플리케이션, 상태를 중앙에서 관리해 컴포넌트 간에 데이터를 쉽게 공유하고, 상태를 편리하게 관리할 수 있습니다.
전역 상태 관리 도구: React의 Context API
React에서는 전역 상태를 관리하려면 어떤 도구를 사용해야 할까요? 대표적으로 Context API가 있는데요. React는 내장된 Context API로 전역 상태 관리를 지원합니다. Context API는 작은 애플리케이션에서 전역 상태를 관리할 때 유용하고, 사용하기가 간편하죠. 예를 들어, Context API로 다크 모드와 같은 테마 관련 전역 설정을 관리할 수 있습니다. 아래는 관련 예제입니다.
import React, { createContext, useContext, useState } from 'react';
const ThemeContext = createContext();
export const ThemeProvider = ({ children }) => {
const [theme, setTheme] = useState('light');
const toggleTheme = () => {
setTheme((prevTheme) => (prevTheme === 'light' ? 'dark' : 'light'));
};
return (
<ThemeContext.Provider value={{ theme, toggleTheme }}>
{children}
</ThemeContext.Provider>
);
};
export const useTheme = () => useContext(ThemeContext);
그러나 Context API에는 한계가 있습니다. 상태가 변경될 때마다 해당 Context를 사용하는 모든 컴포넌트가 리렌더링되는데요. 이에 애플리케이션 규모가 커지면 성능 문제가 발생합니다. Context API는 아주 간단한 전역 상태 관리에 적합하고요. 상태가 복잡하거나, 애플리케이션 규모가 클 때는 Redux나 Recoil 등 라이브러리를 사용하는 게 좋습니다.
전역 상태 관리 라이브러리
React에서는 전역 상태 관리 라이브러리로 Redux, Zustand, Jotai를 많이 사용하는데요. 이중 Redux와 Zustand의 특징과 장단점을 살펴보겠습니다.