๊ธฐ์กด์ ๋ด๊ฐ React ํ๋ก์ ํธ์ ์ฆ๊ฒจ ์ฌ์ฉํ๋ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ recoil ์ด์๋ค.
ํ์ง๋ง ์๋ก์ด ํ์ฌ์์๋ Mobx์ Redux๋ฅผ ์ฌ์ฉํ๊ณ ์์๋ค.
๊ทธ๋์ Redux ๊ณต๋ถ๋ฅผ ์ํด ๊ณต์ ํํ์ด์ง๋ฅผ ๋ณด๋ฉฐ ๊ฐ๋ ์ ๋ฆฌ๋ฅผ ํด๋ณด๋ ค๊ณ ํ๋ค.
Redux ๊ธฐ๋ณธ ๊ฐ๋
Redux๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฑ์ ์ํ ์์ธก ๊ฐ๋ฅํ ์ํ ์ปจํ ์ด๋๋ผ๊ณ ํ๋ค.
์ผ๊ด์ ์ผ๋ก ๋์ํ๊ณ ์๋ก ๋ค๋ฅธ ํ๊ฒฝ (์๋ฒ, ํด๋ผ์ด์ธํธ, ๋ค์ดํฐ๋ธ)์์ ์๋ํ๊ณ , ํ ์คํธ ํ๊ธฐ ์ฌ์ด ์ฑ์ ๋ง๋ค๋๋ก ๋์์ฃผ๋ฉฐ
Redux๋ React๋ฟ๋ง์๋๋ผ ๋ค๋ฅธ UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๋งค์ฐ ์์ ์ฉ๋(์์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํฌํจ 2KB)์ผ๋ก ์ฌ๋ฌ ๊ธฐ๋ฅ๋ค์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
Redux๋ ์๋ฐ์คํฌ๋ฆฝํธ SPA์์ ๊ฐ์ถ์ด์ผ ํ ์๊ฑด๋ค์ด ์ ์ ๋ณต์กํด์ง์ ๋ฐ๋ผ ๋ง์ ์ํ๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ก ๊ด๋ฆฌ ํ ํ์์ฑ๋๋ฌธ์ ๋ง๋ค์ด์ง๊ฒ ๋์๋ค๊ณ ํ๋ค.
์ฌ๊ธฐ์์ ์ํ๋ ์๋ฒ์๋ต, ์บ์ ๋ฐ์ดํฐ, ์ง์ญ์ ์ผ๋ก ์์ฑ๋์ด ์ฌ์ฉ์ค์ด์ง๋ง ์๋ฒ์ ์ ์ฅ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์๋ฏธํ๋ฉฐ,
์ด์ธ์๋ ํ์ฑํ๋ ๋ผ์ฐํธ, ์ ํ๋ ํญ, ๋ก๋ฉ์ ๋ณด์ฌ์ค์ง ์ฌ๋ถ, ํ์ด์ง๋ค์ด์ ์ปจํธ๋กค ๋ฑ์ ๋ค์ํ UI์ํ๋ ํฌํจ๋๋ค.
Redux์ ์ธ๊ฐ์ง ์์น
1. ์ง์ค์ ํ๋์ ๊ทผ์์ผ๋ก๋ถํฐ
์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ์ํ๋ ํ๋์ ์ ์ฅ์ ์์ ํ๋์ ๊ฐ์ฒด ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์ ์ฅ๋๋ค.
์๋ฒ๋ก๋ถํฐ ๊ฐ์ ธ์จ ์ํ๋ ์๋ฆฌ์ผ๋ผ์ด์ฆ(serialized)๋๊ฑฐ๋ ํจ์(hydrated)๋ก ์ ๋ฌ๋๋ฉฐ ํด๋ผ์ด์ธํธ์์ ์ถ๊ฐ์ ์ธ ์ฝ๋ฉ ์์ด๋ ์ฌ์ฉํ ์ ์๋ค. ๋ํ ํ๋์ ์ํ ํธ๋ฆฌ๋ง์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ฒ๊น ์๋ ์ฉ์ดํ๋ค.
console.log(store.getState())
/* Prints
{
visibilityFilter: 'SHOW_ALL',
todos: [
{
text: 'Consider using Redux',
completed: true,
},
{
text: 'Keep all state in a single tree',
completed: false
}
]
}
*/
2. ์ํ๋ ์ฝ๊ธฐ ์ ์ฉ์ด๋ค.
์ํ๋ฅผ ๋ณํ์ํค๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ๋ฌด์จ ์ผ์ด ๋ฒ์ด์ง๋ ์ง๋ฅผ ๋ฌ์ฌํ๋ ์ก์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ๋ฟ์ด๋ค.
๋ทฐ๋ ๋คํธ์ํฌ ์ฝ๋ฐฑ์์ ์ํ๋ฅผ ์ง์ ๋ฐ๊พธ์ง ๋ชป ํ๋ฉฐ ๋ชจ๋ ์ํ ๋ณํ๋ ์ค์์์ ๊ด๋ฆฌ๋๊ณ ๋ชจ๋ ์ก์ ์ ์๊ฒฉํ ์์์ ์ํด ํ๋ํ๋ ์คํ๋๊ธฐ ๋๋ฌธ์ ์ ๊ฒฝ์จ์ ๊ด๋ฆฌํด์ผํ ๊ฒฝ์ ์ํ๋ ์๋ค. ์ก์ ์ ํ๋ฒํ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ก์ ๋จ๊ธธ์ ์๊ณ , ์๋ฆฌ์ผ๋ผ์ด์ฆ(serialized) ํ ์ ์์ผ๋ฉฐ ์ ์ฅํ ์ ์๊ณ ์ดํ์ ํ ์คํธ๋ ๋๋ฒ๊น ์ ์ํด์ ์ฌํํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
store.dispatch({
type: 'COMPLETE_TODO',
index: 1
})
store.dispatch({
type: 'SET_VISIBILITY_FILTER',
filter: 'SHOW_COMPLETED'
})
3. ๋ณํ๋ ์์ ํจ์๋ก ์์ฑ๋์ด์ผ ํ๋ค.
์ก์ ์ ์ํด ์ํ ํธ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ๋ณํํ๋ ์ง๋ฅผ ์ง์ ํ๊ธฐ ์ํด ํ๋ก๊ทธ๋๋จธ๋ ์์ ๋ฆฌ๋์๋ฅผ ์์ฑํด์ผ ํ๋ค.
๋ฆฌ๋์๋ ์ด์ ์ํ์ ์ก์ ์ ๋ฐ์ ๋ค์ ์ํ๋ฅผ ๋ฐํํ๋ ์์ ํจ์์ด๋ค. ์ด์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋์ ์๋ก์ด ์ํ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ๋ฐํํด์ผ ํ๋ฉฐ, ์ฒ์์๋ ํ๋์ ๋ฆฌ๋์๋ง์ผ๋ก ์ถฉ๋ถํ์ง๋ง, ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฑ์ฅํด๋๊ฐ๋ฉด ์ํ ํธ๋ฆฌ์ ํน์ ํ ๋ถ๋ถ๋ค์ ์กฐ์ํ๋ ๋ ์์ธ ๋ฆฌ๋์๋ก ๋๋๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค. ๋ฆฌ๋์๋ ์์ ํจ์์ด๊ธฐ๋๋ฌธ์ ํธ์ถ๋๋ ์์๋ฅผ ์ ํ๊ฑฐ๋ ์ถ๊ฐ์ ์ธ ๋ฐ์ดํฐ๋ฅผ ๋๊ธธ ์๋ ์๋ค. ํ์ด์ง๋ค์ด์ ๊ณผ ๊ฐ์ด ์ผ๋ฐ์ ์ธ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฆฌ๋์๋ฅผ ์์ฑํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
function visibilityFilter(state = 'SHOW_ALL', action) {
switch (action.type) {
case 'SET_VISIBILITY_FILTER':
return action.filter
default:
return state
}
}
function todos(state = [], action) {
switch (action.type) {
case 'ADD_TODO':
return [
...state,
{
text: action.text,
completed: false
}
]
case 'COMPLETE_TODO':
return state.map((todo, index) => {
if (index === action.index) {
return Object.assign({}, todo, {
completed: true
})
}
return todo
})
default:
return state
}
}
import { combineReducers, createStore } from 'redux'
const reducer = combineReducers({ visibilityFilter, todos })
const store = createStore(reducer)
Redux ์ฉ์ด
- ์ํ(State)
type State = any
์ํ(์ํ ํธ๋ฆฌ๋ผ๊ณ ๋ ํจ.)๋ ๋์ ์๋ฏธ์ ๋จ์ด์ง๋ง Redux API์์๋ ๋ณดํต ์ ์ฅ์์ ์ํด ๊ด๋ฆฌ๋๊ณ , getState() ์ ์ํด ๋ฐํ๋๋ ํ๋์ ์ํ๊ฐ์ ์ง์นญํ๋ค. ์ํ๋ Redux ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ์ํ๋ฅผ ๋ํ๋ด๋ฉฐ ๋ณดํต ๊น๊ฒ ์ค์ฒฉ๋์ด ์๋ ๊ฐ์ฒด์ด๋ค. JSON์ผ๋ก ์ฝ๊ฒ ๋ณํ๋ ์ ์๋ ๊ฒ๋ค์ ์์ ๋ฃ์ง ๋ง๋ผ๊ณ ํ๋ค.
- ์ก์ (Action)
type Action = Object
์ก์ ์ ์ํ๋ฅผ ๋ณํ์ํค๋ ค๋ ์๋๋ฅผ ํํํ๋ ๊ฐ์ฒด๋ก, ์ ์ฅ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ด๋ค. UI์ด๋ฒคํธ์์ ์ค๊ฑฐ๋, ๋คํธ์ํฌ ์ฝ๋ฐฑ์์ ์๊ฑฐ๋, ์น์์ผ๊ณผ ๊ฐ์ ๋ค๋ฅธ ์์ค์์ ์๊ฑฐ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ ์ก์ ์ ํตํด ๋ณด๋ด์ง๋ค.
์ก์ ์ ์ด๋ค ํํ์ ์ก์ ์ด ํํด์ง์ง ํ์ํ๋ type ํ๋๋ฅผ ๊ฐ์ ธ์ผํ๋ฉฐ, ํ์ ์ ์์๋ก ์ ์๋๊ณ ๋ค๋ฅธ ๋ชจ๋์์ ์ํฌํธ ํ ์ ์๋ค.
๋ฌธ์์ด์ ์ง๋ ฌํ๋ ์ ์๊ธฐ ๋๋ฌธ์ ํ์ ์ผ๋ก Symbol๋ณด๋ค๋ ๋ฌธ์์ด์ ์ฐ๋๊ฒ ์ข๋ค.
์ก์ ๊ฒฉ์ฒด์์ type์ธ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ฌ์ฉ์ ๋ง์๋๋ก ์ฌ์ฉํ๋ฉด ๋๋ค๊ณ ํ๋ค. Flux Standard Action์์ ์ก์ ์ด ์ด๋ป๊ฒ ๊ตฌ์๋์ด์ผ ํ๋์ง ๊ถ์ฅ์ฌํญ์ ์์๋ณผ ์ ์๋ค.
- ๋ฆฌ๋์(Reducer)
type Reducer<S, A> = (state: S, action: A) => S
๋ฆฌ๋์(๋ฆฌ๋์ฑ ํจ์๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํจ.)๋ ๋์ ๊ฐ๊ณผ ๊ฐ์ ๋ฐ์์ ์๋ก์ด ๋์ ๊ฐ์ ๋ฐํํ๋ ํจ์์ด๋ค. ๊ฐ๋ค์ ์ปฌ๋ ์ ์ ๋ฐ์์ ํ๋์ ๊ฐ์ผ๋ก ์ค์ด๋๋ฐ ์ฌ์ฉ๋๋ค.
๋ฆฌ๋์๋ Redux๋ง์ ๊ฐ๋ ์ ์๋๊ณ , ๊ธฐ๋ณธ ๊ฐ๋ ์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์ ์๋ค๊ณ ํ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์์๋ Array.prototype.reduce() ๊ฐ ํด๋น๋๋ค.
Redux์์ ๋์ ๊ฐ์ ์ํ ๊ฐ์ฒด์ด๊ณ , ๋์ ๋ ๊ฐ์ ์ก์ ์ด๋ค. ๋ฆฌ๋์๋ ์ฃผ์ด์ง ์ด์ ์ํ์ ์ก์ ์์ ์๋ก์ด ์ํ๋ฅผ ๊ณ์ฐํ๋ค. ๋ฆฌ๋์๋ ๋ฐ๋์ ๊ฐ์ ์ ๋ ฅ์ด ์์ผ๋ฉด ๊ฐ์ ์ถ๋ ฅ์ ๋ฐํํ๋ ์์ ํจ์์ฌ์ผ๋ง ํ๋ฉฐ, ๋ถ์ํจ๊ณผ๋ฅผ ๊ฐ์ ธ์๋ ์๋๋ค. ๋ฆฌ๋์๋ Redux์์ ๊ฐ์ฅ ์ค์ํ ๊ฐ๋ ์ผ๋ก, API ํธ์ถ์ ๋ฆฌ๋์ ์์ ๋ฃ์ง ๋ง๋ผ๊ณ ๊ฒฝ๊ณ ํ๋ค.
- ๋์คํจ์น ํจ์(Dispatch)
type BaseDispatch = (a: Action) => Action
type Dispatch = (a: Action | AsyncAction) => any
๋์คํจ์น ํจ์๋ ์ก์ ์ด๋ ๋น๋๊ธฐ ์ก์ ์ ๋ฐ๋ ํจ์์ด๋ค. ๋ฐ์ ๋ค์ ํ๋ ๋๋ ์ฌ๋ฌ๊ฐ์ ์ก์ ์ ์ ์ฅ์์ ๋ณด๋ด๊ฑฐ๋ ๋ณด๋ด์ง ์์ ์๋ ์๋ค.
๋ณดํต์ ๋์คํจ์น ํจ์์, ์ ์ฅ์ ์ธ์คํด์ค๊ฐ ๋ฏธ๋ค์จ์ด๋ฅผ ๊ฑฐ์น์ง ์๊ณ ์ ๊ณตํ๋ ๊ธฐ๋ณธ dispatch ํจ์๋ฅผ ๊ตฌ๋ถํด์ผ ํ๋ค.
๊ธฐ๋ณธ ๋์คํจ์น ํจ์๋ ๋ฐ๋์ ๋๊ธฐ์ ์ผ๋ก ์ ์ฅ์์ ๋ฆฌ๋์์ ์ก์ ์ ๋ณด๋ด์ผ ํ๋ฉฐ, ๋ฆฌ๋์๋ ์ ์ฅ์๊ฐ ๋ฐํํ ์ด์ ์ํ์ ํจ๊ป ์ ์ํ๋ฅผ ๊ณ์ฐํ๋ค. ๋ฆฌ๋์๊ฐ ์ฌ์ฉํ๊ธฐ ์ํด ์ก์ ์ ํ๋ฒํ ๊ฐ์ฒด์ฌ์ผ ํ๋ค.
๋ฏธ๋ค์จ์ด๋ ๊ธฐ๋ณธ ๋์คํจ์น ํจ์๋ฅผ ๊ฐ์ผ๋ค. ๋ฏธ๋ค์จ์ด๋ฅผ ํตํด ๋์คํจ์น ํจ์๋ ์ก์ ๋ฟ ์๋๋ผ ๋น๋๊ธฐ ์ก์ ์ ์ฒ๋ฆฌํ ์ ์๋ค.
๋ฏธ๋ค์จ์ด๋ ์ก์ ์ด๋ ๋น๋๊ธฐ ์ก์ ์ ๋ค์ ๋ฏธ๋ค์จ์ด์ ๋๊ธฐ๊ธฐ ์ ์ ๋ณํํ๊ฑฐ๋, ์ง์ฐ์ํค๊ฑฐ๋, ๋ฌด์ํ๊ฑฐ๋, ํด์ํ ์ ์๋ค.
- ์ก์ ์์ฐ์(ActionCreator)
type ActionCreator<A, P extends any[] = any[]> = (...args: P) => Action | AsyncAction
์ก์ ์์ฐ์๋ ์ก์ ์ ๋ง๋๋ ํจ์์ด๋ค. ์ก์ ์ ์ ๋ณด์ ๋ฌถ์์ด๊ณ , ์ก์ ์์ฐ์๋ ์ก์ ์ ๋ง๋๋ ๊ณณ์ด๋ผ์ ๋ ์ฉ์ด๋ฅผ ํผ๋ํ๋ฉด ์๋๋ค.
์ก์ ์์ฐ์๋ฅผ ํธ์ถํ๋ฉด ์ก์ ์ ๋ง๋ค์ด๋ผ ๋ฟ ๋์คํจ์น ํ์ง๋ ์๋๋ค. ์ ์ฅ์๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด์๋ dispatch ํจ์๋ฅผ ํธ์ถํด์ผ ํ๋ค.
์ก์ ์์ฐ์๋ฅผ ํธ์ถํ์ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅ์ ์ธ์คํด์ค๋ก ๋ฐ๋ก ๋์คํจ์น ํ๋ ํจ์๋ฅผ ๋ฐ์ธ๋๋ ์ก์ ์์ฐ์๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํ๋ค.
์ก์ ์์ฐ์๊ฐ ํ์ฌ ์ํ๋ฅผ ์ฝ์ด์ผ ํ๊ฑฐ๋, API ํธ์ถ์ ์คํํด์ผ ํ๊ฑฐ๋, ๋ผ์ฐํธ ์ ํ๊ฐ์ ๋ถ์ํจ๊ณผ๋ฅผ ์ผ์ผ์ผ์ผ ํ๋ค๋ฉด ์ก์ ๋์ ๋น๋๊ธฐ ์ก์ ์ ๋ฐํํด์ผ ํ๋ค.
- ๋น๋๊ธฐ ์ก์ (AsyncAction)
type AsyncAction = any
๋น๋๊ธฐ ์ก์ ์ ๋์คํจ์น ํจ์๋ก ๋ณด๋ด์ง๋ ๊ฐ์ด์ง๋ง ์์ง ๋ฆฌ๋์์๊ฒ ๋ฐ์๋ค์ฌ์ง ์ค๋น๊ฐ ๋์ด์์ง๋ ์๋ค. ๋น๋๊ธฐ ์ก์ ์ ๊ธฐ๋ณธ dispatch() ํจ์๋ก ์ ๋ฌ๋๊ธฐ ์ ์ ๋ฏธ๋ค์จ์ด๋ฅผ ํตํด ์ก์ ์ผ๋ก ๋ฐ๋์ด์ผ ํ๋ค. ๋น๋๊ธฐ ์ก์ ์ ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ๋ ๋ฏธ๋ค์จ์ด์ ๋ฐ๋ผ ์๋ก ๋ค๋ฅธ ํ์ ์ด ๋ ์ ์๋ค.
- ๋ฏธ๋ค์จ์ด(Middleware)
type MiddlewareAPI = { dispatch: Dispatch, getState: () => State }
type Middleware = (api: MiddlewareAPI) => (next: Dispatch) => Dispatch
๋ฏธ๋ค์จ์ด๋ ๋์คํจ์น ํจ์๋ฅผ ๊ฒฐํฉํด์ ์ ๋์คํจ์น ํจ์๋ฅผ ๋ฐํํ๋ ๊ณ ์ฐจํจ์์ด๋ค. ๋ฏธ๋ค์จ์ด๋ ์ข ์ข ๋น๋๊ธฐ ์ก์ ์ ์ก์ ์ผ๋ก ์ ํํ๋ค.
๋ฏธ๋ค์จ์ด๋ ํจ์ ๊ฒฐํฉ์ ํตํด ์๋ก ๊ฒฐํฉํ ์ ์๋ค. ์ก์ ์ ๋ก๊น ํ๊ฑฐ๋, ๋ผ์ฐํ ๊ณผ ๊ฐ์ ๋ถ์ํจ๊ณผ๋ฅผ ์ผ์ผํค๊ฑฐ๋, ๋น๋๊ธฐ API ํธ์ถ์ ๋๊ธฐ ์ก์ ์ผ๋ก ๋ฐ๊พธ๋๋ฐ ์ ์ฉํ๋ค.
applyMiddleware(...middlewares)๋ฅผ ํตํด ๋ ์์ธํ ์์๋ณผ ์ ์๋ค.
- ์ ์ฅ์(Store)
type Store = {
dispatch: Dispatch,
getState: () => State,
subscribe: (listener: () => void) => () => void,
replaceReducer: (reducer: Reducer) => void
}
์ ์ฅ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ํธ๋ฆฌ๋ฅผ ๊ฐ์ง ๊ฐ์ฒด์ด๋ค. ๋ฆฌ๋์ ์์ค์์ ๊ฒฐํฉ์ด ์ผ์ด๋๊ธฐ ๋๋ฌธ์ Redux ์ฑ์๋ ๋จ ํ๋์ ์ ์ฅ์๋ง ์์ด์ผ ํ๋ค.
- dispatch(action)๋ ์์์ ์ค๋ช ํ ๊ธฐ๋ณธ ๋์คํจ์น ํจ์์ด๋ค.
- getState()๋ ์ ์ฅ์์ ํ์ฌ ์ํ๋ฅผ ๋ฐํํ๋ค.
- subscribe(listener)๋ ์ํ๊ฐ ๋ฐ๋ ๋ ํธ์ถ๋ ํจ์๋ฅผ ๋ฑ๋กํ๋ค.
- replaceReducer(nextReducer)๋ ํซ ๋ฆฌ๋ก๋ฉ๊ณผ ์ฝ๋ ๋ถํ ์ ๊ตฌํํ ๋ ์ฌ์ฉ๋๋ฉฐ ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ ์ผ์ ๋ณ๋ก ์๋ค.
์ ์ฅ์ API ๋ ํผ๋ฐ์ค ์ฐธ๊ณ
- ์ ์ฅ์ ์์ฐ์(StoreCreator)
type StoreCreator = (reducer: Reducer, preloadedState: ?State) => Store
์ ์ฅ์ ์์ฐ์๋ Redux ์ ์ฅ์๋ฅผ ๋ง๋๋ ํจ์์ด๋ค. ๋์คํจ์น ํจ์์ ๋ง์ฐฌ๊ฐ์ง๋ก Reduxํจํค์ง์ ๋ค์ด์๋ ๊ธฐ๋ณธ ์ ์ฅ์ ์์ฐ์์ธ creatorStore(reducer, preloadedState) ์ ์ ์ฅ์ ์ธํธ์์ ๋ฐํ๋๋ ์ ์ฅ์ ์์ฐ์๋ฅผ ๊ตฌ๋ถํด์ผ ํ๋ค.
- ์ ์ฅ์ ์ธํธ์(StoreEnhancer)
type StoreEnhancer = (next: StoreCreator) => StoreCreator
์ ์ฅ์ ์ธํธ์๋ ์ ์ฅ์ ์์ฐ์๋ฅผ ๊ฒฐํฉํ์ฌ ๊ฐํ๋ ์ ์ ์ฅ์ ์์ฐ์๋ฅผ ๋ฐํํ๋ ๊ณ ์ฐจํจ์์ด๋ค. ๋ฏธ๋ค์จ์ด์ ๋น์ทํ๊ฒ ์กฐํฉ ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ์ ์ฅ์ ์ธํฐํ์ด์ค๋ฅผ ๋ฐ๊ฟ ์ ์๊ฒ ํด์ค๋ค.
์ ์ฅ์ ์ธํธ์๋ React์์ "์ปดํฌ๋ํธ ์ธํธ์"๋ก ๋ถ๋ฆฌ๋ ๊ณ ์ฐจ ์ปดํฌ๋ํธ์ ๊ฐ์ ๊ฐ๋ ์ด๋ค.
์ ์ฅ์๋ ์ธ์คํด์ค๋ผ๊ธฐ๋ณด๋ค ํจ์๋ค์ด ๋ชจ์ธ ์ผ๋ฐ์ ์ธ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด์ ์ ์ฅ์๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ๋ณต์ ๋ณธ์ ๋ง๋ค๊ณ ์์ ํ ์ ์๋ค.
compose ๋ฌธ์ ์์ ์ฐธ๊ณ .
์ถ์ฒ