Redux
โข
Redux ๋?
โฆ
Reduce
โฆ
Flux
โข
Redux ์ดํดํ๊ธฐ
โข
Redux ๊ธฐ๋ณธ ์๋ฆฌ
โข
Redux ๊ตฌ์ฑ ์์
โฆ
์คํ ์ด
โฆ
์ก์
โฆ
๋ฆฌ๋์
โฆ
๋์คํจ์น
โข
Redux ๋์ ๊ณผ์
โฆ
์ด๋ฒคํธ ๋ฐ์
โฆ
์ก์
๋ฐ์
โฆ
๋์คํจ์น
โฆ
๋ฆฌ๋์ ์คํ
โฆ
์ํ ์
๋ฐ์ดํธ
โฆ
๊ตฌ๋
์ ์๋ฆผ
โข
Redux ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
โข
์์ ์ฝ๋
Redux ๋?
Reduce + Flux
: ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ ๊ธฐ๋ฐ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
Reduce
์๋ฐ์คํฌ๋ฆฝํธ์ reduce ํจ์๋ ๋ฐฐ์ด์ ์ํํ๋ฉด์ ๋์ ๊ฐ์ ๊ณ์ฐํ๋ ํจ์
Flux
์ํ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ๊ณ ์์ธก ๊ฐ๋ฅํ๊ฒ ํ๋ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ ์ํคํ
์ฒ
(FaceBook ์ด ๋ง๋ ์ ํ๋ฆฌ์ผ์ด์
์ํคํ
์ฒ)
Redux ์ดํดํ๊ธฐ
1.
๊ธฐ์์ฒญ & ์์ฒญ์๊ฐ ๋ฐฉ์ก๊ตญ์ผ๋ก ํ์ฅ์ ๊ธฐ์ ์ํฉ์ ์ ๋ณดํฉ๋๋ค.
2.
๋ฐฉ์ก๊ตญ ์คํ๋์ค์์๋ ๋ฐ๋๊ธฐ ๊ธฐ์๋ฅผ ํ์ฅ์ผ๋ก ํ๊ฒฌํฉ๋๋ค.
3.
๋ฐ๋๊ธฐ ๊ธฐ์๋ ํ์ฅ์์ ๋๊ธฐํ๋ฉฐ ํ์ฌ ๋ ์จ์ ๋ ์จ ๋ณํ์ ๊ฐ๋๋ฅผ ์ทจ์ฌํ๊ณ , ํ์ฅ์ ์ปจํธ๋กค ํ์์ธ PD๋ ์๋ก์ด ๋ ์จ ์ํฉ์ ๋ผ์ด๋ธ๋ก ๋ฐฉ์กํฉ๋๋ค.
4.
์ด ํ์ฅ ๊ธฐ์ ์ํฉ ๋ด์ค๋ฅผ ์์ฒญ์๋ค์ด ์์ฒญํฉ๋๋ค.
์์ฒญ์๊ฐ ์ ๋ณด๋ฅผ ํ๋ ๋ชจ์ต์ ๋ง์น, Redux ๋์ ๊ณผ์ ์ ์ด๋ฒคํธ ๋ฐ์๊ณผ ์ ์ฌํฉ๋๋ค. ์ด ์ ๋ณด๋ฅผ ๋ฐ์ ๋ฐฉ์ก๊ตญ ์คํ๋์ค๋ ํ์ฅ์ ๊ฐ์ ์ด๋ค ์ก์
์ ์ทจํด์ผํ ์ง ์ ํ๊ณ ๋ฐ๋๊ธฐ ๊ธฐ์๋ฅผ ํ๊ฒฌํ๋๋ฐ, ๋ฐ๋๊ธฐ ๊ธฐ์๋ฅผ ํ๊ฒฌํ๋ ๊ณผ์ ์ Redux ๋์ ๊ณผ์ ์ Dispatch ์ ์ ์ฌํฉ๋๋ค.
์ก์
์ ๊ฐ์ง๊ณ ํ๊ฒฌ๋ ๋ฐ๋๊ธฐ ๊ธฐ์์ ํ์ฅ์ ์๋ PD๋ ํ์ฌ ์ํฉ๊ณผ ์ก์
์ ํ์
ํ๊ณ , ์๋ก์ด ๋ ์จ ์ํฉ์ ์ทจ์ฌํ์ฌ ๋ฐฉ์กํฉ๋๋ค. ์ด ๊ณผ์ ์ ๋ง์น State ์ Action ์ ์ ๋ฌ ๋ฐ์ ์๋ก์ด State ๋ฅผ ๋ฐํํ๋ ๋ฆฌ๋์์ ๋์ ๊ณผ์ ๊ณผ ์ ์ฌํฉ๋๋ค.
์ด์ด์ ์ด ๋ฐฉ์ก ๋ด์ค๋ฅผ ํตํด ์๋ก์ด ๋ ์จ ์ํฉ์ด ์์ฒญ์๋ค์๊ฒ ์ ๋ฌ๋๊ณ ๋ ์จ์ ์ํฅ์ ๋ฐ๋ ์ง์ญ์ ์ ๋ฌ๋๋ ๊ณผ์ ์ Redux ๋์ ๊ณผ์ ์์ Store ๋ฅผ ๊ตฌ๋
ํ ์ปดํฌ๋ํธ๋ค์ด ์ํ ๋ณํ๋ฅผ ์ ๋ฌ ๋ฐ๋ ๊ณผ์ ๊ณผ ์ ์ฌํฉ๋๋ค.
1.
ํ์ฌ ํ์ฅ์์ 119 ์ ์ ํํ์ฌ ์ ๋ณดํฉ๋๋ค.
2.
119 ์ํฉ์ค์์ ์๋ฐฉ ๋น๊ตญ์ ํ์ฌ ํ์ฅ ์ ๋ณด์ ๋ํ์ฌ ๋ณด๊ณ ํฉ๋๋ค.
3.
์๋ฐฉ ๋น๊ตญ์ 119 ์ํฉ์ค๋ก ์ ๋ฌ ๋ฐ์, ์ฑ
์์์ ํ์ฌ ๋จ๊ณ์ ๋์ ๋ฐฉํฅ์ ์ ๋ฌ ๋ฐ์ ์๋ก์ด ๋์ ๋จ๊ณ๋ฅผ ๋ฐํํฉ๋๋ค.
4.
์ด์ ๋ฐ๋ผ, ๋์ ๋จ๊ณ์ ๋ง๋ ํ์ฌ ํ์ฅ์ ๋์์ด ์ด๋ฃจ์ด์ง๋๋ค.
์ด๋ ๊ฒ ํ์ฌ ํ์ฅ์ ์ ๋ณด๊ฐ 119 ์ํฉ์ค์ ์ ๋ฌ๋๊ณ , ์ด์ ๋ํ ์๋ฐฉ ๋น์ ๋์ ๋จ๊ณ๋ฅผ ์๋ฐฉ ๋น๊ตญ ์ปจํธ๋กค ํ์์์ ์ฒ๋ฆฌํ์ฌ ์๋ก์ด ๋์ ๋จ๊ณ๋ฅผ ๋ฐํํ๊ณ ํ์ฌ ํ์ฅ์ ๋์ํ๋ ๊ณผ์ ์ ๋ง์น Redux ์ ๋์ ๊ณผ์ ๊ณผ ์ ์ฌํฉ๋๋ค.
๋ฆฌ๋์ค ์ ํ๋ฆฌ์ผ์ด์
์์ ์ํ ๊ด๋ฆฌ๊ฐ ์ด๋ฃจ์ด์ง๋ ๊ณผ์ ์ ๋จ๊ณ๋ณ๋ก ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋จผ์ , ์ก์
๋ฐ์ ๋จ๊ณ์์๋ ์ฌ์ฉ์๊ฐ UI์ ์ํธ์์ฉํ๊ฑฐ๋ ๋ค๋ฅธ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ์ก์
์ด ์์ฑ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ก์
์ด ๋ฐ์ํฉ๋๋ค. ์ด ์ก์
์ ์ํ ๋ณ๊ฒฝ์ ์ง์ํ๋ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ต๋๋ค.
๋ค์์ผ๋ก, ๋์คํจ์น ๋จ๊ณ๊ฐ ์์ต๋๋ค. ์์ฑ๋ ์ก์
์ dispatch ๋ฉ์๋๋ฅผ ํตํด ์คํ ์ด์ ์ ๋ฌ๋ฉ๋๋ค. ์ด ๊ณผ์ ์ ์ก์
์ ์คํ ์ด์ ๋ณด๋ด๋ ์ญํ ์ ํ๋ฉฐ, ์ด๋ฅผ ํตํด ์ํ ๋ณ๊ฒฝ์ ์์ฒญํฉ๋๋ค.
์ดํ ๋ฆฌ๋์ ์คํ ๋จ๊ณ์์ ์คํ ์ด๋ ํด๋น ์ก์
์ ๋ฆฌ๋์๋ก ์ ๋ฌํฉ๋๋ค. ๋ฆฌ๋์๋ ํ์ฌ ์ํ์ ์ ๋ฌ๋ ์ก์
์ ๊ธฐ๋ฐ์ผ๋ก ์๋ก์ด ์ํ๋ฅผ ๊ณ์ฐํฉ๋๋ค. ๋ฆฌ๋์๋ ์์ ํจ์๋ก, ์ฃผ์ด์ง ์
๋ ฅ(ํ์ฌ ์ํ์ ์ก์
)์ ๋ฐ๋ผ ๋์ผํ ์ถ๋ ฅ(์๋ก์ด ์ํ)์ ๋ฐํํฉ๋๋ค.
์ํ ์
๋ฐ์ดํธ ๋จ๊ณ์์๋ ๋ฆฌ๋์๊ฐ ๋ฐํํ ์๋ก์ด ์ํ๊ฐ ์คํ ์ด์ ์ ์ฅ๋ฉ๋๋ค. ์คํ ์ด๋ ํญ์ ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ์ํ๋ฅผ ๋ณด์ ํ๊ณ ์์ผ๋ฉฐ, ๋ฆฌ๋์๋ฅผ ํตํด ๊ณ์ฐ๋ ์ํ๋ฅผ ์ต์ ์ํ๋ก ์ ์งํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก, ๊ตฌ๋
์ ์๋ฆผ ๋จ๊ณ๊ฐ ์งํ๋ฉ๋๋ค. ์คํ ์ด๋ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๊ตฌ๋
๋ ๋ชจ๋ ๋ฆฌ์ค๋์๊ฒ ์ํ ๋ณํ ์ฌ์ค์ ํต์งํฉ๋๋ค. ๋ฆฌ์ค๋๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ก, ์ํ ๋ณํ๊ฐ ๋ฐ์ํ๋ฉด ์ปดํฌ๋ํธ๋ ์๋ก์ด ์ํ๋ฅผ ๋ฐ์ํ์ฌ ์๋์ผ๋ก ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์
์ UI๋ ํญ์ ์ต์ ์ํ๋ฅผ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
์ด๋ฌํ ๋จ๊ณ๋ค์ด ๋ชจ์ฌ ๋ฆฌ๋์ค ์ ํ๋ฆฌ์ผ์ด์
์ ์ํ ๊ด๋ฆฌ ํ๋ฆ์ ๊ตฌ์ฑํฉ๋๋ค. ์ด ๊ณผ์ ์ ์ํ ๋ณ๊ฒฝ์ ์์ธก ๊ฐ๋ฅํ๊ณ ์ผ๊ด์ฑ ์๊ฒ ์ ์งํ๋๋ก ๋์ต๋๋ค.
Redux ๊ธฐ๋ณธ ์์น
โข
๋จ์ผ ์ง์ค์ ๊ทผ์: ์ ํ๋ฆฌ์ผ์ด์
์ ๋ชจ๋ ์ํ๋ ํ๋์ ์คํ ์ด(store)์ ์ ์ฅ๋ฉ๋๋ค. ์ด๋ ์ํ๋ฅผ ์ฝ๊ฒ ์ถ์ ํ๊ณ ๋๋ฒ๊น
ํ๋ ๋ฐ ๋์์ ์ค๋๋ค.
โข
์ํ๋ ์ฝ๊ธฐ ์ ์ฉ: ์ํ๋ฅผ ์ง์ ์์ ํ์ง ์๊ณ , ์ก์
(action)์ ํตํด์๋ง ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
โข
๋ณ๊ฒฝ์ ์์ ํจ์(reducer)๋ก: ์ํ์ ์ก์
์ ์
๋ ฅ๋ฐ์ ์๋ก์ด ์ํ๋ฅผ ๋ฐํํ๋ ์์ ํจ์์ธ ๋ฆฌ๋์(reducer)๋ฅผ ํตํด ์ํ๊ฐ ๋ณ๊ฒฝ๋ฉ๋๋ค.
Redux ๊ตฌ์ฑ ์์
โข
์ก์
โข
๋์คํจ์น
โข
์คํ ์ด
โข
๋ฆฌ๋์
์ก์ (Action)
type + payload
: ์ด๋ค ์ด๋ฒคํธ๊ฐ ์ผ์ด๋์ ์ด๋ค ์ํ๊ฐ ๋ณ๊ฒฝ๋์ผํ๋์ง ๋ํ๋ด๋ ๊ฐ์ฒด
โข
type : ์ก์
์ ์ข
๋ฅ
โข
payload : ๋ฐ์ดํฐ
๋์คํจ์น (Dispatch)
์ก์
์ ์คํ ์ด์ ๋ณด๋ด๋ ํจ์
์คํ ์ด (Store)
์ ํ๋ฆฌ์ผ์ด์
์ํ ์ ์ฅ์
๋ฆฌ๋์ (Reducer)
ํ์ฌ ์ํ์ ์ก์
์ ๋ฐ์์ ์๋ก์ด ์ํ๋ฅผ ๋ฐํํ๋ ํจ์
Redux ๋์ ๊ณผ์
1.
์ก์
๋ฐ์
: UI๋ ๋ค๋ฅธ ์ด๋ฒคํธ์ ์ํด ์ก์
์ด ๋ฐ์ํฉ๋๋ค.
2.
๋์คํจ์น
: ์ก์
์ ์คํ ์ด์ ๋์คํจ์นํฉ๋๋ค.
3.
๋ฆฌ๋์ ์คํ
: ์คํ ์ด๋ ๋ฆฌ๋์๋ฅผ ํธ์ถํ์ฌ ์๋ก์ด ์ํ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
4.
์ํ ์
๋ฐ์ดํธ
: ์๋ก์ด ์ํ๊ฐ ์คํ ์ด์ ์ ์ฅ๋ฉ๋๋ค.
5.
๊ตฌ๋
์ ์๋ฆผ
: ์คํ ์ด์ ๊ตฌ๋
๋ ๋ชจ๋ ๋ฆฌ์ค๋(์ปดํฌ๋ํธ ๋ฑ)์๊ฒ ์ํ ๋ณํ๊ฐ ํต์ง๋ฉ๋๋ค.
Redux ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
โข
redux
โข
react-redux
โข
redux-devtools-extension
โข
redux-actions
Redux ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
npm install redux react-redux redux-devtools-extension redux-actions
Bash
๋ณต์ฌ
npm install redux
npm install react-redux
npm install redux-devtools-extension
npm install redux-actions
Bash
๋ณต์ฌ
redux
Redux๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์
์ ์ํ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ ์ํ๋ฅผ ์์ธก ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ฃผ๋ฉฐ, ์ฃผ๋ก React์ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค. Redux๋ ๋จ์ผ ์คํ ์ด, ์ก์
, ๋ฆฌ๋์, ๋ฏธ๋ค์จ์ด ๋ฑ์ ํตํด ์ํ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
npm install redux
Bash
๋ณต์ฌ
react-redux
React-Redux๋ Redux์ React๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ๊ณต์ ๋ฐ์ธ๋ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค. React ์ปดํฌ๋ํธ๊ฐ Redux ์คํ ์ด์ ์ํธ์์ฉํ ์ ์๋๋ก ๋์์ค๋๋ค. Provider ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ฌ Redux ์คํ ์ด๋ฅผ React ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ์ฃผ์
ํ๊ณ , connect ํจ์๋ useSelector ๋ฐ useDispatch ํ
์ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๊ฐ ์ํ๋ฅผ ์ฝ๊ณ ์ก์
์ ๋์คํจ์นํ ์ ์๊ฒ ํฉ๋๋ค.
npm install react-redux
Bash
๋ณต์ฌ
redux-devtools-extension
Redux DevTools Extension์ Redux ์ํ์ ์ก์
์ ๋๋ฒ๊ทธํ๋ ๋ฐ ๋์์ ์ฃผ๋ ๋ธ๋ผ์ฐ์ ํ์ฅ ํ๋ก๊ทธ๋จ์
๋๋ค. ์ด ํ์ฅ์ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ ์ํ ๋ณํ๋ฅผ ์๊ฐ์ ์ผ๋ก ์ถ์ ํ๊ณ , ํ์ ํธ๋๋ธ ๋๋ฒ๊น
์ ํตํด ์ํ๋ฅผ ์ด์ ๋จ๊ณ๋ก ๋๋๋ฆด ์ ์์ต๋๋ค.
npm install redux-devtools-extension
Bash
๋ณต์ฌ
redux-actions
Redux-Actions๋ Redux์์ ์ก์
์์ฑ์์ ๋ฆฌ๋์๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์ ์ํ ์ ์๊ฒ ํด์ฃผ๋ ์ ํธ๋ฆฌํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค. createAction๊ณผ handleActions ๊ฐ์ ํจ์๋ค์ ์ ๊ณตํ์ฌ ์ก์
์์ฑ๊ณผ ๋ฆฌ๋์ ์ ์๋ฅผ ๋จ์ํํฉ๋๋ค.
npm install redux-actions
Bash
๋ณต์ฌ
์์์ฝ๋
โข
์นด์ดํฐ ์ฑ ํ๋ก์ ํธ
โข
ํ๋ก์ ํธ ์์ฑ
โข
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
โข
์ฝ๋ ์์
โฆ
์ก์
ํ์
์ ์ธ
โฆ
์ก์
์์ฑ ํจ์ ์ ์
โฆ
๋ฆฌ๋์ ํจ์ ์ ์
โฆ
์คํ ์ด ์ ์
โฆ
UI ํ๋ฉด
โฆ
Store Provider
์นด์ดํฐ ์ฑ ํ๋ก์ ํธ
ํ๋ก์ ํธ ์์ฑ
npx create-react-app redux-app
Bash
๋ณต์ฌ
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
โข
Redux
npm install redux @reduxjs/toolkit react-redux redux-actions
Bash
๋ณต์ฌ
โข
bootstrap
npm install bootstrap
Bash
๋ณต์ฌ
โข
sweetalert2
npm install sweetalert2 sweetalert2-react-content
Bash
๋ณต์ฌ
์ฝ๋ ์์
โข
์ก์
ํ์
์ ์ธ
โข
์ก์
์์ฑ ํจ์ ์ ์
โข
๋ฆฌ๋์ ํจ์ ์ ์
โข
์คํ ์ด ์ ์
โข
UI ํ๋ฉด
์ก์ ํ์ ์ ์ธ
โข
actionTypes.js
// ์ก์
ํ์
์ ์
export const INCREMENT = 'INCREMENT'
export const DECREMENT = 'DECREMENT'
JavaScript
๋ณต์ฌ
Redux์์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋์(์ก์
)์ ๋ฌธ์์ด ์์๋ก ์ ์ธํ๋ ์ฝ๋์
๋๋ค.
๊ทธ ๋ ๊ทธ ๋ ํ์ํ ๊ณณ์์ ๋ฌธ์์ด๋ก ์ก์
์ ๋ํ๋ด๋ ๋์ง๋ง, ๋ฌธ์์ด ์์๋ก ์ ์ธํ๋ฉด ์คํ๋ก ์ธํ ๋ฒ๊ทธ๋ฅผ ๋ฐฉ์งํ ์ ์๋ ์ด์ ์ด ์์ต๋๋ค.
์ก์ ์์ฑ ํจ์ ์ ์
// ์ก์
์์ฑ ํจ์ ์ ์
import { createAction } from 'redux-actions';
import { DECREMENT, INCREMENT } from './actionTypes';
export const increment = createAction(INCREMENT)
export const decrement = createAction(DECREMENT)
JavaScript
๋ณต์ฌ
Redux ์ก์
์์ฑ ํจ์๋ฅผ ์ ์ํ ์ฝ๋์
๋๋ค.
createAction ํจ์
์ก์
ํ์
์ ์ธ์๋ก ์ง์ ํ์ฌ, ํด๋น ํ์
์ ๊ฐ์ง ์ก์
์์ฑ ํจ์๋ฅผ ๋ฐํํ๋ ํจ์
createAction ํจ์๋ก ์ก์
์ ์์ฑํ๋ ํจ์๋ฅผ ๋ง๋ญ๋๋ค. ์์ ์ฝ๋์์๋ ์นด์ดํธ๋ฅผ ์ฆ๊ฐ์ํค๋ ์๋ฏธ์ โINCREMENTโ ์ก์
ํ์
๊ณผ ์นด์ดํธ๋ฅผ ๊ฐ์์ํค๋ ์๋ฏธ๋ก โDECREMENTโ ์ก์
ํ์
์ ๊ฐ์ง increment(), decrement() ์ก์
์์ฑํจ์๋ฅผ ์ ์ํฉ๋๋ค.
์ด๋ ๊ฒ ์ก์
์์ฑ ํจ์๋ฅผ ์ ์ํ๋ฉด, ์ด๋ฒคํธ ํธ๋ค๋ฌ์์ dispatch() ํจ์๋ฅผ ํธ์ถํ๋ฉด์ ํด๋น ์ด๋ฒคํธ์ ์ฐ๊ฒฐ๋ ์ก์
์์ฑ ํจ์๋ฅผ ์ ๋ฌํ๋ฉด ์คํ ์ด์ ๋ฏธ๋ฆฌ ์ ์๋ ์ก์
์ ์ ๋ฌํ ์ ์์ต๋๋ค.
๋ฆฌ๋์ ํจ์ ์ ์
// ๋ฆฌ๋์ ์ ์
import { handleActions } from 'redux-actions';
import { DECREMENT, INCREMENT } from './actionTypes';
// ์ํ ์ด๊ธฐํ
const initialState = {
count : 0
}
// ๋ฆฌ๋์
const counterReducer = handleActions(
{
[INCREMENT] : (state) => ( {count: state.count + 1} ),
[DECREMENT] : (state) => ( {count: state.count - 1} ),
},
initialState
)
export default counterReducer;
JavaScript
๋ณต์ฌ
redux-actions ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌ๋์๋ฅผ ์ ์ํ๋ ์ฝ๋์
๋๋ค.
์คํ ์ด ์ ์
// ์คํ ์ด ์ ์
import { configureStore } from '@reduxjs/toolkit'
import rootReducer from './reducers';
const store = configureStore({
reducer: rootReducer
});
export default store;
JavaScript
๋ณต์ฌ
UI ํ๋ฉด
โข
App.js
import { useDispatch, useSelector } from 'react-redux';
import './App.css';
import 'bootstrap/dist/css/bootstrap.min.css'
import { decrement, increment } from './redux/actions';
function App() {
// ์คํ ์ด์ ์ํ ์ ํ : count
const count = useSelector( (state) => state.count )
// ๋์คํจ์น
const dispatch = useDispatch()
return (
<div className="container d-flex flex-column justify-content-center align-items-center" style={{ minHeight: '100vh' }}>
<div className="card text-center p-4 shadow">
<h1 className="card-title">Counter</h1>
<h3>{count}</h3>
<div className="card-body">
<button className='btn btn-primary me-2'
onClick={() => dispatch(increment())}
>+</button>
<button className='btn btn-danger'
onClick={() => dispatch(decrement())}
>-</button>
</div>
</div>
</div>
);
}
export default App;
JavaScript
๋ณต์ฌ
Store Provider
โข
index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { Provider } from 'react-redux';
import store from './redux/store';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
{/* โญ Provider๋ฅผ ์ฌ์ฉํ์ฌ Redux ์คํ ์ด๋ฅผ React ์ ํ๋ฆฌ์ผ์ด์
์ ์ ๊ณต */}
<Provider store={ store }>
<App /> {/* โญ App ๋ฐ ํ์ ์ปดํฌ๋ํธ์์ Redux ์คํ ์ด์ ์ ๊ทผ ๊ฐ๋ฅ */}
</Provider>
</React.StrictMode>
);
reportWebVitals();
JavaScript
๋ณต์ฌ