0Pricing
React Academy · 강의

Zustand DevTools와 스토어 테스트

devtools 미들웨어로 Redux DevTools에 연결하고 스토어 동작을 직접 단위 테스트합니다.

Zustand DevTools와 스토어 테스트은(는) CoddyKit의 무료 React Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 React Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. React Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

환영합니다

이 레슨에서는 Zustand store를 시간 여행 디버깅을 위한 Redux DevTools에 연결하고 store 동작에 대한 단위 테스트를 직접 작성합니다.

devtools 미들웨어

store를 devtools 미들웨어로 감싸 Redux DevTools 브라우저 확장 프로그램에 연결합니다. 그러면 DevTools 타임라인에서 모든 동작과 상태 변경을 검사할 수 있습니다.
import { create } from 'zustand';
import { devtools } from 'zustand/middleware';

const useStore = create(
  devtools(
    (set) => ({
      count: 0,
      increment: () => set(s => ({ count: s.count + 1 }), false, 'increment'),
    }),
    { name: 'CounterStore' }
  )
);

DevTools의 이름 있는 동작

devtools를 사용할 때 set()의 세 번째 인수로 동작 이름을 전달합니다. 이 레이블은 DevTools 타임라인에 표시되어 무엇이 변경되었는지 쉽게 추적할 수 있습니다.
set(s => ({ count: s.count + 1 }), false, 'counter/increment');
// Appears as 'counter/increment' in Redux DevTools

persist와 devtools 조합하기

여러 미들웨어를 연결합니다. 저장소에서 다시 하이드레이션될 때 발생하는 변경을 포함한 모든 상태 변경을 확인하려면 persist 안에 devtools를 감쌉니다.
const useStore = create(
  devtools(
    persist(
      (set) => ({ /* ... */ }),
      { name: 'my-store' }
    ),
    { name: 'MyStore' }
  )
);

Zustand store 테스트하기

Zustand store는 일반 JavaScript입니다. React 컴포넌트를 렌더링하지 않고도 직접 테스트할 수 있습니다. store를 가져온 다음 테스트에서 getState()와 setState()를 호출합니다.
import { useCounterStore } from './store';

beforeEach(() => useCounterStore.setState({ count: 0 }));

test('increment increases count', () => {
  useCounterStore.getState().increment();
  expect(useCounterStore.getState().count).toBe(1);
});

테스트 사이에 상태 초기화하기

beforeEach에서 초기 값과 함께 setState를 호출하여 테스트 사이에 store를 초기화합니다. 이렇게 하면 테스트 사례 간에 상태가 누출되는 것을 방지할 수 있습니다.
const initialState = { count: 0, user: null };

beforeEach(() => {
  useMyStore.setState(initialState);
});

컴포넌트 테스트에서 store 모의하기

컴포넌트 테스트에서는 store 훅이 제어된 값을 반환하도록 mock합니다. 실제 store 로직 없이도 서로 다른 store 상태에서 컴포넌트가 어떻게 렌더링되는지 테스트할 수 있습니다.
vi.mock('./useCounterStore', () => ({
  useCounterStore: vi.fn(() => ({ count: 5, increment: vi.fn() })),
}));

비동기 동작 테스트하기

테스트에서 `fetch`를 mock하고 getState()를 통해 비동기 동작을 호출합니다. await로 비동기 작업이 완료되기를 기다린 다음 업데이트된 상태를 검증합니다.
global.fetch = vi.fn().mockResolvedValue({
  json: () => Promise.resolve({ id: 1, name: 'Alice' }),
});

await useUserStore.getState().fetchUser(1);
expect(useUserStore.getState().user.name).toBe('Alice');

프로덕션 DevTools 보호

미들웨어를 조건부로 적용하여 프로덕션에서는 devtools를 비활성화합니다. 이렇게 하면 사용자에게 store 구조가 노출되는 것을 방지할 수 있습니다.
const isDev = process.env.NODE_ENV === 'development';

const useStore = create(
  isDev ? devtools(storeCreator, { name: 'App' }) : storeCreator
);

로깅 미들웨어

사용자 지정 로깅 미들웨어를 작성하여 모든 상태 변경을 콘솔에 기록할 수 있습니다. 브라우저 확장 프로그램을 설치할 수 없을 때 유용합니다.
const log = (fn) => (set, get, api) => fn(
  (args, replace, name) => {
    console.log('action', name, args);
    set(args, replace, name);
  }, get, api
);

간단한 확인

테스트 사이에 Zustand store를 초기 상태로 되돌리려면 어떻게 해야 하나요?

복습

devtools 미들웨어를 추가하고 동작에 이름을 지정하여 읽기 쉬운 DevTools 타임라인을 만듭니다. 컴포넌트를 렌더링하지 않고 getState()/setState()로 store를 직접 테스트합니다. 테스트를 격리하려면 beforeEach에서 상태를 초기화합니다.

과정 완료

축하합니다! **Zustand로 상태 관리하기**를 완료하셨습니다. 이제 store를 만들고, 선택자를 사용하고, 상태를 저장하며, DevTools로 디버깅하고, store 로직에 대한 단위 테스트를 작성할 수 있습니다.

자주 묻는 질문

“Zustand DevTools와 스토어 테스트” 강의는 무료인가요?

네 — “Zustand DevTools와 스토어 테스트” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 React Academy 강의 전체를 잠금 해제할 수 있습니다. React Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“Zustand DevTools와 스토어 테스트”에서 뭘 배우나요?

devtools 미들웨어로 Redux DevTools에 연결하고 스토어 동작을 직접 단위 테스트합니다. 브라우저에서 직접 실행하는 실습 코드로 React Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

React Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 React Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“Zustand DevTools와 스토어 테스트” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 React Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 React Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 첫 Zustand 스토어 만들기
  2. 선택기와 불필요한 다시 렌더링 방지
  3. Persist 미들웨어로 상태 유지하기
  4. Zustand DevTools와 스토어 테스트
← React Academy(으)로 돌아가기