๐งฑ 02. ํต์ฌ ๊ฐ๋ ๊ณผ ๊ธฐ๋ณธ ์คํ ์ด ์ค๊ณ: "์ด ์คํ ์ด, ๋๋ฌด ๋ฌด๊ฒ์ง ์๋์?"
๐ ๊ฐ์
Zustand์ create, set, get ํจ๋ฌ๋ค์๊ณผ ๋ถ๋ณ์ฑ ๋ฉํ ๋ชจ๋ธ
๐ฏ ์ด ์น์ ์ ์ฝ๊ณ ๋๋ฉด:
- Zustand์
create,set,get๋์ ์๋ฆฌ๋ฅผ ์ดํดํ ์ ์๋ค.- Zustand
set์ ์์ ๋ณํฉ๊ณผ ์ค์ฒฉ ๊ฐ์ฒด(Nested Objects) ์ ๋ฐ์ดํธ ์ ๋ถ๋ณ์ฑ ๊ท์น์ ์งํฌ ์ ์๋ค.
๐ ๋ชฉ์ฐจ
- ๐ค ์ ์์์ผ ํ๋๊ฐ
- ๐๏ธ 1. ์คํ ์ด์ ํ์:
create - ๐ฏ 2. ์
๋ฐ์ดํธ์ ํต:
set๊ณผ ์์ ๋ณํฉ (Shallow Merge) - ๐ 3. ํ์ฌ ์ํ๋ฅผ ํ์ณ๋ณด๋
get - ๐๏ธโโ๏ธ ์์ฒ ์ ํ ์คํธ ํ์ (Q&A)
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 10๋ถ / ํต์ฌ ํํธ: 6๋ถ
๐บ๏ธ ์ด ๋ฌธ์์ ํ๋ฆ
์คํ ์ด ์์ฑ ์๋ฆฌ(create) โ ์์ ๋ณํฉ ์
๋ฐ์ดํธ(set) โ ๋น๋๊ธฐ ๋ก์ง ๋ด ์ํ ์ฐธ์กฐ(get)
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ๐ฃ ์์ฒ ( ์ ์
): "์ํธ ๋ฆฌ๋ ๋! Zustand ๋ชจ๋ธ๋ง ์์ฒญ ์ง๊ด์ ์ด๋ค์. ์ ๋์ ์ปค๋ฎค๋ํฐ ์ฑ์ ์๋ ์ ์ ์ ๋ณด, ๊ฒ์๊ธ ๋ฆฌ์คํธ, UI ํ
๋ง, ๊ธ ์์ฑ ๋ฐ์ดํฐ๊น์ง ๋ค
useAppStoreํ๋์ ๋๋ ค ๋ฐ์์ด์! ์ด๋ผ, ๊ทผ๋ฐ ์์ ๋์ด PR ๋ณด์๋๋ '์ ์คํ ์ด๊ฐ ๋ชจ๋๋ฆฌ์ ๋ฐฑ์๋ ์๋ฒ๋ง๋ฅ ๋ฌด๊ฒ๋'๊ณ ๋ฆฌ๋ทฐ๋ฅผ ๋ค์ จ์ด์..." - ๐ฆ ์ํธ ( ๋ฆฌ๋ ): "์์ฒ ๋, ์ ์ญ์ผ๋ก ๋บ ๊ฑฐ๊น์ง ์ข์์ด์. ๊ทธ๋ฐ๋ฐ Zustand์ ์ง์ง ๊ฐ๋ ฅํจ์ ๊ทธ ๊ฐ๋ฒผ์ด
createํจ์ ์์ ์์ด์. ๊ฐ์ฒด๋ฅผ ๋ฑ๋ฑํ๊ฒ ๋ง๋ค๋ฉด ๊ด๋ฆฌ ํฌ์ธํธ๊ฐ ๋์ด๋๊ณ , ๋ถ๋ณ์ฑ(Immutability) ์ ๋ฐ์ดํธ๋ ์ ์ ๊น์ด ๋ค์ด๊ฐ๋ ๋ช(Depth Hell)์ด ๋ฉ๋๋ค. ๊ธฐ๋ณธ ๋ผ๋์ธset๊ณผget๋ถํฐ ๋จ๋จํ๊ฒ ๋ค์ ธ๋ด ์๋ค."
๐ค ์ ์์์ผ ํ๋๊ฐ
Zustand๋ฅผ ์ฒ์ ์ฌ์ฉํ ๋ ๊ฐ์ฅ ๋ง์ด ํ๋ ์ค์๋ 'ํ๋์ ๊ฑฐ๋ํ ์ฐฝ๊ณ '๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ค. Redux์ Store ํ๋์ง๋ฆฌ ์ฒ ํ๊ณผ ํท๊ฐ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋๋ค.
Zustand ์คํ ์ด ์์ ์ํ๋ฅผ ์
๋ฐ์ดํธํ๋ ํจ์(set)๋ ๊ธฐ์กด ์ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ก์ด ๊ฐ์ฒด(์ฐธ์กฐ)๋ฅผ ๋ฐํํด์ผ ๋ฆฌ์กํธ ํธ๋ฆฌ์ ๋ณ๊ฒฝ์ ์๋ฆด ์ ์์ต๋๋ค. ์คํ ์ด๊ฐ ๋๋ฌด ๊ฑฐ๋ํ๊ณ ์ค์ฒฉ(Nest)์ด ๊น์ด์ง๋ฉด, ์คํ๋ ๋ ์ฐ์ฐ์(...) ์ง์ฅ์ด ์ด๋ฆฌ๊ณ ํด๋จผ ์๋ฌ๋ก ์ฐธ์กฐ ๋์ผ์ฑ(Reference Equality) ํจ์ ์ ๋น ์ง๊ธฐ ์ฝ์ต๋๋ค.
'์ด๋ป๊ฒ ์คํ ์ด๋ฅผ ์์ฑ(create)ํ๊ณ , ๊ฐ์ ๊ฐ์ ธ์ค๊ณ (get), ์์ ํ๊ฒ ์ ๋ฐ์ดํธํ ๊ฒ์ธ๊ฐ(set)'๋ฅผ ๊น์ด ์ดํดํด์ผ๋ง ๊นํธ์ฒ๋ผ ๊ฐ๋ฒผ์ด Zustand์ ์ง์ง ์๋๋ฅผ ๊ฒฝํํ ์ ์์ต๋๋ค.
๐๏ธ 1. ์คํ ์ด์ ํ์: create
Zustand ์คํ ์ด๋ create ํจ์ ํ๋๋ก ๋ง๋ค์ด์ง๋๋ค. create๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๋๋ฐ, ์ด ์ฝ๋ฐฑ์ set, get, api๋ฅผ ์ฃผ์
๋ฐ์ ๊ฐ์ฒด(์ด๊ธฐ ์ํ์ ์ก์
)๋ฅผ ๋ฐํํฉ๋๋ค.
// ๐ฃ ์์ฒ : Zustand์์๋ Reducer๊ฐ ๋ฐ๋ก ์์ผ๋, ์ก์
ํจ์๋ ๋ฐ๋ก ๋ฃ์ผ๋ฉด ๋๋ค์!
import { create } from 'zustand';
interface EditorState {
title: string;
content: string;
wordCount: number;
setTitle: (title: string) => void;
setContent: (content: string) => void;
}
export const useEditorStore = create<EditorState>()((set, get) => ({
title: '',
content: '',
wordCount: 0,
setTitle: (title) => set({ title }), // ๐ก ์์ ๋ณํฉ!
setContent: (content) => {
// ๐ก get()์ผ๋ก ํ์ฌ ์ํ๋ฅผ ์ฝ์ด์ฌ ์ ์์ด์!
const currentWordCount = content.trim().split(/\s+/).length;
set({ content, wordCount: currentWordCount });
},
}));๐ก create๋ฅผ ๋ ๋ฒ ํธ์ถํ๋ ์ปค๋ง(Currying) ํจํด
์ TypeScript ์์ ์์ <EditorState>()(...) ์ฒ๋ผ ๊ดํธ๊ฐ ์ฐ์๋๋ ํจํด์ ๋ณผ ์ ์์ต๋๋ค. ์ด๋ Zustand๊ฐ ํ์
์ถ๋ก ์ ์๋ฒฝํ๊ฒ ๋๊ธฐ ์ํด ๋น ์ธ์๋ก ํ ๋ฒ ํธ์ถํ๊ณ , ๊ทธ๋ค์ ์ง์ง ์คํ ์ด ์ ์๋ฅผ ๋ฐ๋ ์ปค๋ง(Currying) ๊ธฐ๋ฒ์
๋๋ค. (TS๋ฅผ ์ธ ๋๋ง ๋ฑ์ฅํ๋ ๊ดด์ํ ๊ดํธ์ ์ ์ฒด์
๋๋ค.)
๐ฏ 2. ์
๋ฐ์ดํธ์ ํต: set๊ณผ ์์ ๋ณํฉ (Shallow Merge)
set ํจ์๋ Zustand์ ์ํ์ด์ ์ค๋ฉ๊ฐ์
๋๋ค.
React์ useState์์ ๋ฐฐ์ด ํ
(setState)์ ์ฌ์ฉํ ๋ 1์ฐจ์(Root ๋ ๋ฒจ) ์ํ ํ๋๋ค์ ์ด๋ค๊ฐ์? ๊ธฐ์กด ์ํ๋ฅผ ๋ค ๋ณต์ฌ(...prev)ํด์ ๋ฃ์ด์ค์ผ ํ์ต๋๋ค.
๊ทธ๋ฐ๋ฐ Zustand์ set์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ต์์(1st level) ์์ฑ๋ค์ ๋ํด ์์ ๋ณํฉ(Shallow Merge) ์ ์์์ ํด์ค๋๋ค.
// ๐ฆ ์ํธ: Zustand๋ ๋๋ํด์. ๋ช
์ํ ํ๋๋ง ๋ฎ์ด์ฐ๊ณ ๋๋จธ์ง๋ ๊ฑด๋ค์ง ์์์.
const useUserStore = create((set) => ({
name: '์์ฒ ',
level: 1,
// โ useState ๋ฐฉ์ (๋ถํ์ํ ์ค๋ณต)
levelUpBad: () => set((state) => ({ ...state, level: state.level + 1 })),
// โ
Zustand ๋ฐฉ์ (์๋ ์์ ๋ณํฉ)
levelUpGood: () => set((state) => ({ level: state.level + 1 })),
}));๐จ ๋ถ๋ณ์ฑ์ ํจ์ : ์ค์ฒฉ๋ ๊ฐ์ฒด(Nested Objects)
์์ ๋ณํฉ์ ์ต์์ ๋์ค(Depth 1)์์๋ง ์์ ํฉ๋๋ค. ์ค์ฒฉ๋ ์์ฑ์ ์ ๋ฐ์ดํธํ ๋๋ ๋ฐ๋์ ๊น์ ๋ณต์ฌ๋ฅผ ์๋์ผ๋ก ํด์ค์ผ ํฉ๋๋ค. ์ ๊ทธ๋ฌ๋ฉด ์ฐธ์กฐ๊ฐ ๋๊ฒจ ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ์ง ์์ต๋๋ค.
// ๐ก ์์: "์์ฒ ๋! ํ๋กํ ์ฌ์ง ๋ฐ๊ฟจ๋๋ฐ ์ ํค๋ ์ด๋ฏธ์ง๋ ์ ๋ฐ๋์ด์?!"
const useDeepStore = create((set) => ({
user: {
name: '์์ฒ ',
profile: { url: 'old.jpg', badge: 'junior' }
},
// โ ๋์ฐํ ์ค์ (์ฐธ์กฐ ๋์ผ์ฑ ๊นจ์ง, ๋ถ๋ณ์ฑ ์๋ฐ)
updateProfileBad: (newUrl) => set((state) => {
state.user.profile.url = newUrl; // Mutation! ๋ฆฌ์กํธ๊ฐ ๋ณํ๋ฅผ ๊ฐ์ง ๋ชปํจ
return { user: state.user };
}),
// โ
์์ ํ ๋ถ๋ณ์ฑ ์
๋ฐ์ดํธ (์คํ๋ ๋ ์ง์ฅ)
updateProfileSpread: (newUrl) => set((state) => ({
user: {
...state.user,
profile: {
...state.user.profile,
url: newUrl
}
}
}))
}));๐ฆ ์ํธ์ ํ๋ง๋: "์ด๋์ ์คํ ์ด๋ฅผ ๋ชจ๋๋ฆฌ์ํ๊ฒ ์ง๋ฉด ์ ์ง๋ณด์๊ฐ ๋ฐ์ด ๋๋ค๋ ๊ฒ๋๋ค. ๊น์ด๊ฐ 2๋์ค ์ด์ ๋ค์ด๊ฐ๋ฉด Immer ๋ฏธ๋ค์จ์ด๋ฅผ ์ฐ๊ฑฐ๋, ์คํ ์ด ์์ฒด๋ฅผ ๋ฉ์(Flat)ํ๊ฒ ์ค๊ณํ์ธ์."
๐ 3. ํ์ฌ ์ํ๋ฅผ ํ์ณ๋ณด๋ get
์ก์
ํจ์ ๋ด๋ถ์์ ์ํ๋ฅผ ์ฝ์ด์ผ ํ ๋๋, ์ด์ ์ํ ๊ฐ์ ๊ณ์ฐ์ ์ฌ์ฉํด์ผ ํ ๋๋ get()์ ๊บผ๋ด ์๋๋ค. ๋ง์ฝ ๋น๋๊ธฐ ํจ์(API ํธ์ถ ๋ฑ) ๋ค์ ์ต์ ์ํ๊ฐ ํ์ํ๋ค๋ฉด get()์ ํ์์
๋๋ค.
const useCounterStore = create((set, get) => ({
count: 0,
submitScore: async () => {
const currentCount = get().count; // ๐ก ๋น๋๊ธฐ ์์
์ง์ ์ค๋
์ท ์ฝ๊ธฐ
await api.post('/score', { score: currentCount });
// ๋ง์ฝ ์ฌ๊ธฐ์ ๋ค์ get()์ ํ๋ฉด API ๋๊ธฐ ์ค ๋ณํ ์ต์ ๊ฐ์ ์ป์ ์ ์์.
}
}));๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
Q1. Zustand์ set ํจ์๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ์ํ ์
๋ฐ์ดํธ ๋ฐฉ์์ ๋ฌด์์ธ๊ฐ์?
- A) ๋ฌด์กฐ๊ฑด ์ ์ฒด ์ํ๋ฅผ ์๋ก ๊ต์ฒดํด์ผ ํ๋ค.
- B) ๊น์ ๋ถ๋ณ์ฑ(Deep Immutability) ๋ณด์ฅ
- C) ์ต์์ ๋์ค(Depth 1)์ ๋ํ ์์ ๋ณํฉ (Shallow Merge)
- D) React์
useState๋ฐฐ์ด ์ ๋ฐ์ดํธ ๋ฐฉ์๊ณผ ์์ ๋์ผ
โ
์ ๋ต: C
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
: Zustand์
set์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ ๋ ๊ธฐ์กด ์ํ ์ต์์(1st level) ํ๋๋ค์ ๋ํด ์๋์ผ๋ก ์์ ๋ณํฉ์ ํด์ค๋๋ค. ๋๋ถ์...state๊ฐ์ ์คํ๋ ๋ ์ฐ์ฐ์๋ฅผ ๋งค๋ฒ ์ ์ ํ์๊ฐ ์์ต๋๋ค. - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, Zustand๊ฐ ๋ง๋ฒ์ฌ๋ ์๋์์. ์ค์ฒฉ ๊ฐ์ฒด ๊น์ ๊ณณ๊น์ง ์์์ ๋ณํฉํด์ฃผ์ง ์์ผ๋ 2๋์ค๋ถํฐ๋ ์กฐ์ฌํด์ผ ํฉ๋๋ค."
- ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: ๐ฆ ์ํธ: "Zustand์
set์ ๊ฒ๋๋ 1์ฐจ์๋ง ์์์ ๋ณํฉํด์ฃผ๋ ์น์ ํ ๋๊ตฌ์ ๋๋ค."
Q2. ๋น๋๊ธฐ ํต์ (API ํธ์ถ) ์ค์ ์ต์ ์ํ๋ฅผ ์ฝ์ด์์ผ ํ ๋ ๊ฐ์ฅ ์ฌ๋ฐ๋ฅธ Zustand ์ฌ์ฉ๋ฒ์ ๋ฌด์์ธ๊ฐ์?
- A) ์คํ ์ด ์ธ๋ถ์ ์ ์ญ ๋ณ์๋ฅผ ๋ง๋ค์ด์ ์ฐธ์กฐํ๋ค.
- B) ์ฝ๋ฐฑ์ผ๋ก ์ฃผ์
๋๋
getํจ์(get())๋ฅผ ํธ์ถํ์ฌ ํ์ฌ ์ค๋ ์ท์ ์ฐ์ด์จ๋ค. - C) React์
useRef๋ฅผ ๋น๋ ค์ ์คํ ์ด์ ์ฐ๊ฒฐํด๋๋ค. - D)
setํจ์๋ฅผ ๊ฐ์ ๋ก ํธ์ถํด์ ๋ฆฌ๋ ๋๋ง์ ๋ฐ์์ํจ ๋ค ์ํ๋ฅผ ๋ฐ์์จ๋ค.
โ
์ ๋ต: B
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
: ์คํ ์ด๋ฅผ ์์ฑํ ๋
create((set, get) => ...)ํํ๋กget์ด ํจ๊ป ์ ๊ณต๋ฉ๋๋ค. ์ก์ ํจ์๋ ๋น๋๊ธฐ ๋ก์ง ์ค๊ฐ์ ํ์ฌ ์ํ๊ฐ์ ์ฝ์ด์ผ ํ ๋๋get()์ ํธ์ถํ๋ฉด ์ฆ์ ์ต์ ์ํ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ์ ์ญ ์ํ๋ฅผ ์ธ ๋๋ ์ฒ ์ ํ๊ฒ ์ ๊ณต๋ ๋๊ตฌ(
get)๋ง ํ์ฉํด์ผ์ง ์ธ๋ถ ๋ณ์๋ React ํ (useRef)์ ์์กดํ๋ฉด ์คํ๊ฒํฐ ์ฝ๋๊ฐ ๋ฉ๋๋ค." - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: ๐ฆ ์ํธ: "๊ฐ์ด ๊ถ๊ธํ๋ฉด ํ์ณ๋ณด๋ ๊ฒ ์๋๋ผ ๋น๋นํ๊ฒ
get()์ ์์ฒญํ์ธ์."
Q3. ๐๏ธโโ๏ธ ์์ฒ ์ ํ ์คํธ ํ์ (Q&A)
์์ฒ ์ด๊ฐ ์ผํ๋ชฐ ์ฅ๋ฐ๊ตฌ๋ ๊ธฐ๋ฅ์ ๋ง๋ค๋ฉด์
cart๋ฐฐ์ด ์์ ์๋ ํน์ ์์ดํ ์ ์๋(quantity)๋ง ์ฆ๊ฐ์ํค๋ ค๊ณ ํฉ๋๋ค. ์คํ ์ด ์ํ ๊ตฌ์กฐ๋{ cart: [{ id: 1, qty: 1 }] }์ ๋๋ค. ์ด๋ป๊ฒset์ ํธ์ถํด์ผ ์์ ํ๊ฒ ๋ฆฌ์กํธ ํ๋ฉด์ ๋ฐ์๋ ๊น์?
โ
์ ๋ต: map ๋ฉ์๋ ๋ฑ์ ์ด์ฉํด ์์ ๋๋ ์์ดํ
์ ์๋ก์ด ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ๋ง๋ค์ด ๋ถ๋ณ์ฑ์ ์ ์งํ๋ฉฐ cart ๋ฐฐ์ด ์ ์ฒด๋ฅผ ์
๋ฐ์ดํธํ๋ค.
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
: Zustand ์ต์์์
cartํค ์์ฒด๋ ์์ ๋ณํฉ์ ์ง์ํ์ง๋ง, ๊ทธ ๋ด๋ถ ๋ฐฐ์ด์ ์์๊ฐ ๊ฐ์ง ์ค์ฒฉ๋ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ (item.qty++)ํ๋ฉด ์๋ณธ ๊ฐ์ฒด๋ฅผ ๋ณ์ด(Mutation)์ํค๋ ๊ผด์ด ๋ฉ๋๋ค. ์์ ๋น๊ต(!==)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฆฌ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํ๋ Zustand์ React๋ ๊ฐ์ฒด์ ๋ด์ฅ ์ฃผ์๊ฐ์ด ๋๊ฐ์ผ๋ ํ๋ฉด์ ๋ค์ ๊ทธ๋ฆฌ์ง ์์ต๋๋ค. - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋,
item.qty = newValue์ฒ๋ผ ์ฐ๋ฅด๋ ๋ฐฉ์์ ๋ฐฐ์ด ์์ ์ง๋ขฐ๋ฅผ ์ฌ๋ ํ์์์. ๋ฐ๋์ ์ ๊ฐ ์ฐ์ฐ์๋ ๋ถ๋ณ์ฑ ์ ํธ๋ฆฌํฐ ํจ์(Immer ๋ฑ)๋ฅผ ์ ์ฉํด์ผ ํฉ๋๋ค." - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: ๐ฆ ์ํธ: "Zustand์
set์ ํธํ(1์ฐจ์)์๋ง ์๋ ๋ณํฉ ๋ง๋ฒ์ ๋ถ๋ ค์ค๋๋ค. ์๋ ์์ ๋ณด์ํจ ๋ด์ฉ๋ฌผ์ ๋ฐ๊ฟ ๋๋ ๋ณด์ํจ ๋ชจ์ ์ ์ฒด๋ฅผ ์๋ก ์ง์ ๊ต์ฒดํ์ธ์."
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
์ค๋๋ ์ํธ ๋ฆฌ๋ ๋ํํ
๊น์ ๋ณต์ฌ ์ค์๋ก ํผ๋ฌ๋ค. ํ๋กํ ์ด๋ฏธ์ง๊ฐ ์ ๋ฐ๋์ด์ ๋ฐฑ์๋ ์บ์ ๋ฌธ์ ์ธ ์ค ์๊ณ ์์ ๋ํํ
๋ฐ์ง๋ฌ ๊ฐ ๋ปํ๋๋ฐ, ๋ด Zustand ๋ก์ง์ด Mutations ๋ฒ๋ฒ
์ด์๋ค๋ ์์๋์ด ์ซ ๋ฌ๋ค. state.user.profile.url = '...' ์ด๊ฑฐ ๋ด๊ฐ Vanilla JS ํ๋ ๋ฒ๋ฆ์ด ์์ง๋ ๋จ์์์๋ค ใ
ใ
๋ด์ผ์ ์ด ๊น์ ๋์ค๋ฅผ ์ปดํฌ๋ํธ ๋จ์๋ ๋๋ฉ์ธ ๋จ์๋ก ํํํ(Flat)ํ๋ ๋ฒ์ ์ ๋๋ก ์ฌ์ญค๋ด์ผ๊ฒ ๋ค. ์ง ๊ฐ์ ์ป๊ณ ์ ํ๋ธ๋ก Zustand ๋ถ๋ณ์ฑ ๊ฐ์ ํ๋๋ง ๋ ๋ณด๊ณ ์์ผ์ง. ํ์ดํ
์์ฒ !
๐ก "์ํ๋ฅผ ๊น์์ด ํ๊ณ ๋ค์๋ก ์คํ๋ ๋ ์ฐ์ฐ์์ ์ ์ฃผ๊ฐ ์์๋๋ค. ๋ฉ์(Flat)ํ ์คํ ์ด๊ฐ ์๋ช ์ฐ์ฅ์ ๊ฟ!"