/vanilla-redux

๐Ÿ’Ÿ ๋ฐ”๋‹๋ผ ๋ฆฌ๋•์Šค

Primary LanguageJavaScript

๐Ÿ’Ÿ ๋ฆฌ๋•์Šค ๋ง›๋ณด๊ธฐ

๋ฆฌ๋•์Šค์—์„œ ์ค‘์š”ํ•œ ๊ฐœ๋…์€ ๋‹ค์Œ์˜ ์—ฌ์„ฏ๊ฐ€์ง€๋‹ค.

  1. ์•ก์…˜
  2. ์•ก์…˜ ์ƒ์„ฑ ํ•จ์ˆ˜
  3. ๋ฆฌ๋“€์„œ
  4. ๊ตฌ๋…
  5. ๋””์ŠคํŒจ์น˜
  6. ๋ถˆ๋ณ€์„ฑ ์œ ์ง€

1. ์•ก์…˜

์ƒํƒœ์— ์–ด๋–ค ๋ณ€ํ™”๊ฐ€ ํ•„์š”ํ•˜๋ฉด ์•ก์…˜์„ ์ผ์œผ์ผœ์•ผ ํ•œ๋‹ค.

์•ก์…˜์€ ํ•˜๋‚˜์˜ ๊ฐ์ฒด์ธ๋ฐ, ํ•„์ˆ˜ ํ•„๋“œ๋Š” type์ด๋‹ค.

{
	type: TOGGLE_VALUE;
}

์ด์™ธ ํ•„๋“œ๋„ ํ•„์š”ํ•˜๋‹ค๋ฉด ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

{
	type: INCREASE, difference;
}

์ฐธ๊ณ ๋กœ, ์•ก์…˜์˜ ์ด๋ฆ„์€ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.

const TOGGLE_SWITCH = 'TOGGLE_SWITCH';

2. ์•ก์…˜ ์ƒ์„ฑ ํ•จ์ˆ˜

์•ก์…˜ ์ƒ์„ฑ ํ•จ์ˆ˜๋Š” ์•ก์…˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ•จ์ˆ˜๋‹ค.
๋””์ŠคํŒจ์น˜๋ฅผ ํ†ตํ•ด ์•ก์…˜์„ ์ผ์œผํ‚ฌ ๋•Œ, ์ด ์•ก์…˜ ์ƒ์„ฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

const toggleSwitch = () => ({ type: TOGGLE_SWITCH });

3. ๋ฆฌ๋“€์„œ

๋ฆฌ๋“€์„œ๋Š” ๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚ค๋Š” ํ•จ์ˆ˜๋‹ค.
์•ก์…˜์„ ๋ฐœ์ƒ์‹œํ‚ค๋ฉด ๋ฆฌ๋“€์„œ๊ฐ€ ํ˜„์žฌ ์ƒํƒœ์™€ ์ „๋‹ฌ๋ฐ›์€ ์•ก์…˜ ๊ฐ์ฒด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„์˜จ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘ ๊ฐ’์„ ์ฐธ๊ณ ํ•˜์—ฌ ๋ฏธ๋ฆฌ ์ •์˜ํ•œ ๋กœ์ง์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋ฆฌ๋“€์„œ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‘๊ฐ€์ง€๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

  1. ์•ก์…˜ ์ด๋ฆ„
  2. ์ดˆ๊ธฐ ์ƒํƒœ๊ฐ’
// ์ดˆ๊นƒ๊ฐ’ ์„ค์ •
const initialState = {
	toggle: false,
};

function reducer(state = initialState, action) {
	switch (action.type) {
		case TOGGLE_SWITCH:
			return {
				...state, // ๋ถˆ๋ณ€์„ฑ ์œ ์ง€
				toggle: !state.toggle, // ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๋ฎ์–ด์“ฐ๊ธฐ
			};
	}
}

๋ฆฌ๋“€์„œ๋ฅผ ์ •์˜ํ–ˆ๋‹ค๋ฉด ๋“œ๋””์–ด store๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

const store = createStore(reducer);

4. ๊ตฌ๋…

์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œ์ผœ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด (์˜ˆ: render) ๊ตฌ๋…์„ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

const render = () => console.log('์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๋จ');

const unsubscribe = store.subscribe(render);

unsubscribe๋ผ๊ณ  ๋„ค์ด๋ฐํ•ด์ฃผ๋Š” ์ด์œ ๋Š” ์ถ”ํ›„ ๊ตฌ๋…์„ ๋น„ํ™œ์„ฑํ™”ํ•  ๋•Œ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

5. ๋””์ŠคํŒจ์น˜

์•ก์…˜์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ํ•จ์ˆ˜๋ฅผ ๋””์ŠคํŒจ์น˜๋ผ๊ณ  ํ•œ๋‹ค.
ํŒŒ๋ผ๋ฏธํ„ฐ์— ์•ก์…˜ ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

$divToggle.onclick = () => store.dispatch(toggleSwitch());

6. ๋ถˆ๋ณ€์„ฑ ์œ ์ง€

๋ฆฌ๋“€์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋•Œ๋Š”, ๊ธฐ์กด ์ƒํƒœ์˜ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
๊ธฐ์กด ์ƒํƒœ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋ฎ์–ด์”Œ์›Œ์ฃผ์–ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

์ด์œ ๋Š”, ๋ฆฌ๋•์Šค๊ฐ€ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ๋•Œ ์„ฑ๋Šฅ ์œ ์ง€๋ฅผ ์œ„ํ•ด ์–•์€ ๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ธฐ์กด ์ƒํƒœ๊ฐ’์„ ์ˆ˜์ •ํ•˜๊ฒŒ ๋˜๋ฉด ๊ฐ์ฒด์˜ ํŠน์„ฑ์ƒ ๋™์ผํ•œ ์ฃผ์†Œ๋ฅผ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ๋•์Šค๋Š” ์ƒํƒœ๊ฐ€ ์œ ์ง€๋œ ๊ฒƒ์œผ๋กœ ๋ณธ๋‹ค.
๋ฐ˜๋ฉด ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋กœ ์•„์˜ˆ ๋ฎ์–ด์“ฐ๊ฒŒ ๋˜๋ฉด ๊ธฐ์กด ์ƒํƒœ๊ฐ’๊ณผ๋Š” ๋ณ„๊ฐœ์˜ ๊ฐ์ฒด์ด๋ฏ€๋กœ ๋‹ค๋ฅธ ์ฃผ์†Œ๋ฅผ ๊ฐ–๊ฒŒ ๋˜์–ด ๋ฆฌ๋•์Šค๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฅผ ์ธ์ง€ํ•˜๊ฒŒ ๋œ๋‹ค.

์ด๋•Œ ์ด์ „ ์ƒํƒœ๊ฐ’์„ ๋ณต์‚ฌํ•˜๊ธฐ ์œ„ํ•ด ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋ฅผ ์ฃผ๋กœ ์ด์šฉํ•˜๋Š”๋ฐ,
์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋Š” depth 1๊นŒ์ง€๋งŒ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด๊ฐ€ ๋ณต์žกํ•  ๊ฒฝ์šฐ ์ ์ ˆ์น˜ ์•Š๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํŽธํ•˜๊ฒŒ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด immer ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

๋ฆฌ๋•์Šค์˜ ์„ธ๊ฐ€์ง€ ๊ทœ์น™

1. ๋‹จ์ผ ์Šคํ† ์–ด

ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•ˆ์—๋Š” ํ•˜๋‚˜์˜ ์Šคํ† ์–ด๋งŒ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.
์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šคํ† ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ๊ฑด ์•„๋‹ˆ์ง€๋งŒ, ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

2. ์ฝ๊ธฐ ์ „์šฉ ์ƒํƒœ

๋ฆฌ๋•์Šค ์ƒํƒœ๋Š” ์ฝ๊ธฐ ์ „์šฉ์ด๋‹ค.
์ฆ‰, ๊ฐ ์ƒํƒœ์˜ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ง์ด๋‹ค.
์ด์œ ๋Š” ์ƒ๊ธฐํ•œ ๊ฒƒ์ฒ˜๋Ÿผ, ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์–•์€ ๋น„๊ต๋ฅผ ํ†ตํ•ด ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ํŒ๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

3. ๋ฆฌ๋“€์„œ๋Š” ์ˆœ์ˆ˜ํ•œ ํ•จ์ˆ˜

๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚ค๋Š” ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜๋Š” ์ˆœ์ˆ˜ํ•œ ํ•จ์ˆ˜์—ฌ์•ผ ํ•œ๋‹ค.
์ˆœ์ˆ˜ํ•œ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ๋‹ค.

  1. ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜๋Š” ์ด์ „ ์ƒํƒœ์™€ ์•ก์…˜ ๊ฐ์ฒด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š”๋‹ค.
  2. ํŒŒ๋ผ๋ฏธํ„ฐ ์™ธ์˜ ๊ฐ’์—๋Š” ์˜์กดํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
  3. ์ด์ „ ์ƒํƒœ๋Š” ์ ˆ๋Œ€๋กœ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ , ๋ณ€ํ™”๋ฅผ ์ค€ ์ƒˆ๋กœ์šด ์ƒํƒœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  4. ๋˜‘๊ฐ™์€ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ˜ธ์ถœ๋œ ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜๋Š” ์–ธ์ œ๋‚˜ ๋˜‘๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

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