왜 Recoil을 떠나 Zustand를 선택했는가?
date
Jun 29, 2025
slug
from-recoil-to-zustand
author
status
Public
tags
React
펑타이그레이터차이나
summary
Recoil은 React 친화적인 상태 관리 라이브러리지만, 프로젝트가 커질수록 구조화의 어려움과 React 외부 상태 접근의 제약이 분명해졌습니다. 이 글에서는 Recoil을 사용하던 개발자가 Zustand로 옮겨간 배경과, Zustand를 선택한 결정적 이유들을 설명합니다.
type
Post
thumbnail
category
💻 Frontend
updatedAt
Jan 4, 2026 08:58 AM
Recoil에서 느낀 장점과 한계
Recoil은 atom과 selector 기반의 단순하고 강력한 구조 덕분에 처음 배우고 사용하기는 매우 쉬웠습니다. 상태 간의 의존성과 파생 상태를 선언적으로 정의할 수 있었고, Suspense와도 잘 연동되었습니다.
그러나 프로젝트가 커지고 상태가 많아질수록 다음과 같은 문제들이 생기기 시작했습니다:
- 상태가 너무 분산되어 있어 전체 흐름을 파악하기 어려웠습니다.
- 여러 atom들이 얽혀 있는 구조에서 디버깅과 추적이 힘들었습니다.
결정적으로 Recoil의 지원이 중단되면서 새로운 상태 관리 라이브러리를 찾아야했습니다.
⚖️ 대안 탐색: Jotai vs Zustand
이 과정에서 Jotai와 Zustand를 비교하게 되었습니다.
항목 | Zustand | Jotai |
철학 | 중앙 집중 (Flux) | 분산형 (Atomic) |
상태 구조 | 단일 스토어 기반 | atom 기반 개별 상태 |
리렌더링 제어 | 선택자 기반 최적화 | atom 단위 구독 |
React 외부 사용 | 가능 (store 자체 사용) | 불가능 (기본은 내부 atom) |
코드 구조 | store 모듈 분리 용이 | atom이 많아질수록 복잡해짐 |
사용 사례 | 전역 상태, 비동기, WebSocket 등 | 컴포넌트 단위 상태, 계산된 값 |
Jotai는 Recoil과 비슷한 구조를 가져서 쉽게 적응할 수 있었지만,
Zustand는 다음과 같은 장점들로 인해 “이건 내가 원하던 상태 관리다”라는 확신을 주었습니다.
내가 Zustand를 선택한 이유
1. React 밖에서도 상태 사용 가능
Zustand의 상태는 React 훅 내부가 아니라 바깥에서 관리됩니다. 이 말은 곧, React 컴포넌트가 아닌 서비스 모듈이나 유틸 함수 등에서도 상태에 접근하거나 수정할 수 있다는 의미입니다.
import { useMyStore } from './store' // React 컴포넌트 외부에서도 접근 가능 const currentUser = useMyStore.getState().user
2. 모듈화된 상태 관리 (Slice Pattern)
상태가 많아져도 Slice 패턴으로 스토어를 기능 단위로 나눌 수 있습니다.
export const useStore = create((...a) => ({ ...createUserSlice(...a), ...createCartSlice(...a), }))
- 기능 단위로 상태와 로직을 분리하고, 유지보수가 편해졌습니다.
- 이 구조는 Redux Toolkit의
slice와도 비슷하지만, 보일러플레이트 없이도 가능하다는 것이 매력입니다.
3. 비동기 처리와 외부 요청을 스토어에서 직접 관리 가능
Zustand는 axios, WebSocket, setTimeout 등의 로직을 store에 자유롭게 정의할 수 있습니다.
fetchUser: async () => { const res = await axios.get("/user") set({ user: res.data }) }
4. 불필요한 리렌더링 최소화
Zustand는 selector 기반 구독 최적화 덕분에, 상태 변경 시 관련 컴포넌트만 리렌더링되도록 설정할 수 있습니다.
const userName = useStore((state) => state.user.name)
- 이 selector 방식은 Jotai보다 리렌더링을 더 직관적이고 명시적으로 컨트롤할 수 있습니다.
결론
Recoil은 React 친화적이고 좋은 상태 관리 도구였지만, 복잡한 상태 구조와 전역 사용성에 한계를 느꼈고,Zustand는 그 간결함, 유연함, store 설계의 자유로움 덕분에 차세대 상태 관리 도구로 손색이 없었습니다.