[maple-helper - 10] 메이플 헬퍼 전역 상태 관리 zustand 선택 이유

zustanduseContextstate-managementpersistlocalStorage

기존 메이플 헬퍼 서비스에서는 React에서 기본으로 제공하는 useContext를 활용해 전역 상태를 관리했다. 하지만 프로젝트가 진행될수록 문제가 생겼는데 useContext만으로 복잡한 로직들을 처리하려다 보니 코드를 작성하는 데 시간이 너무 오래 걸렸고, 흩어진 상태와 로직을 유지보수하기도 점점 어려워졌다.

결국 전역 상태 관리 전용 라이브러리의 필요성을 체감하고 서비스에 새롭게 도입하기로 결정했다.

라이브러리 후보군과 도입 배경

도입을 위해 고려했던 전역 상태 관리 라이브러리는 크게 4가지였다.

  • Redux
  • Recoil
  • Zustand
  • Jotai

이 중에서 최종적으로 Zustand를 선택했다. 단순히 요즘 개발 생태계에서 핫한 기술이기 때문만은 아니다. 내 판단 기준과 근거는 다음과 같았다.

1. 가벼운 무게와 압도적인 단순함

Zustand를 논할 때 가장 많이 언급되는 특징은 단연코 '가볍다'는 것이다. 실제로 Zustand의 내부 소스코드를 열어보면 몇 줄 되지 않을 정도로 굉장히 간결하게 구성된 것을 볼 수 있다.

이러한 단순함은 곧 보일러플레이트 코드의 감소로 이어진다. useContext를 사용할 때 겪었던 복잡한 프로바이더(Provider) 설정이나 길어지는 구현 시간을 획기적으로 단축할 수 있었다. 무거운 기능이 모두 필요한 것이 아니었기에, 직관적이고 가벼운 Zustand가 적합하다고 판단했다.

2. 활발한 메인터넌스 (버전 관리)

어떤 라이브러리를 프로젝트에 의존성으로 추가할지 결정할 때, 해당 오픈소스가 얼마나 꾸준히 관리되는지는 매우 중요한 트레이드오프 요소라고 생각한다.

일부 라이브러리들과 다르게 Zustand는 메인터넌스가 아주 원활하게 이루어지고 있다. 라이브러리 도입을 고민하고 결정하던 시점 기준으로 불과 2주 전에도 새로운 버전이 릴리즈되었을 정도다. 문제가 생겼을 때 빠르게 피드백을 받고 대응할 수 있는 생태계라는 점에서 높은 점수를 주었다.

마무리

결과적으로 useContext가 가진 관리의 어려움과 복잡성을 Zustand의 가볍고 직관적인 장점으로 무사히 대체할 수 있었다. 상태 관리에 소모되던 리소스를 줄이면서 서비스의 핵심 비즈니스 로직에 더 집중할 수 있게 되었다.