Jieunny์ ๋ธ๋ก๊ทธ
S3) Unit 4. [React] ์ํ ๊ด๋ฆฌ ๋ณธ๋ฌธ
๐ฃ ์ ์ญ ์ํ ๊ด๋ฆฌ
โ๏ธ ์ํ : UI ์ ๋์ ์ผ๋ก ํํ๋ ๋ฐ์ดํฐ
โฐ ์ํ๋ฅผ ๋ค๋ฃฐ ๋๋ Side Effect ๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ค!
โฐ Side Effect : ํจ์ ๋๋ ์ปดํฌ๋ํธ์ ์ ๋ ฅ ์ธ์๋ ํจ์์ ๊ฒฐ๊ณผ์ ์ํฅ์ ๋ฏธ์น๋ ์์ธ
- ๋คํธ์ํฌ ์์ฒญ (๋ฐฑ์๋ API ์์ฒญ)
โ๏ธ ๋ก์ปฌ ์ํ : ํน์ ์ปดํฌ๋ํธ ์์์๋ง ๊ด๋ฆฌ๋๋ ์ํ
โฐ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ์ง ์๋ ํผ ๋ฐ์ดํฐ๋ ๋๋ถ๋ถ ๋ก์ปฌ ์ํ์ด๋ค.
โฐ input box, select box ๋ฑ๊ณผ ๊ฐ์ด ์ ๋ ฅ๊ฐ์ ๋ฐ๋ ๊ฒฝ์ฐ
โ๏ธ ์ ์ญ ์ํ : ํ๋ก๋ํธ ์ ์ฒด ๋๋ ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ๊ด๋ฆฌ๋๋ ์ํ
โฐ ์๋ก ๋ค๋ฅธ ์ปดํฌ๋ํธ๊ฐ ๋์ผํ ์ํ๋ฅผ ๋ค๋ฃฌ๋ค๋ฉด, ์ด ์ถ์ฒ๋ ์ค์ง ํ ๊ณณ์ด์ด์ผ ํ๋ค.
โฐ ์ด ์ถ์ฒ๊ฐ '์ ์ญ ๊ณต๊ฐ' ์ด ๋๋ค.
โฐ ํ ๋ง ์ค์ , ๊ตญ์ ํ ์ค์ ๋ฑ์ด ์ ์ญ ์ํ์ ๋ํ์ ์ธ ์์์ด๋ค.
๐จ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ํด, ๋์ผํ ๋ฐ์ดํฐ๋ ํญ์ ๊ฐ์ ๊ณณ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์ค๋๋ก ํ์!!
๐จ Single source of truth ์์น์ ํ๋ก ํธ์๋ ๋ฟ๋ง ์๋๋ผ ๋ค์ํ ๊ณณ์์ ์ธ๊ธ๋๋ ์์น
โ๏ธ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํด๊ฒฐํด์ฃผ๋ ๋ฌธ์ ์
โฐ ์ ์ญ ์ํ๋ฅผ ์ํ ์ ์ฅ์๋ฅผ ์ ๊ณตํ๋ค.
โฐ props drilling ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
โ props drilling
โฐ ์ค๊ฐ์ ์กด์ฌํ๋ ์ปดํฌ๋ํธ๋ค์ ๊ตณ์ด ํ์ํ state๊ฐ ์๋์๋, ์๋ ์ปดํฌ๋ํธ์ ์ ๋ฌํด์ฃผ๊ธฐ ์ํด์ state๋ฅผ ์ ๋ฌ๋ฐ์์ผ ํ๋ ๊ฒ
๐ฃ Props Drilling ์ ๋ฌธ์ ์
โ๏ธ ๊ท๋ชจ๊ฐ ์ปค์ง๊ณ , ๊ตฌ์กฐ๊ฐ ๋ณต์กํด์ง๋ฉด์ props์ ์ ๋ฌ ๊ณผ์ ์ด ๋์ด๋๋ค๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
โฐ ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ๋งค์ฐ ๋๋น ์ง๋ค.
โฐ ์ฝ๋์ ์ ์ง๋ณด์ ๋ํ ํ๋ค์ด์ง๊ฒ ๋๋ค.
โฐ state ๋ณ๊ฒฝ์ Props ์ ๋ฌ ๊ณผ์ ์์ ๋ถํ์ํ๊ฒ ๊ด์ฌ๋ ์ปดํฌ๋ํธ๋ค ๋ํ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๋ค -> ์น์ฑ๋ฅ์ ์ ์ํฅ์ ์ค๋ค.
๐ฃ ํด๊ฒฐ ๋ฐฉ๋ฒ
โ๏ธ ์ปดํฌ๋ํธ์ ๊ด๋ จ์๋ state๋ ๋ ์ ์์ผ๋ฉด ๊ฐ๊น์ด ์ ์งํ๋ ๋ฐฉ๋ฒ
โ๏ธ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
๐ฃ Redux
โ๏ธ Redux : ์ ์ญ ์ํ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ์ ์ฅ์์ธ Store๋ฅผ ์ ๊ณตํ๋ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๐ฃ Redux์ ๊ตฌ์กฐ
โ๏ธ Redux์ ์ํ ๊ด๋ฆฌ ์์
1. ์ํ๊ฐ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด, ๋ณ๊ฒฝ๋ ์ํ์ ๋ํ ์ ๋ณด๊ฐ ๋ด๊ธด Action ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค.
2. ์ด Action ๊ฐ์ฒด๋ Dispatch ํจ์์ ์ธ์๋ก ์ ๋ฌ๋๋ค.
3. Dispatch ํจ์๋ Action ๊ฐ์ฒด๋ฅผ Reducer ํจ์๋ก ์ ๋ฌํด์ค๋ค.
4. Reducer ํจ์๋ Action ๊ฐ์ฒด์ ๊ฐ์ ํ์ธํ๊ณ , ๊ทธ ๊ฐ์ ๋ฐ๋ผ ์ ์ญ ์ํ ์ ์ฅ์ Store์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ค.
6. ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด, ๋ฆฌ์กํธ๋ ํ๋ฉด์ ๋ค์ ๋ ๋๋ง ํ๋ค.
โฐ Action -> Dispatch -> Reducer -> Store ์์๋ก ๋ฐ์ดํฐ๊ฐ ๋จ๋ฐฉํฅ์ผ๋ก ํ๋ฅด๊ฒ ๋๋ค.
๐ฃ Store
โ๏ธ ์ํ๊ฐ ๊ด๋ฆฌ๋๋ ์ค์ง ํ๋๋ฟ์ธ ์ ์ฅ์ ์ญํ ์ ํ๋ค.
โฐ Redux ์ฑ์ state๊ฐ ์ ์ฅ๋์ด ์๋ ๊ณต๊ฐ
import { createStore } from 'redux';
const store = createStore(rootReducer);
โฐ createStore ๋ฉ์๋๋ฅผ ํ์ฉํด์ Reducer๋ฅผ ์ฐ๊ฒฐํด์ Store๋ฅผ ์์ฑํ ์ ์๋ค.
๐ฃ Reducer
โ๏ธ Dispatch์๊ฒ์ ์ ๋ฌ๋ฐ์ Action ๊ฐ์ฒด์ type ๊ฐ์ ๋ฐ๋ผ์ ์ํ๋ฅผ ๋ณ๊ฒฝ์ํค๋ ํจ์
โฐ Reducer๋ '์์ ํจ์' ์ฌ์ผ ํ๋ค.
const count = 1
// Reducer๋ฅผ ์์ฑํ ๋์๋ ์ด๊ธฐ ์ํ๋ฅผ ์ธ์๋ก ์๊ตฌํฉ๋๋ค.
const counterReducer = (state = count, action) => {
// Action ๊ฐ์ฒด์ type ๊ฐ์ ๋ฐ๋ผ ๋ถ๊ธฐํ๋ switch ์กฐ๊ฑด๋ฌธ์
๋๋ค.
switch (action.type) {
//action === 'INCREASE'์ผ ๊ฒฝ์ฐ
case 'INCREASE':
return state + 1
// action === 'DECREASE'์ผ ๊ฒฝ์ฐ
case 'DECREASE':
return state - 1
// action === 'SET_NUMBER'์ผ ๊ฒฝ์ฐ
case 'SET_NUMBER':
return action.payload
// ํด๋น ๋๋ ๊ฒฝ์ฐ๊ฐ ์์ ๋ ๊ธฐ์กด ์ํ๋ฅผ ๊ทธ๋๋ก ๋ฆฌํด
default:
return state;
}
}
// Reducer๊ฐ ๋ฆฌํดํ๋ ๊ฐ์ด ์๋ก์ด ์ํ๊ฐ ๋ฉ๋๋ค.
โฐ ์ฌ๋ฌ ๊ฐ์ Reducer๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, Redux์ combineReducers ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ํ๋์ Reducer๋ก ํฉ์ณ์ค ์ ์๋ค.
import { combineReducers } from 'redux';
const rootReducer = combineReducers({
counterReducer,
anyReducer,
...
});
๐ฃ Action
โ๏ธ ์ด๋ค ์ก์ ์ ์ทจํ ๊ฒ์ธ์ง ์ ํด ๋์ ๊ฐ์ฒด
// payload๊ฐ ํ์ ์๋ ๊ฒฝ์ฐ
{ type: 'INCREASE' }
// payload๊ฐ ํ์ํ ๊ฒฝ์ฐ
{ type: 'SET_NUMBER', payload: 5 }
โฐ type์ ํด๋น Action ๊ฐ์ฒด๊ฐ ์ด๋ค ๋์์ ํ๋์ง ๋ช ์ํด์ฃผ๋ ์ญํ ์ ํ๊ธฐ ๋๋ฌธ์ ํ์๋ก ์ง์ ํด์ฃผ์ด์ผ ํ๋ค.
โฐ ๋๋ฌธ์์ Snake Case๋ก ์์ฑํ๋ฉฐ, ํ์์ ๋ฐ๋ผ payload๋ฅผ ์์ฑํด์ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ ์ ๋ฌํ๋ค.
โฐ ๋ณดํต Action์ ์ง์ ์์ฑํ๊ธฐ๋ณด๋ค๋ Action ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ํจ์๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ค -> ์ก์ ์์ฑ์
// payload๊ฐ ํ์ ์๋ ๊ฒฝ์ฐ
const increase = () => {
return {
type: 'INCREASE'
}
}
// payload๊ฐ ํ์ํ ๊ฒฝ์ฐ
const setNumber = (num) => {
return {
type: 'SET_NUMBER',
payload: num
}
}
๐ฃ Dispatch
โ๏ธ Reducer๋ก Action์ ์ ๋ฌํด์ฃผ๋ ํจ์
// Action ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ๋ ๊ฒฝ์ฐ
dispatch( { type: 'INCREASE' } );
dispatch( { type: 'SET_NUMBER', payload: 5 } );
// ์ก์
์์ฑ์(Action Creator)๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
dispatch( increase() );
dispatch( setNumber(5) );
โฐ Action ๊ฐ์ฒด๋ฅผ ์ ๋ฌ๋ฐ์ Dispatch ํจ์๋ Reducer๋ฅผ ํธ์ถํ๋ค.
๐ฃ Redux Hooks
โ๏ธ React-Redux์์ Redux๋ฅผ ์ฌ์ฉํ ๋ ํ์ฉํ ์ ์๋ Hooks ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
1๏ธโฃ useDispatch()
โ๏ธ Action ๊ฐ์ฒด๋ฅผ Reducer๋ก ์ ๋ฌํด ์ฃผ๋ Dispatch ํจ์๋ฅผ ๋ฐํํ๋ ๋ฉ์๋
import { useDispatch } from 'react-redux'
const dispatch = useDispatch()
dispatch( increase() )
console.log(counter) // 2
dispatch( setNumber(5) )
console.log(counter) // 5
2๏ธโฃ useSelector()
โ๏ธ ์ปดํฌ๋ํธ์ state๋ฅผ ์ฐ๊ฒฐํ์ฌ Redux์ state์ ์ ๊ทผํ ์ ์๊ฒ ํด์ฃผ๋ ๋ฉ์๋
// Redux Hooks ๋ฉ์๋๋ 'redux'๊ฐ ์๋๋ผ 'react-redux'์์ ๋ถ๋ฌ์ต๋๋ค.
import { useSelector } from 'react-redux'
const counter = useSelector(state => state)
console.log(counter) // 1
๐ฃ Redux ์ ์ธ ๊ฐ์ง ์์น
1๏ธโฃ Single source of truth
โฐ ๋์ผํ ๋ฐ์ดํฐ๋ ํญ์ ๊ฐ์ ๊ณณ์์ ๊ฐ์ง๊ณ ์์ผ ํ๋ค.
โฐ Redux์๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ Store๋ผ๋ ๋จ ํ๋๋ฟ์ธ ๊ณต๊ฐ์ด ์์๊ณผ ์ฐ๊ฒฐ ๋๋ ์์น
2๏ธโฃ State is read-only
โฐ ๋ฆฌ์กํธ์ state ์ฒ๋ผ Redux์ ์ํ๋ ์ง์ ๋ณ๊ฒฝํ ์ ์์์ ์๋ฏธํ๋ค.
โฐ Action ๊ฐ์ฒด๊ฐ ์์ด์ผ๋ง ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์์๊ณผ ์ฐ๊ฒฐ ๋๋ ์์น
3๏ธโฃ Changes are made with pure functions
โฐ ๋ณ๊ฒฝ์ ์์ ํจ์๋ก๋ง ๊ฐ๋ฅํ๋ค.
โฐ ์ํ๊ฐ ์๋ฑํ ๊ฐ์ผ๋ก ๋ณ๊ฒฝ๋๋ ์ผ์ด ์๋๋ก ์์ ํจ์๋ก ์์ฑ๋์ด์ผํ๋ Reducer ์ ์ฐ๊ฒฐ๋๋ ์์น
๐ ์ฐธ๊ณ ํ ๋งํ ๋ ํผ๋ฐ์ค ๋งํฌ
'CodeStates > learning contents' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
S3) Unit 5. [์ฌ์ฉ์ ์นํ ์น] ์น ์ ๊ทผ์ฑ (0) | 2023.03.02 |
---|---|
S3) Unit 5. [์ฌ์ฉ์ ์นํ ์น] ์น ํ์ค (0) | 2023.02.28 |
S3) Unit 3. [React] Custom Component (0) | 2023.02.20 |
S3) Unit 2. [์ฌ์ฉ์ ์นํ ์น] UI/UX (0) | 2023.02.15 |
S3) Unit 1. [์๋ฃ๊ตฌ์กฐ/์๊ณ ๋ฆฌ์ฆ] JSON.stringify (0) | 2023.02.14 |