-
[React] Redux ๊ฐ๋ ์ ๋ฆฌTECH 2022. 3. 13. 02:04
โ๏ธ Redux๋?
Redux๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ์ํ(state)๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋๋ก ๋์์ฃผ๋ ๋๊ตฌ ์ค ํ๋์ด๋ค.
โ๏ธ Redux ๊ธฐ๋ณธ ๊ฐ๋
1. ์ก์ (Action)
์ํ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด์๋ ์ก์ ์ ํตํด ๋ณ๊ฒฝํด์ผ ํ๋ค. ์ก์ ์ ๊ฐ์ฒด ํ์์ผ๋ก ํํ๋๊ณ ,
type
์ ํ์๋ก ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค. ์ต์ ์ผ๋ก ๋ค๋ฅธ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง ์ ์๊ณ , ์ก์ ์ ํ์ํ ๋ถ๊ฐ์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.{ type: 'ADD_MESSAGE', data: { id: 1 message: "๋ฆฌ๋์ค ๋ฐฐ์ฐ๊ธฐ" } }
๋ฉ์์ง๋ฅผ ์๋ก ์ถ๊ฐํ๋ ์ก์ ์ด๊ณ , ์๋ก์ด ๋ฉ์์ง์ ๋ํ ๋ถ๊ฐ์ ์ธ data๊ฐ ์ ๋ฌ๋๋ค.
2. ์ก์ ์์ฑ ํจ์(Action Creator)
์ก์ ์ ๊ฐ์ฒด ํ์์ผ๋ก ๋ฐ๋ก ๋ง๋๋ ๊ฒ์ด ์๋๋ผ, ์ก์ ์ ๋ง๋ค์ด ์ฃผ๋ ์ก์ ์์ฑ ํจ์๋ฅผ ํตํด ๋ง๋ ๋ค.
function addMessage(data) { return { type: "ADD_MESSAGE", data, }; } // arrow function const addMessage = (data) => ({ type: "ADD_MESSAGE", data });
์ก์ ์์ฑ์ ์ก์ ์์ฑ ํจ์๋ฅผ ํธ์ถํจ์ผ๋ก์จ ์ด๋ฃจ์ด์ง๋ค.
addMessage({ id: 1, message: "๋ฆฌ๋์ค ๋ฐฐ์ฐ๊ธฐ" });
3. ๋ฆฌ๋์(Reducer)
๋ฆฌ๋์๋ ์ก์ ์ด ๋ฐ์ํ์ ๋ ์ํ(state)๋ฅผ ๋ณ๊ฒฝ์ํค๊ธฐ ์ํ ํจ์์ด๋ค. ๋ฆฌ๋์๋ ํ์ฌ ์ํ์ ์ก์ ๊ฐ์ฒด๋ฅผ ๋ฐ๊ณ , ์๋ก์ด ์ํ๋ฅผ ๋ฐํํ๋ค.
function message(state, action) { switch(action.type) { case 'ADD_MESSAGE': return { ...state, action.data } default: return state } }
์ฌ๊ธฐ์ ์ก์ ์ ์ ๋ฌํ ๋ถ๊ฐ์ ์ธ ๋ฐ์ดํฐ์ธ
data
๋action.data
์ ๊ฐ์ ํ์์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.4. ์คํ ์ด(Store)
ํ๋์ ์ฑ์๋ ๋จ ํ๋์ ์คํ ์ด๋ง ์กด์ฌํ๊ณ , ์ ์ผํ ์คํ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ์ ์ ์ฒด ์ํ๋ฅผ ๊ด๋ฆฌํ๋ค.
์คํ ์ด ์์ฑ์ ๋ค์๊ณผ ๊ฐ์ด ํ๋ค.import { createStore } from "redux"; import message from "./messageReducer"; const store = createStore(message);
redux์์ ์ ๊ณตํ๋ createStore ํจ์๋ฅผ ์ฌ์ฉํ๊ณ , ์ธ์๋ก ๋ฆฌ๋์๋ฅผ ์ ๋ฌํด ์ค๋ค.
5. ๋์คํจ์น(Dispatch)
๋์คํจ์น๋ ์คํ ์ด์ ๋ด์ฅ ํจ์ ์ค ํ๋์ด๋ค. ๋์คํจ์น๋ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ ์ ์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ด๋ค. ์ก์ ์ ๋ฆฌ๋์์๊ฒ ์ ๋ฌํด ์ํ๋ฅผ ๋ณ๊ฒฝ์ํจ๋ค.
6. ๊ตฌ๋ (Subscribe)
๊ตฌ๋ ์ ์คํ ์ด์ ๋ด์ฅ ํจ์ ์ค ํ๋์ด๋ค. ๋ฆฌ์ค๋ ํจ์๋ฅผ subscribe์ ์ ๋ฌํ์ฌ ํธ์ถํ๋ฉด ์ํ๊ฐ ์ ๋ฐ์ดํธ๋ ๋๋ง๋ค ํธ์ถ๋๋ค.
const listener = () => { console.log("Update!"); }; const unsubscribe = store.subscribe(listener); unsubscribe(); // ๊ตฌ๋ ์ ๋นํ์ฑํํ ๋ ํจ์๋ฅผ ํธ์ถํ๋ค
7. ์ ๋ ํฐ(Selector)
react-redux์์ ์ํ ๊ฐ์ ๊ฐ์ ธ์ฌ ๋ ์ฌ์ฉํ๋ค.
const message = useSelector((state) => state.message);
โ๏ธ Redux์ ์ฅ์
- redux๋ฅผ ์ฌ์ฉํ์ง ์์์ ๋์ ๋นํ๋ฉด ๋ณต์กํ๊ณ ์ด๋ ค์ด ์ํ ๊ด๋ฆฌ(props drilling ๋ฑ)๋ฅผ ์คํ ์ด ํ ๊ณณ์์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ํจ์จ์ ์ด๊ณ ๊ฐ๋จํ๊ฒ ํ ์ ์๋ค.
- ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ด๋ผ๋ ํน์ง์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ํ๋ฆ์ ํ์ ํ๊ธฐ ์ฝ๊ณ ๋๋ฒ๊น ํ๊ธฐ ์ฝ๋ค.
- ์ก์ ์ ๋์คํจ์น๋ก ์ ๋ฌํ ๋๋ง๋ค ๊ธฐ๋ก์ด ๋จ๊ธฐ ๋๋ฌธ์ ์๋ฌ๋ฅผ ์ฐพ๊ธฐ ์ฝ๋ค.
- ๋ฆฌ๋์๋ ๊ฐ์ input์ ์ ๋ ฅํ๋ฉด ๊ฐ์ output์ ์ถ๋ ฅํ๋ ์์ ํจ์์ด๊ธฐ ๋๋ฌธ์ ์ํ ๋ณํ๋ฅผ ์์ธกํ๊ธฐ ์ฝ๋ค.
โ๏ธ Redux์ ์ธ ๊ฐ์ง ์์น
1. Single source of truth
์ ์ฒด ์ํ๊ฐ์ด ํ๋์ ๊ฐ์ฒด๋ก ํํ๋๋ค.
๋์ผํ ๋ฐ์ดํฐ๋ ํญ์ ๊ฐ์ ๊ณณ์์ ๊ฐ์ง๊ณ ์จ๋ค → ๋จ ํ๋์ ์คํ ์ด๊ฐ ์๋ค๋ ์๋ฏธ2. State is read-only
state๋ ์ฝ๊ธฐ ์ ์ฉ์ด๋ค.
์ฝ๊ธฐ ์ ์ฉ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ์ ์ก์ ๊ฐ์ฒด๋ฟ์ด๋ค3. Changes are made with pure functions
์ํ์ ๋ณ๊ฒฝ์ ์์ ํจ์๋ก ์ด๋ฃจ์ด์ ธ์ผ ํ๋ค.
์ด ์์ ํจ์*๋ฅผ reducer(๋ฆฌ๋์)๋ผ๊ณ ํ๋ค. ๋ฆฌ๋์๋ ์ด์ ์ํ์ ์ก์ ์ ๋ฐ์ ๋ค์ ์ํ๋ฅผ ๋ฐํํ๋ ์์ ํจ์์ด๋ค.
*์์ ํจ์: ๊ฐ์ ์ธ์๊ฐ ๋ค์ด์ค๋ฉด ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ํจ์โ๏ธ Redux์ ์ ์ฌํ ์ํ ๊ด๋ฆฌ ํด
React์ Context API๋ฅผ ์ฌ์ฉํด ๋ณด์๋ค.
๋ด๊ฐ ๋๋ Context API์ Redux์ ์ฐจ์ด์ ์ ์๋์ ๊ฐ๋ค.Context API
๋ฆฌ์กํธ์์ ์ ๊ณตํ๋ ์์ฒด ์ ์ญ์ํ ๊ด๋ฆฌ API์ด๋ค.
Context API๋ก ๊ด๋ฆฌํ๋ ์ํ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ Provider๋ก ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ์ ์ฌ์ฉํด์ผ ํ๋ค.
์ฌ๊ธฐ์ ๊ฐ๊ธฐ ๋ค๋ฅธ Context๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ ๋ Provider๋ฅผ ๋ฐ๋ก ์ฌ๋ฌ ๋ฒ ์ฐ๋ ๊ฒฝ์ฐ๋, Provider๋ฅผ ์ค์ฒฉํด์ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธด๋ค.
<ItemContext.Provider value={{ items, setItems }}> <ShowContext.Provider value={{ isShow, setIsShow }}> {children} </ShowContext.Provider> </ItemContext.Provider>
์ ์ญ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ์ํ๋
useContext
๋ฅผ ์ฌ์ฉํด์ ๊บผ๋ด ์ธ ์ ์๋ค.const { item } = useContext(ItemContext);
Redux
Redux๋ก ๊ด๋ฆฌํ๋ ์ํ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ App ์ ์ฒด๋ฅผ Provider๋ก ๊ฐ์ธ์ ์ฌ์ฉํ๋๋ฐ, ์ฌ๋ฌ ์ํ๊ฐ ์๋๋ผ๋ store๋ฅผ ์ฌ์ฉํด ํ ๋ฐ ๋ชจ์ ์ ์๊ธฐ ๋๋ฌธ์ Provider๋ฅผ ํ ๋ฒ๋ง ์ฌ์ฉํ๋ฉด ์ด๋ค ์ปดํฌ๋ํธ์์๋ ๋ชจ๋ ์ํ๋ฅผ useSelector๋ฅผ ์ฌ์ฉํด ๊บผ๋ด ์ธ ์ ์๋ค.
โ๏ธ Redux๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์ ์ํฉ
ํ๋์ state๊ฐ ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์์ ๋ redux๋ฅผ ์ฌ์ฉํ๋ฉด ์ข๋ค.
redux๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ์, ๋ชจ๋ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๋ค๋ฉด ์ต์๋จ์ ์ปดํฌ๋ํธ, ์๋ฅผ ๋ค์ด App ์ปดํฌ๋ํธ์์ ๋ณ์๋ฅผ ์ ์ํ๊ณ ๊ทธ ๋ณ์๋ฅผ ๋ชจ๋ ์ปดํฌ๋ํธ์ ์ ๋ฌํด ์ฃผ์ด์ผ๊ฒ ์ง๋ง, redux๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ผ๋จ ๊ทธ ์ฝ๋์์ ์ ๋ฌํด ์ฃผ๋ ๊ฒ ์ค์ด๋ค๊ณ useSelector๋ฅผ ์ฌ์ฉํด์ ์ ์ญ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๊ท๋ชจ๊ฐ ํฐ ์ฑ์์๋ Redux๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ํ ๊ด๋ฆฌ์ ๋ฒ๊ฑฐ๋ก์์ ์ค์ฌ ์ค ์ ์๋ค.
'TECH' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] useMemo์ useCallback๋ก ๋ฆฌ์กํธ ๋ ๋๋ง ์ฑ๋ฅ ์ต์ ํํ๊ธฐ(Feat. React.memo) (0) 2022.04.09 [JavaScript] ๋ ๋์ ๋น๋๊ธฐ ํต์ (0) 2022.03.27 [React] Checkbox (2) โ ๋ฒํผ์ผ๋ก ์ ํ ํด์ ํ๊ธฐ (0) 2022.02.21 [React] Checkbox (1) โ Context API๋ก Checkbox ์ํ ๊ด๋ฆฌํ๊ธฐ (0) 2022.02.19 CLOVA Summary API ํ์ด์ฌ์ผ๋ก ์ฌ์ฉํ๊ธฐ (0) 2021.08.23