๐Ÿ›ก๏ธ 04. Zustand์™€ TypeScript: "ํƒ€์ž… ์ถ”๋ก ์ด ์™œ ์ž๊พธ ๊นจ์ง€์ฃ ?"

๐Ÿ“‹ ๊ฐœ์š”

Zustand ์‚ฌ์šฉ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ํƒ€์ž… ์ถ”๋ก  ์—๋Ÿฌ ํ•ด๊ฒฐ ๋ฐ StateCreator๋ฅผ ์ด์šฉํ•œ ์Šฌ๋ผ์ด์Šค ํƒ€์ดํ•‘ ์™„๋ฒฝ ๊ฐ€์ด๋“œ

๐ŸŽฏ ์ด ์„น์…˜์„ ์ฝ๊ณ  ๋‚˜๋ฉด:

  • Zustand create ํ•จ์ˆ˜์˜ ์ปค๋ง(Currying) ๋ฌธ๋ฒ• ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ •ํ™•ํ•œ ์œ„์น˜์— ํƒ€์ž…์„ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฏธ๋“ค์›จ์–ด(DevTools, Persist ๋“ฑ) ์ ์šฉ ์‹œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์™œ ๊ณ ์žฅ ๋‚˜๋Š”์ง€ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•˜๊ณ  ํ”ฝ์Šคํ•  ์ˆ˜ ์žˆ๋‹ค.
  • StateCreator ํƒ€์ž…์„ ํ™œ์šฉํ•ด ์ชผ๊ฐœ์ง„ ์Šฌ๋ผ์ด์Šค(Slice) ์Šคํ† ์–ด์— ์™„๋ฒฝํ•œ ํƒ€์ž… ์ฒด๊ณ„๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“‹ ๋ชฉ์ฐจ


๐Ÿ“Œ ์ด ๋ฌธ์„œ๋ฅผ ์ฝ๊ธฐ ์ „์—

โฑ๏ธ ์˜ˆ์ƒ ์ฝ๊ธฐ ์‹œ๊ฐ„: 12๋ถ„ / ํ•ต์‹ฌ ํŒŒํŠธ: 7๋ถ„

๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ํ๋ฆ„
create ํ•จ์ˆ˜ ๊ธฐ๋ณธ ํƒ€์ž… ์ฃผ์ž…(Currying) โ†’ ๋ฏธ๋“ค์›จ์–ด ์ ์šฉ ์‹œ ํƒ€์ž… ์ด์Šˆ ํ•ด๊ฒฐ โ†’ StateCreator๋ฅผ ์ด์šฉํ•œ ์กฐ๋ฆฝ์‹ Slice ํƒ€์ž… ์ง€์ •

๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ๋ฐฐ๊ฒฝ ์„ธ๊ณ„๊ด€: '์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ'

  • ๐Ÿฃ ์˜์ฒ  ( ์‹ ์ž… ): "๋ฆฌ๋“œ ๋‹˜! ์–ด์ œ ์•Œ๋ ค์ฃผ์‹  ๋Œ€๋กœ Zustand๋ฅผ ๋„์ž…ํ–ˆ๋Š”๋ฐ ๋นจ๊ฐ„ ์ค„์ด ๋„ˆ๋ฌด ๊ทธ์–ด์ ธ์š”. set(state => ...) ํ•  ๋•Œ state๊ฐ€ ์ž๊พธ any ํƒ€์ž…์ด๋ผ๊ณ  ์—๋Ÿฌ๋ฅผ ๋ฑ‰์–ด์„œ, ์ผ๋‹จ ๊ท€์ฐฎ์•„์„œ // @ts-ignore ๋–ก์น ํ•ด๋‘๊ณ  ํ‡ด๊ทผํ–ˆ์Šต๋‹ˆ๋‹ค ํ•˜ํ•˜!"
  • ๐Ÿฆ ์˜ํ˜ธ ( ๋ฆฌ๋“œ ): "์˜์ฒ  ๋‹˜... ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ any๋Š” ๋งˆ์•ฝ๊ณผ๋„ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹น์žฅ์€ ํŽธํ•˜์ง€๋งŒ ๋‚˜์ค‘์— ์œ ์ง€๋ณด์ˆ˜ ํ•  ๋•Œ ๋‚ด ์ฝ”๋“œ๊ฐ€ ๋‚˜๋ฅผ ์ฐŒ๋ฅด๋Š” ์นผ์ด ๋ผ์š”. Zustand๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํƒ€์ž… ์ œ๋„ค๋ฆญ ๊ตฌ์กฐ๋งŒ ํ•œ ๋ฒˆ ๋”ฑ ์ดํ•ดํ•˜๋ฉด, ์ž๋™ ์™„์„ฑ(IntelliSense)์˜ ํ™ฉํ™€ํ•จ์„ ๋ง›๋ณด๊ฒŒ ๋  ๊ฒ๋‹ˆ๋‹ค. ๋นจ๊ฐ„ ์ค„ ์ง€์šฐ๋Ÿฌ ๊ฐ€๋ด…์‹œ๋‹ค."

๐Ÿค” ์™œ ์•Œ์•„์•ผ ํ•˜๋Š”๊ฐ€

Zustand๋Š” ์›๋ž˜ ์ƒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(Vanilla JS)๋ฅผ ์œ„ํ•ด ์•„์ฃผ ๊ฐ€๋ณ๊ฒŒ ๋””์ž์ธ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜€์Šต๋‹ˆ๋‹ค. TypeScript๋ฅผ ์ง€์›ํ•˜๊ธด ํ•˜์ง€๋งŒ, ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” create ํ•จ์ˆ˜์˜ ๋…ํŠนํ•œ ๊ตฌ์กฐ์™€ ์—ฌ๋Ÿฌ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๊ฒน๊ฒน์ด ๊ฐ์‹ธ๋Š”(Wrapping) ํŠน์„ฑ ๋•Œ๋ฌธ์— ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ํ•œ ๋ฒˆ์— ๋ชจ๋“  ํƒ€์ž…์„ ์ถ”๋ก ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ณ‘๋ชฉ ๊ตฌ๊ฐ„์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

1๋…„ ์ฐจ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ€์žฅ ๋งŽ์ด ๊ฒช๋Š” Zustand์˜ ์ขŒ์ ˆ ๊ตฌ๊ฐ„์ด ๋ฐ”๋กœ "๋ฏธ๋“ค์›จ์–ด ํ•˜๋‚˜ ์ถ”๊ฐ€ํ–ˆ๋”๋‹ˆ ์Šคํ† ์–ด ์ „์ฒด ํƒ€์ž…์ด ๋นจ๊ฐ„ ๋ถˆ๋กœ ํ„ฐ์ ธ๋ฒ„๋ฆฌ๋Š” ํ˜„์ƒ" ์ž…๋‹ˆ๋‹ค. ์ด ๊ณ ๋น„๋งŒ ๋„˜๊ธฐ๋ฉด 5๋…„ ์ฐจ ๊ฐœ๋ฐœ์ž์ฒ˜๋Ÿผ ๋นˆํ‹ˆ์—†๋Š” ์ธํ”„๋ผ ์ฝ”๋“œ์™€ ํ™˜์ƒ์ ์ธ ์ž๋™ ์™„์„ฑ ๊ฒฝํ—˜์„ ๋™๋ฃŒ๋“ค์—๊ฒŒ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ—๏ธ 1. ์˜์ฒ ์ด์˜ ๋งˆ๋ฒ•์˜ (์˜ค๋‹ต) ์ฝ”๋“œ

โŒ ์ œ๋„ค๋ฆญ ์ง์ ‘ ์ฃผ์ž… ์‹คํŒจ (์˜ค๋‹ต)

interface MyStore {
  count: number;
  increment: () => void;
}
 
// ๐Ÿฃ ์˜์ฒ : "์ œ๋„ค๋ฆญ ๋ฐฐ์› ๋‹ค! create ๋’ค์— ๋ถ™์ด๋ฉด ๋˜๊ฒ ์ง€?"
const useStore = create<MyStore>((set) => ({
  count: 0,
  // ๐Ÿšจ ์—๋Ÿฌ ๋ฐœ์ƒ! set ํƒ€์ž…์ด ๊ณ ์žฅ ๋‚˜๋ฉด์„œ state๊ฐ€ unknown ๋˜๋Š” any๋กœ ๋น ์ง
  increment: () => set((state) => ({ count: state.count + 1 })), 
}));

Zustand์˜ ํƒ€์ž… ์„ ์–ธ๋ถ€๋ฅผ ๋œฏ์–ด๋ณด๋ฉด, create ํ•จ์ˆ˜๋Š” ๋ฏธ๋“ค์›จ์–ด ์ฒด์ด๋‹์„ ์œ„ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ์ปค๋ง(Currying) ์ด๋ผ๋Š” ๊ตฌ์กฐ๋กœ ์งœ์—ฌ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋˜ ๋‹ค๋ฅธ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š” ํ˜•ํƒœ์ฃ . ์ œ๋„ค๋ฆญ์„ ๊ทธ๋ƒฅ <MyStore> ํ•˜๋‚˜๋งŒ ๋˜์ง€๋ฉด ํƒ€์ž… ๊ฒ€์‚ฌ๊ธฐ๊ฐ€ ๊ธธ์„ ์žƒ์Šต๋‹ˆ๋‹ค.

โœ… ์ปค๋ง ํŒจํ„ด: ๊ด„ํ˜ธ๋ฅผ ๋‘ ๋ฒˆ ์น˜์„ธ์š” (์ •๋‹ต)

// ๐Ÿฆ ์˜ํ˜ธ: "create<Type>()() <- ์ด๋ ‡๊ฒŒ ๋นˆ ๊ด„ํ˜ธ๋ฅผ ๋จผ์ € ํ˜ธ์ถœํ•œ ๋’ค์— ํ•จ์ˆ˜๋ฅผ ์—ฌ์„ธ์š”."
const useStore = create<MyStore>()((set) => ({
  count: 0,
  // ๐Ÿ’ก ์™„๋ฒฝํ•˜๊ฒŒ ์ถ”๋ก ๋จ! ์ด์ œ ๋งˆ์šฐ์Šค ์˜ฌ๋ฆฌ๋ฉด state.count ๊ฐ€ number๋กœ ์ธ์‹!
  increment: () => set((state) => ({ count: state.count + 1 })),
}));

์ด ํ…… ๋นˆ ()๊ฐ€ Zustand ํƒ€์ดํ•‘์˜ ๊ฐ€์žฅ ํฐ ์ง„์ž… ์žฅ๋ฒฝ์ด์ž ํ•ต์‹ฌ ์—ด์‡ ์ž…๋‹ˆ๋‹ค. ์ด ๋นˆ ๊ด„ํ˜ธ๊ฐ€ ์ œ๋„ค๋ฆญ ํƒ€์ž…์˜ ์Šค์ฝ”ํ”„๋ฅผ ๋‹ซ์•„์ฃผ๊ณ , ๋’ค์ด์–ด ์˜ค๋Š” ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์— ์˜จ์ „ํ•œ ํƒ€์ž…์„ ๋ฌผ๋ ค์ค๋‹ˆ๋‹ค.


๐Ÿ’Ž 2. ํ†ต๊ณก์˜ ๋ฒฝ: ๋ฏธ๋“ค์›จ์–ด ํŒŒํ‹ฐ์™€ ํƒ€์ž… ์ง€์˜ฅ

์˜์ฒ ์ด๊ฐ€ ์•ฑ์„ ๋Ÿฐ์นญํ•˜๊ณ  ๋‚˜์„œ ์ƒํƒœ ์ถ”์ ์„ ์œ„ํ•ด devtools๋ฅผ, ์ƒˆ๋กœ๊ณ ์นจ ๋ฐฑ์—…์„ ์œ„ํ•ด persist ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๋•์ง€๋•์ง€ ๋ถ™์ด๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

โŒ ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด์„œ ํ„ฐ์ง€๋Š” ์ฝ”๋“œ

import { devtools, persist } from 'zustand/middleware';
 
// ๐Ÿฃ ์˜์ฒ : "๋ฏธ๋“ค์›จ์–ด๋กœ ์Šคํ† ์–ด ๊ฐ์ŒŒ๋”๋‹ˆ ์•„๊นŒ ๊ธฐ๊ป ๋งž์ถ˜ ํƒ€์ž…์ด ๋˜ ๋‹ค ๋ฐ•์‚ด ๋‚ฌ์–ด์š” ใ… ใ… "
const useStore = create<MyStore>()(
  devtools(
    persist(
      (set) => ({
        count: 0,
        increment: () => set((state) => ({ count: state.count + 1 })),
      }),
      { name: 'my-storage' }
    )
  )
);

์—๋Ÿฌ๊ฐ€ ํ„ฐ์ง€๋Š” ์ด์œ ๋Š” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ๋“ค์›จ์–ด ๋ฐ•์Šค ํ•˜๋‚˜๋ฅผ ํฌ์žฅํ•  ๋•Œ๋งˆ๋‹ค Zustand ๋‚ด๋ถ€์ ์œผ๋กœ ์š”๊ตฌํ•˜๋Š” Mutators (๋ณ€ํ˜•๊ธฐ) ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ 5๋…„ ์ฐจ๋“ค์€ ๋‹นํ™ฉํ•˜์ง€ ์•Š๊ณ  ๋งˆ๋ฒ•์˜ ๋นˆ ๊ด„ํ˜ธ ๊ทœ์น™๋งŒ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค. "์ œ๋„ค๋ฆญ์€ ๋งจ ์ฒ˜์Œ ๋”ฑ ํ•œ ๋ฒˆ๋งŒ ์ •์˜ํ•œ๋‹ค" ๋Š” ์›์น™ ๋ง์ด์ฃ .

์œ„ ์ฝ”๋“œ๋Š” ์‚ฌ์‹ค ๋ฌธ๋ฒ•์ ์œผ๋ก  ํ‹€๋ฆฐ ๊ฒŒ ์—†์ง€๋งŒ, TypeScript 4.x/5.x ํ™˜๊ฒฝ์—์„œ ๊ฐ€๋” set ํŒŒ๋ผ๋ฏธํ„ฐ๋‹จ์—์„œ ์—๋Ÿฌ๋กœ ์‹๋ณ„๋  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ( Zustand ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. )
์ด๋Ÿด ๋•Œ ๊ฐ€์žฅ ์šฐ์•„ํ•˜๊ณ  ํ™•์‹คํ•˜๊ฒŒ ํƒ€์ž… ์—๋Ÿฌ๋ฅผ ๋ฌด๋ ฅํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ฐ”๋กœ StateCreator ๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๐Ÿงฉ 3. 5๋…„ ์ฐจ์˜ ๋น„๊ธฐ: StateCreator ๋กœ ์Šฌ๋ผ์ด์Šค ์กฐ๋ฆฝํ•˜๊ธฐ

์ด์ „ ๊ฐ€์ด๋“œ 03. ์Šฌ๋ผ์ด์Šค ํŒจํ„ด ์—์„œ ๋šฑ๋šฑํ•œ ์Šคํ† ์–ด๋ฅผ ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ถ„๋ฆฌํ–ˆ๋˜ ๊ฒƒ ๊ธฐ์–ต๋‚˜์‹œ๋‚˜์š”?
์‹ค๋ฌด์—์„œ๋Š” Zustand ํƒ€์ž…์„ ์„ค๊ณ„ํ•  ๋•Œ, ์ƒ์„ฑ ๋‹จ๊ณ„๋ฅผ ๋‘ ๊ฐœ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค.

  1. ์„ค๊ณ„๋„ ๊ทธ๋ฆฌ๊ธฐ (StateCreator): ์˜ค์ง ํƒ€์ž…๊ณผ ์ดˆ๊ธฐ ๊ตฌ์กฐ๋งŒ ์ •์˜
  2. ์กฐ๋ฆฝํ•˜๊ธฐ (create): ์—ฌ๋Ÿฌ ๋ฏธ๋“ค์›จ์–ด ํ•„๋“œ๋ฅผ ๋ฒ„๋ฌด๋ ค์„œ ์ตœ์ข… ์Šน์ธ

โœ… StateCreator ๋ชจ๋“ˆํ™” ๋ณ‘๋ฒ• (์ตœ์ข… ์ •๋‹ต ์ฝ”๋“œ)

import { create, StateCreator } from 'zustand';
import { devtools, persist } from 'zustand/middleware';
 
// 1. ํƒ€์ž… ๋ช…์„ธ์„œ
interface AuthSlice {
  isLogged: boolean;
  login: () => void;
}
 
// 2. ๐Ÿฆ ์˜ํ˜ธ: ์Šฌ๋ผ์ด์Šค์˜ ๋ชจ์–‘(๋ผˆ๋Œ€)์„ StateCreator๋กœ ๊ตณํ˜€๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.
// ์ด๋•Œ ๋ฏธ๋“ค์›จ์–ด ๋ฐฐ์—ด ์‹๋ณ„์ž๋ฅผ ์ œ๋„ค๋ฆญ ๋’ค์— ๋‹ฌ์•„์ฃผ๋ฉด ์™„๋ฒฝํ•œ ํƒ€์ž… ํ˜ธํ™˜์„ ์ด๋ฃน๋‹ˆ๋‹ค.
const createAuthSlice: StateCreator<
  AuthSlice, 
  [["zustand/devtools", never], ["zustand/persist", unknown]]
> = (set) => ({
  isLogged: false,
  login: () => set({ isLogged: true }, false, "login"), // devtools๋ฅผ ์œ„ํ•œ ์•ก์…˜ ๋ผ๋ฒจ๋ง "login"
});
 
 
// 3. ๋ฉ”์ธ ์Šคํ† ์–ด ์กฐ๋ฆฝ (TypeScript๊ฐ€ ๋” ์ด์ƒ ํ˜ผ๋ž€์„ ๊ฒช์ง€ ์•Š์Šต๋‹ˆ๋‹ค)
export const useAuthStore = create<AuthSlice>()(
  devtools(
    persist(createAuthSlice, { name: 'auth-storage' })
  )
);

์ด ํŒจํ„ด์˜ ํ•ต์‹ฌ์€, "ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—๊ฒŒ ๋‚ด๊ฐ€ ์•ž์œผ๋กœ ์ด ๋ผˆ๋Œ€์— ๋ฌด์Šจ ๋ฏธ๋“ค์›จ์–ด(devtools, persist)๋ฅผ ๋ฐ”๋ฅผ ๊ฑด์ง€ ์ œ๋„ค๋ฆญ์œผ๋กœ ๋ฏธ๋ฆฌ ๊ท“๋œธ์„ ํ•ด๋‘๋Š” ๊ฒƒ" ์ž…๋‹ˆ๋‹ค. [["zustand/devtools", never], ["zustand/persist", unknown]] ์ด ๋‹ค์†Œ ํˆฌ๋ฐ•ํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ณต์‹ ๋ฌธ์„œ์—์„œ ๊ถŒ์žฅํ•˜๋Š” ๊ฐ€์žฅ ๋นˆํ‹ˆ์—†๋Š” ๋ฏธ๋“ค์›จ์–ด ํƒ€์ดํ•‘ ์ „๋žต์ž…๋‹ˆ๋‹ค.


๐Ÿ“ ๋งˆ๋ฌด๋ฆฌ ํ€ด์ฆˆ

Q1. Zustand์˜ create ํ•จ์ˆ˜์— ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ์ฃผ์ž…ํ•  ๋•Œ ์˜ฌ๋ฐ”๋ฅธ ๋ฌธ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

  • A) create<MyStore>((set) => ...)
  • B) create((set) => ...)<MyStore>
  • C) create<MyStore>()((set) => ...)
  • D) create<MyStore>()

โœ… ์ •๋‹ต: C

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ์›๋ฆฌ ์„ค๋ช…: Zustand์˜ create ํ•จ์ˆ˜๋Š” ์ปค๋ง(Currying) ํŒจํ„ด์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์–ด, ๋นˆ ๊ด„ํ˜ธ ()๋ฅผ ํ•œ ๋ฒˆ ๋” ํ˜ธ์ถœํ•ด์„œ ํƒ€์ž… ์ถ”๋ก  ๋ฒ”์œ„๋ฅผ ๋‹ซ์•„์ฃผ์–ด์•ผ ๋’ค๋”ฐ๋ผ์˜ค๋Š” ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์ฝœ๋ฐฑ์—์„œ ์ƒํƒœ(state)์˜ ํƒ€์ž…์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถ”๋ก ๋ฉ๋‹ˆ๋‹ค.
  • ์˜ค๋‹ต ํ”ผ๋“œ๋ฐฑ: "์˜์ฒ  ๋‹˜, A๋ฒˆ์ฒ˜๋Ÿผ ์“ฐ๋ฉด set ๋‚ด๋ถ€์—์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊ธธ์„ ์žƒ๊ณ  any ์ž”์น˜๋ฅผ ๋ฒŒ์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋นˆ ๊ด„ํ˜ธ ํ•˜๋‚˜๊ฐ€ ์ž๋™ ์™„์„ฑ์„ ์‚ด๋ ค์ค๋‹ˆ๋‹ค!"
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: ๐Ÿฆ ์˜ํ˜ธ: "์ œ๋„ค๋ฆญ์„ ์ผ์œผ๋ฉด, ๋นˆ ๊ด„ํ˜ธ๋กœ ํ•œ ๋ฒˆ ์‰ฌ๊ณ  ๊ฐ€์•ผ ์ฝ”๋“œ๊ฐ€ ์•ˆ ๊นจ์ง‘๋‹ˆ๋‹ค."

Q2. ์Šฌ๋ผ์ด์Šค ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๊ฒน์น  ๋•Œ ํƒ€์ž… ๋ถ•๊ดด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด Zustand๊ฐ€ ๊ถŒ์žฅํ•˜๋Š” ํƒ€์ž… ํ—ฌํผ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

  • A) CombineState
  • B) StateCreator
  • C) StoreApi
  • D) ZustandSlice

โœ… ์ •๋‹ต: B

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ์›๋ฆฌ ์„ค๋ช…: ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ์š”๊ตฌํ•˜๋Š” ํƒ€์ž… ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ๋ณ€๋™๋˜๋Š”๋ฐ, ์Šคํ† ์–ด ์ •์˜ ๋ผˆ๋Œ€ ์ž์ฒด๋ฅผ StateCreator๋กœ ๋ฏธ๋ฆฌ ํƒ€์ž… ์„ ์–ธํ•ด๋‘๋ฉด create ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์•„๋ฌด๋ฆฌ ๊ฐ์‹ธ๋„ ํƒ€์ž…์ด ๊ฒฌ๊ณ ํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
  • ์˜ค๋‹ต ํ”ผ๋“œ๋ฐฑ: "์˜์ฒ  ๋‹˜, ๋ฏธ๋“ค์›จ์–ด ๋•Œ๋ฌธ์— ๋นจ๊ฐ„ ๋ถˆ์ด ๋“ค์–ด์˜จ๋‹ค๋ฉด ์Šคํ† ์–ด ๋กœ์ง์„ ๋ฐ–์œผ๋กœ ๋นผ์„œ StateCreator๋กœ ์˜ท์„ ๋จผ์ € ์ž…ํ˜€์ฃผ์„ธ์š”."
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: ๐Ÿฆ ์˜ํ˜ธ: "StateCreator๋Š” Zustand ์Šคํ† ์–ด์˜ ๋ฌด์  ๋ฐฉํŒจ์ž…๋‹ˆ๋‹ค."

Q3. ๐Ÿ‹๏ธโ€โ™‚๏ธ ์˜์ฒ ์˜ ํ…Œ์ŠคํŠธ ํƒ€์ž„ (Q&A)

์˜์ฒ ์ด๊ฐ€ Slice ํŒจํ„ด์œผ๋กœ ์œ ์ € ์Šคํ† ์–ด์™€ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์Šคํ† ์–ด ๋‘ ๊ฐœ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ฑฐ๋Œ€ํ•œ useBoundStore๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋‘˜์ด ํƒ€์ž…์„ ์ œ๋Œ€๋กœ ํ•ฉ์น˜๋ ค๋ฉด ๋ฉ”์ธ ์Šคํ† ์–ด์˜ create ํ•จ์ˆ˜ ์ œ๋„ค๋ฆญ์— ์–ด๋–ป๊ฒŒ ์ ์–ด์ค˜์•ผ ํ• ๊นŒ์š”?

โœ… ์ •๋‹ต: create<UserSlice & CartSlice>()(...) ์ฒ˜๋Ÿผ ์ธํ„ฐ์„น์…˜(&)์„ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ์›๋ฆฌ ์„ค๋ช…: ๊ฐ์ฒด ์ธํ„ฐํŽ˜์ด์Šค๋“ค์„ ํ•˜๋‚˜๋กœ ์œตํ•ฉํ•  ๋•Œ๋Š” TypeScript์˜ ์ธํ„ฐ์„น์…˜ ํƒ€์ž…(&) ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Zustand์˜ ๋ฉ”์ธ ์Šคํ† ์–ด๋Š” ๊ฐ ์Šฌ๋ผ์ด์Šค๋“ค์ด ์ œ๊ณตํ•˜๋Š” ์ƒํƒœ์™€ ์•ก์…˜ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•ฉ์ณ์ง„ ๊ฑฐ๋Œ€ํ•œ ํ•˜๋‚˜์˜ ๊ฑฐ์ธ ๊ฐ์ฒด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ UserSlice & CartSlice ๊ฐ€ ๋˜์–ด์•ผ ์Šคํ† ์–ด ๋‚ด๋ถ€์—์„œ state.userName ๊ณผ state.cartItems ๋ฅผ ๋ชจ๋‘ ์ž๋™ ์™„์„ฑ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ค๋‹ต ํ”ผ๋“œ๋ฐฑ: "์˜์ฒ  ๋‹˜, | (Union) ๋ฅผ ์“ฐ๋ฉด ์œ ์ € ์Šคํ† ์–ด ๊ฑฐ๋‚˜ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ž€ ์†Œ๋ฆฌ๋‹ˆ๊นŒ ๊ต์ง‘ํ•ฉ ์„ฑ์งˆ์— ์˜ํ•ด ๋‘˜ ๋‹ค ๊ณตํ†ต์œผ๋กœ ๊ฐ€์ง„ ํ”„๋กœํผํ‹ฐ(๊ฑฐ์˜ ์—†์Œ)๋งŒ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ๋ผ์š”. ๋ฌด์กฐ๊ฑด &๋กœ ํ•ฉ์น˜์„ธ์š”!"
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: ๐Ÿฆ ์˜ํ˜ธ: "์Šฌ๋ผ์ด์Šค๋Š” ๊ฐœ๋ณ„ StateCreator<์ž์‹ ํƒ€์ž…>, ํ•ฉ์น˜๋Š” ๊ณต์žฅ์€ create<A & B & C>()"

๐Ÿฃ ์˜์ฒ ์ด์˜ ํ‡ด๊ทผ ์ผ๊ธฐ

์˜ค๋Š˜๋„ ์˜ํ˜ธ ๋ฆฌ๋“œ ๋‹˜์ด ๋‚ด ๋“ฑ์ง์„ ๋•Œ๋ ธ๋‹ค. // @ts-ignore ๋ฅผ ์Šคํ† ์–ด ํŒŒ์ผ ์œ—์ค„์— 10๊ฐœ๋‚˜ ๋‹ฌ์•„๋†“์€ ๊ฑธ ๋“ค์ผฐ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ์˜ค๋Š˜ Zustand ํƒ€์ž… ์„ ์–ธ๋ฒ•์„ ์ œ๋Œ€๋กœ ๋ฐฐ์šฐ๊ณ  ๋‚˜๋‹ˆ๊นŒ, VSC์—์„œ ์†์„ฑ๊ฐ’์„ ํƒ€์ดํ•‘ํ•  ๋•Œ๋งˆ๋‹ค ๋ฐ”๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ์ž๋™ ์™„์„ฑ์„ ๋ณด๋ฉฐ ๋ˆˆ๋ฌผ์ด ๋‚  ๋ป”ํ–ˆ๋‹ค. ์ด๋ž˜์„œ ๋‹ค๋“ค TypeScript๋ฅผ ์“ฐ๋Š”๊ตฌ๋‚˜! ์ œ๋„ค๋ฆญ ๊ด„ํ˜ธ๊ฐ€ ์ข€ ์ง•๊ทธ๋Ÿฌ์›Œ ๋ณด์ผ ๋•Œ๋„ ์žˆ์ง€๋งŒ, ํ•œ๋ฒˆ ์„ธํŒ…ํ•ด๋‘๋ฉด 1๋…„์€ ํŽธํ•˜๋‹ค๋Š” ๋ง์ด ์ง„์งœ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ๋‚ด ์Šคํ† ์–ด์—๋„ ์ด์ œ '์•ˆ์ „ ์ œ์ผ' ๋”ฑ์ง€๊ฐ€ ๋ถ™์—ˆ๋‹ค!

๐Ÿ’ก "create<Type>()(...) ๋นˆ ๊ด„ํ˜ธ์˜ ๋งˆ๋ฒ•์„ ์žŠ์ง€ ๋ง์ž. ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ๋‚„ ๋•Œ๋Š” StateCreator๋กœ ๋ผˆ๋Œ€๋ถ€ํ„ฐ ํƒ„ํƒ„ํžˆ ๋งŒ๋“ค์ž."