Zustand와의 시너지, 함께 사용하기
제16화
발행일: 2025년 05월 23일
Jotai의 사용 사례들이 하나둘씩 명확해지면서, 개발자 커뮤니티의 디지털 광장에는 또 다른 흥미로운 질문이 조심스럽게 고개를 내밀기 시작했다. 이전의 ‘Jotai vs Zustand’, ‘Jotai vs Recoil’ 같은 대결 구도와는 사뭇 다른, 훨씬 더 건설적이고 실용적인 뉘앙스를 풍기는 질문이었다.
“혹시… Zustand랑 Jotai를 한 프로젝트에서 같이 써도 괜찮을까요?”
처음 이 질문이 GitHub 이슈 트래커에 올라왔을 때, 다이시 카토는 잠시 눈을 비볐다. 마치 전혀 다른 종류의 재료를 섞어 요리해도 되냐고 묻는 것 같은, 어딘가 생소하고 대담한 발상이었다.
상태 관리 라이브러리. 개발자들은 종종 하나의 프로젝트에는 단 하나의 ‘정답’만이 존재한다고 믿는 경향이 있었다. A를 선택하면 B는 버려야 하고, B를 쓰기로 했다면 A는 쳐다보지도 않는 것. 마치 종교 전쟁처럼, 자신이 선택한 기술 스택의 순수성을 지키려는 듯한 모습을 가지고 있다.
그런 분위기 속에서, 자신이 만든 두 개의 라이브러리를 ‘함께’ 사용해도 되냐는 질문은 어쩌면 금기(taboo)를 건드리는 것처럼 느껴질 수도 있었다.
‘같이… 쓴다고?’
카토는 잠시 생각에 잠겼다. 그의 머릿속에서는 두 라이브러리의 아키텍처와 철학이 빠르게 교차했다. 중앙 집중적인 하나의 큰 스토어(Zustand)와, 분산되고 독립적인 수많은 원자들의 집합(Jotai). 물과 기름처럼 전혀 다른 존재들이었다. 과연 이 둘이 한 공간에서 조화롭게 공존할 수 있을까? 기술적인 충돌은 없을까?
하지만 그는 곧 고개를 저었다. 기술적인 관점에서 볼 때, 두 라이브러리가 서로 직접적으로 충돌할 이유는 딱히 없어 보였다. 둘 다 React의 훅 시스템 위에서 작동하고, 상태를 컴포넌트 트리 외부에서 관리한다는 공통점도 있었다. 핵심적인 차이는 상태를 ‘어떻게 구조화하고 접근하느냐’에 있을 뿐이었다.
그렇다면, 질문의 핵심은 기술적 가능성이 아니라 ‘왜?’에 있었다. 굳이 두 개의 다른 상태 관리 방식을 한 프로젝트에 도입해야 할 이유가 있을까? 복잡성만 늘어나는 것은 아닐까?
카토는 질문을 올린 개발자가 덧붙인 사용 시나리오를 자세히 읽어보았다.
“저희 프로젝트는 사용자 인증 상태, 전역적인 테마 설정, 언어 설정처럼 앱 전체에서 공유되고 예측 가능한 상태들이 있습니다. 이런 것들은 Zustand의 단순한 스토어로 관리하는 것이 매우 편리했습니다. 하지만 최근 추가된 실시간 협업 편집기 기능은 내부 상태가 너무 복잡하고, 각 편집 도구의 상태가 독립적으로 관리되어야 할 필요성이 커졌습니다. 이 부분만 Jotai의 아토믹 모델을 적용하면 훨씬 효율적일 것 같은데, 괜찮을까요?”
순간, 카토의 머릿속에 불이 켜졌다. 마치 서로 다른 용도에 맞게 설계된 도구들을 적재적소에 사용하는 장인의 모습이 떠올랐다.
“그래… 이거였어!”
그는 무릎을 쳤다. 왜 하나의 도구만 고집해야 하는가? 문제의 성격에 따라 가장 적합한 도구를 선택하여 조합하는 것. 그것이야말로 진정한 실용주의가 아닌가!
애플리케이션 전체에 걸쳐 안정적으로 유지되어야 하는 전역 상태(Global State)는 Zustand의 예측 가능하고 관리하기 쉬운 중앙 스토어가 안성맞춤일 수 있다. 마치 도시 전체에 전력을 공급하는 안정적인 중앙 발전소처럼 말이다.
반면, 특정 페이지나 복잡한 컴포넌트 내부에서만 사용되고, 서로 간의 의존성이 높거나 동적으로 변화하는 지역적이고 복잡한 상태(Local/Feature State)는 Jotai의 아토믹 모델이 빛을 발할 수 있다. 각 가정이 필요에 따라 설치하는 독립적인 태양광 패널처럼, 유연하고 효율적으로 에너지를 관리하는 것이다!
“이건… 혼란이 아니라, 오히려 현명한 접근일 수 있겠는데?”
Zustand의 단순함과 Jotai의 유연함. 두 라이브러리의 장점만을 취사선택하여 활용하는 하이브리드 접근 방식. 이것은 단순히 두 라이브러리를 ‘섞어 쓰는’ 것을 넘어, 상태 관리 문제를 더욱 정교하고 효율적으로 해결할 수 있는 새로운 가능성을 열어주는 발상이었다.
카토는 흥분을 감추지 못했다. 그는 즉시 해당 이슈에 긍정적인 답변을 달았다.
“매우 흥미롭고 타당한 접근 방식이라고 생각합니다! 기술적으로 두 라이브러리는 함께 사용 가능하며, 말씀하신 것처럼 각자의 장점을 살려 적용한다면 매우 효과적일 수 있습니다. 오히려 권장할 만한 패턴일 수도 있겠네요.”
그는 더 나아가, 두 라이브러리가 자연스럽게 공존할 수 있도록 돕는 간단한 가이드라인이나 유틸리티 함수를 만들어 제공하는 것도 고려해봐야겠다고 생각했다. 예를 들어, Zustand 스토어의 상태를 읽어오는 Jotai 아톰을 만든다거나 하는 식으로, 두 세계를 부드럽게 연결하는 다리를 놓는 것이다.
“최고의 도구를 조합하여 사용하는 것… 그게 실용적인 접근이지.”
‘함께 사용해도 되나요?’라는 커뮤니티의 질문은, Zustand와 Jotai의 관계를 새로운 시각으로 바라보게 하는 중요한 전환점이 되었다. 경쟁이나 대체가 아닌, 시너지와 공존의 가능성을 사람들이 바라보기 시작했다.
이 깨달음은 카토에게 더 넓은 시야를 열어주었다. 상태 관리의 세계에는 단 하나의 정답만 있는 것이 아니었다. 다양한 도구들이 각자의 역할을 수행하며 조화롭게 공존하는 풍성한 생태계. 그것이야말로 그가 궁극적으로 지향해야 할 모습일지도 몰랐다. 그리고 이 열린 사고방식은, 곧이어 불어닥칠 커뮤니티 기여의 물결을 더욱 활짝 받아들일 준비를 하게 만들었다.