๐ ์ฌ๋ฏธ์๋ Redux(0)
์ฌ์ค ๋ฆฌ๋์ค๋ ์ฌ๋ฏธ๊ฐ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ต๊ธฐ๊น์ง ํ๋ค. ๋ฆฌ๋์ค์ ๋จ์ ์ค ๋์ ๋ฌ๋ ์ปค๋ธ๊ฐ ์๋ ๊ฑธ ๋ณด๋ฉด ๋น๋จ ๋๋ง ๊ทธ๋ฐ ๊ฑด ์๋ ๊ฒ ๊ฐ๋ค.
ํ์ง๋ง ๋ฆฌ๋์ค๊ฐ ์๋ ์ํฉ์์ ์ํ๊ด๋ฆฌ๋ ๋ ์ฌ๋ฏธ์๊ณ ๊ฐ๋ ํ๊ฐ ๋๊ธฐ๋ ํ๋ค.
๊ทธ๋ฌ๋ ํ๋ก ํธ์๋์ ํต์ฌ ํฌ์ธํธ ์ค ํ๋์ธ ์ํ ๊ด๋ฆฌ์ ๋ํด ์กฐ๊ธ์ด๋ผ๋ ์ ํด๋ด๊ธฐ ์ํด ๋ฆฌ๋์ค๋ฅผ ๋ฐฐ์๋ณด์.
Redux?
ํ์ด์ค๋ถ(ํ ๋ฉํ)์ ์์ ์ ๊ณ ์ง์ ์ธ ๋ฌธ์ ์ ์ ๊ณ ์น๊ธฐ ์ํ ์๋ก์ด ํจํด Flux๋ฅผ ๋ฐํํ๋ค.
๊ทธ๋ฆฌ๊ณ Flux์ ์ฃผ์ด์ง ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฉ์๋์ธ reduce์ ๊ฐ๋ ์ ๊ฒฐํฉํด Redux๋ผ๋ ๋๊ตฌ๊ฐ ์ธ์์ ๋ํ๋ฌ๋ค.
Redux์ ๋์์ ํฌ๊ฒ 4๊ฐ์ง ์์์ ํ์ ์ผ๋ก ์ดํดํ ์ ์๋ค.
- Action creator
- Dispatcher
- Store
- Rendering function
์ก์ ์ ๋ฐ๋ผ ๋์คํจ์ณ๊ฐ ํธ์ถ๋๊ณ ๋ฆฌ๋์์์ state๋ฅผ ์กฐ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์์์ ๋ ๋ ํจ์๋ฅผ ์ ์ํ๊ณ ์คํ ์ด๊ฐ ๊ทธ ํจ์๋ฅผ ๊ตฌ๋ ํ๋ค๋ฉด ํธ์ถํ๋ ํ์์ด๋ค.
๐จ ์ค์ต
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<script src="./counter.js" defer></script>
<title>Document</title>
</head>
<body>
<span class="number">0</span>
<button class="plus">+</button>
<button class="minus">-</button>
<button class="unsubscribe">Unsubscribe</button>
</body>
</html>
๋ฒํผ์ ๋๋ฅด๋ฉด ์ซ์๊ฐ ๋ณํ๋ ์นด์ดํฐ๋ฅผ ๋ง๋ค๋ ค๊ณ ํ๋ค. Store์ State์ ๋ฐ๋ผ ๊ฐ์ด ๋ณํ๊ณ Unsubscribe ๋ฒํผ์ ๋๋ฅด๋ฉด ๊ตฌ๋ ์ด ํด์ง๋๋ค.
import { createStore } from "redux";
const PLUS = "PLUS";
const MINUS = "MINUS";
const plus = () => ({ type: PLUS });
const minus = () => ({ type: MINUS });
const initialState = 0;
function counterReducer(state = initialState, action) {
console.log(action);
switch (action.type) {
case PLUS:
return state + 1;
case MINUS:
return state - 1;
default:
return state;
}
}
const store = createStore(counterReducer);
๊ฐ๊ฐ type์ผ๋ก PLUS์ MINUS๋ฅผ ๊ฐ๋ ์ก์ ์์ฑ ํจ์๋ฅผ ์ ์ธํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ซ์์ ์ด๊ธฐ๊ฐ์ธ initialState, ์ก์ ์ ๋ฐ๋ผ State๋ฅผ ๋ณ๊ฒฝํ๋ reducer๋ฅผ ๋ง๋ ๋ค.
store๋ ๋ฆฌ๋์ค ํจํค์ง์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ผ๋ก dispatcher๋ฅผ ํธ์ถํ ์ ์๋ค.
function init() {
const number = document.querySelector(".number");
const plusBtn = document.querySelector(".plus");
const minusBtn = document.querySelector(".minus");
const unsubscribeBtn = document.querySelector(".unsubscribe");
const render = () => {
const state = store.getState();
number.innerText = state;
};
const unsubscribe = store.subscribe(render);
plusBtn.addEventListener("click", () => store.dispatch(plus()));
minusBtn.addEventListener("click", () => store.dispatch(minus()));
unsubscribeBtn.addEventListener("click", () => unsubscribe());
}
init();
๋ฒํผ์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ค์ ๋ฑ๋กํ๊ณ store๊ฐ render ํจ์๋ฅผ ๊ตฌ๋ ํ๊ฒ ํ๋ค. store๋ state๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค render ํจ์๋ฅผ ํธ์ถํ๋ค.
๊ทธ๋ฆฌ๊ณ subscribe ํจ์์ ์คํ ๊ฒฐ๊ณผ๋ก unsubscribe ํจ์๊ฐ ๋ฐํ๋๋๋ฐ ์ด๊ฒ์ ์ด์ฉํด ๊ตฌ๋ ์ ํด์งํ ์ ์๋ค.
๐ช ํ๊ธฐ
๋ฆฌ๋์ค ํจํค์ง ๋ด๋ถ์ module import๊ฐ ๋ณต์กํด์ parcel ๋ฒ๋ค๋ฌ๋ฅผ ์ด์ฉํด ์๋์์ผฐ๋ค.
๊ฐ๋จํ ์นด์ดํฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ฆฌ๋์ค์ ์ผ๋ถ ๊ธฐ๋ฅ๋ง์ ์ฌ์ฉํ์ ๋ฟ์ธ๋ฐ ์ฝ๋์ ์์ด ์๋นํ๋ค.
๋ฆฌ๋์ค ๊ฐ๋ฐ์์ธ Dan abromove๋ You might not need redux๋ผ๋ ๊ธ์ ์ฌ๋ ธ๋ค. ๋๊ตฌ๋ฅผ ๋์ ํ๊ธฐ ์ด์ ์ฑ์ ๊ท๋ชจ๋ ๊ธฐ๋ฅ์ ๋ฐ๋ผ ์ ์ ํ๊ฒ ์ ํํ๋ ๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค.
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ ์ฌ๋ฏธ์๋ Redux(0)), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@ja960508/์ฌ๋ฏธ์๋-Redux0์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค