zustand-mmkv-storage: React Native에서 Zustand를 위한 초고속 영속성

발행: (2025년 12월 30일 오전 08:06 GMT+9)
5 min read
원문: Dev.to

Source: Dev.to

왜 React Native에서 지속적인 상태가 필요할까요?

모바일 사용자는 앱이 자신을 “기억”해 주길 기대합니다:

  • 로그인 토큰은 계속 유효해야 함
  • 앱을 닫아도 장바구니가 비워지면 안 됨
  • 테마 설정(다크/라이트)은 유지되어야 함
  • 온보딩 흐름이 매번 다시 재생되지 않아야 함

지속성이 없으면 앱이 부실하게 느껴집니다. 좋은 지속성을 제공하면 네이티브하고 다듬어진 느낌을 줍니다.

옛날 왕: AsyncStorage

수년간 AsyncStorage가 기본 솔루션이었습니다. 간단하고 어디서든 동작하며 Zustand/Redux 같은 라이브러리와도 잘 통합됩니다.

하지만 심각한 단점이 있습니다:

  • 느림: 완전 JavaScript 기반, 직렬화된 브리지 호출
  • 비동기 전용: 읽기/쓰기마다 await가 필요해 UI가 차단될 수 있음
  • 기본적으로 암호화 미지원
  • React Native 코어 팀에 의해 폐기됨(커뮤니티 포크로 대체)

벤치마크에 따르면 MMKV는 실제 시나리오에서 AsyncStorage보다 30~100배 빠릅니다.

등장! MMKV: 현대의 챔피언

MMKV(Mobile Key‑Value)는 텐센트가 개발하고 현재는 Marc Rousavy가 유지보수하는 고성능 키‑값 저장소입니다.

주요 장점:

  • C++ 로 구현되고 JSI 바인딩 제공 → 번개처럼 빠름
  • 동기 읽기/쓰기(getawait 불필요)
  • 내장 암호화 지원
  • 멀티 프로세스 모드(앱 그룹/확장에 안전)
  • 작은 용량, Expo와 호환
  • 활발히 유지보수되며 대형 앱에서도 프로덕션 사용

요약하면: MMKV는 2025년에 있어야 할 AsyncStorage의 모습입니다.

Zustand + Persistence = 마법

Zustand는 현재 React Native에서 가장 인기 있는 가벼운 상태 관리 라이브러리입니다. persist 미들웨어를 사용하면 상태 저장이 아주 간단해지지만— 좋은 스토리지 백엔드가 있어야 합니다.

여기서 대부분의 사용자가 마주치는 문제는: MMKV를 직접 연결하면 코드가 장황하고 오류가 발생하기 쉬우며, 인스턴스 공유나 암호화를 깔끔하게 처리하지 못한다는 점입니다.

소개합니다 zustand-mmkv-storage

저는 바로 이 문제를 해결하기 위해 zustand-mmkv-storage 를 만들었습니다.

MMKV를 Zustand의 persist 미들웨어에 최소한의 보일러플레이트만으로 연결해 주는 작은 래퍼입니다:

import { create } from 'zustand';
import { persist, createJSONStorage } from 'zustand/middleware';
import { mmkvStorage } from 'zustand-mmkv-storage';

export const useBearStore = create(
  persist(
    (set) => ({
      bears: 0,
      addBear: () => set((state) => ({ bears: state.bears + 1 })),
    }),
    {
      name: 'bear-storage', // MMKV 안의 키
      storage: createJSONStorage(() => mmkvStorage),
    }
  )
);

이제 bears 카운트가 앱 재시작 후에도 빠르고 안정적으로 유지됩니다.

고급: 암호화 및 격리된 스토리지

import { createMMKVStorage } from 'zustand-mmkv-storage';

const secureStorage = createMMKVStorage({
  id: 'secure-vault',               // 별도 파일
  encryptionKey: 'my-secret-2025', // 암호화 활성화
});

export const useAuthStore = create(
  persist(
    (set) => ({
      token: '',
      setToken: (token) => set({ token }),
    }),
    {
      name: 'auth-storage',
      storage: createJSONStorage(() => secureStorage),
    }
  )
);

이제 인증 토큰이 디스크에 암호화되어 저장되고, 다른 데이터와 완전히 격리됩니다.

활용 사례

  • 인증 토큰 및 리프레시 토큰
  • 사용자 설정(테마, 언어)
  • 장바구니 / 오프라인 폼
  • 온보딩 완료 여부
  • 기능 플래그 / A‑B 테스트

오늘 바로 사용해 보세요!

npm i zustand-mmkv-storage

GitHubNPM

이 라이브러리가 시간을 절약하거나 앱을 더 빠르게 만든다면 GitHub에 ⭐️ 하나 부탁드립니다!

읽어 주셔서 감사합니다 — 빠르고 지속적인 상태 관리 즐기세요! 🐻✨

Back to Blog

관련 글

더 보기 »

ReactJS 디자인 패턴 ~State Machine Pattern~

개요: State Machine Pattern은 React 코드베이스를 읽기 쉽고, 유지보수가 용이하며, 생산성을 높게 유지하도록 돕습니다. 여러 개의 boolean 상태 변수를 뒤섞어 관리하는 대신, a...