Q2-1
왜 Recoil에서 Jotai로 마이그레이션했나요? Redux나 Zustand가 아니라 Jotai를 고른 이유는요?
핵심 포인트
- Recoil 마이그레이션 동기: 메인테이너 공식 지원 위축 + 번들 사이즈 부담 + atom key 충돌 리스크
- 다른 후보(Zustand, Redux Toolkit, Valtio)와 비교했지만 기존 atom 모델을 그대로 옮길 수 있다는 점에서 Jotai 선택
- 비대한 라이브 코드베이스(라이브 서비스)를 한 번에 못 갈아엎는 제약이 의사결정의 핵심
- "atom → atom" 1:1 매핑이 가능해서 마이그레이션 비용이 가장 작은 선택지
모범 답안먼저 답해보고 펼치기
세 가지 동기가 있었어요. 첫째, Recoil의 메인테이너 지원이 위축되고 있다는 시그널이 명확했습니다. 메인 메인테이너(Meta) 분의 활동이 줄었고 이슈 응답이 느려졌어요. 라이브 서비스의 핵심 인프라를 그런 라이브러리에 두는 건 리스크였어요. 둘째, 번들 사이즈 부담. Recoil은 트리쉐이킹이 잘 안 돼서 번들에 통째로 들어가곤 했어요. 셋째, atom key가 전역 문자열이라 매크로 단위 모듈 분리가 늘어날수록 충돌 위험이 누적됐습니다.
대안을 셋 비교했어요. Zustand는 가볍지만 사고 모델이 store 단위라 atom 단위로 잘게 쪼갠 코드를 옮기는 비용이 컸고, Redux Toolkit은 보일러플레이트 + immer 사고가 따라와서 전환이 너무 큰 충격이었어요. Jotai는 atom 모델 자체가 Recoil과 거의 동일하고, atom이 객체 참조라서 key 문자열 자체가 사라지는 등 Recoil의 약점만 깔끔하게 보완하는 선택지였습니다. 결국 마이그레이션 비용이 가장 작고 효과가 가장 큰 선택지여서 Jotai로 결정했어요.
이 답변, 어땠나요?
꼬리 질문
- Q-a. Recoil이 정말 사망했다고 보세요?
2024년에 메인 메인테이너의 Meta 퇴사 이후 사실상 unmaintained 상태가 됐다고 알려졌어요. 라이브 서비스에서는 그 정도 시그널이면 탈출 결정의 충분 조건이라고 봤습니다.
- Q-b. React 19의 use() 와 Server Components 흐름에서 클라 상태 관리는 줄어들지 않을까요?
서버 데이터는 React Query나 RSC가 가져가는 흐름은 맞지만, 본 프로젝트는 3D 에디터처럼 클라이언트가 풍부한 상태를 들고 있어야 하는 도메인이라 atom 단위 클라 상태가 여전히 필요했습니다. 도메인 특성에 따른 선택이었어요.
- Q-c. Jotai의 단점은요?
devtools 생태계가 Redux보다 빈약하고, atom 디펜던시 그래프가 복잡해지면 디버깅이 어렵습니다. 이를 보완하기 위해 atom 작명 규칙과 의존 그래프 docstring을 컨벤션으로 강제했어요.
CS · 이론
- 상태 관리 라이브러리의 4가지 모델
- Flux/Redux: 단일 store + reducer
- Atomic (Recoil/Jotai): 작은 atom 단위 분산
- Proxy (Valtio/MobX): mutable 처럼 쓰지만 내부에서 추적
- External store hook (Zustand): 함수형 store + 구독 훅
- Tree-shaking 적합성: 모듈 시스템 + side-effect-free 빌드. 라이브러리의
sideEffects: false명시 여부 중요 - 번들 사이즈 측정: Bundlephobia, source-map-explorer, webpack-bundle-analyzer
- Maintainership risk: OSS 채택 시 기여자 활동도, 릴리스 주기, 이슈 응답 시간을 의사결정 근거로 삼는 문화