์ ๋ React.js์ Flux๋ก ๋น๋ ๋ ์ฑํ
์ฑ ์ ๋ง๋ค๊ณ ์์ต๋๋ค. Redux์ ๋ฌธ์๋ฅผ ์ฝ์ ๋ combineReducer
ํจ์๊ฐ ์ด์ํ๊ฒ ๋ณด์
๋๋ค. ์๋ฅผ ๋ค๋ฉด :
messageStore
, unreadStore
, threadStore
๋ผ๋ ์ธ ๊ฐ์ ์์ ์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ NEW_MESSAGE
๋ผ๋ ์ก์
์ด โโ์์ต๋๋ค. ์ธ ์์ ๋ชจ๋ ์ ๋ฉ์์ง๋ก ์
๋ฐ์ดํธ๋ฉ๋๋ค. Redux์์ ์ ์ฅ์๋ ๋ค์๊ณผ ๊ฐ์ด combineReducer
์ ๊ฒฐํฉ ๋ ๊ฐ์๊ธฐ์
๋๋ค.
message = (state=[], action) ->
switch action.type
when NEW_MESSAGE
state # new state
unread = (state=[], action) ->
switch action.type
when NEW_MESSAGE
state # new state
thread = (state=[], action) ->
switch action.type
when NEW_MESSAGE
state # new state
combineReducer {message, unread, thread}
๊ทธ๋ฐ ๊ฒฝ์ฐ์๋ ๋ฆฌ๋์๋ฅผ ์ชผ๊ฐ๋ ๊ฒ์ด ๋ด ์ถ์ ๋ ์ฝ๊ฒ ๋ง๋ค์ด์ฃผ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ immutable-js๋ก ๊ตฌ์ถ ๋ ๊ฑฐ๋ํ ์์ ์ด์ด๋ฅผ์ํ ๋ ๋์ ์๋ฃจ์ ์ผ ์ ์์ต๋๋ค. ์ฒ๋ผ:
initialState = Immutable.fromJS
message: []
unread: []
thread: []
allStore = (store=initialState, action) ->
switch action.type
when NEW_MESSAGE
initialState
.updateIn ['message'], (messages) -> messages # updated
.updateIn ['urnead'], (urneads) -> unreads # updated
.updateIn ['thread'], (threads) -> threads # updated
์ด ๊ฒฝ์ฐ combineReducers
์ด ๋์์ด๋์ง ์๋๋ค๊ณ ์๊ฐํ๋ ์ด์ ๋ฅผ ์ค๋ช
ํด ์ฃผ์๊ฒ ์ต๋๊น? ์ค์ ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ ์ํ์ ๊ฒฝ์ฐ ๋จ์ผ ๋ฆฌ๋์ (๊ทธ๋ฆฌ๊ณ UI ์ํ์ ๋ํ ๋ค๋ฅธ ๋ฆฌ๋์ (์ : ์ ํ๋ ํญ๋ชฉ ๋ฑ))๊ฐ ํ์ํ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
๋ํ๋ณด์ญ์์ค:
https://github.com/rackt/redux/tree/master/examples/real-world/reducers
https://github.com/rackt/redux/blob/master/examples/async/reducers
์๊ฐ์ ์ป๊ธฐ ์ํด.
๋น์ ์ด ์ง์ ํ ์ฒซ ๋ฒ์งธ ์๋ ๋ด ๊ฒฝ์ฐ์ ๋น์ทํฉ๋๋ค. requestType
๋ ๋ ๊ฐ์๊ธฐ์์ ๋ชจ๋ ์ฒ๋ฆฌ๋ฉ๋๋ค.
https://github.com/rackt/redux/blob/master/examples/real-world/reducers/paginate.js#L28
๊ฐ์๊ธฐ๋ฅผ ๋ถํ ํ๋ฉด ๋ ๊ฐ์๊ธฐ๊ฐ ๋ค๋ฅธ ๊ฐ์๊ธฐ์ ๋ถ๋ฆฌ ๋ ๋ ์ ์ง ๊ด๋ฆฌ๊ฐ ๋ ์ฌ์์ง๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ค์ด ๋์ผํ ํ๋์ํ๊ฒ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํฉ๋๋ค.
unread
๋ก message
, ์ฌ์ง์ด์์ ์๋ก์ด ์ค๋ ๋์ ๊ฐ์ ๋ฉ์์ง ์ด์ง message
์ thread
). ๊ทธ๋์ ์ง๊ธ ๋ค๋ฅธ ๊ฐ์๊ธฐ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํ ์๋ ์์ต๋๋ค.์ด ๋ ๊ฐ์ง ๋ฌธ์ ์ ๋ํ ์ข์ ํด๊ฒฐ์ฑ ์ ์ฐพ์ง ๋ชปํ์ต๋๋ค. ์ฌ์ค ์ ๋์ด ๋ ๊ฐ์ง ๋ฌธ์ ์ ๋ํด ์์ ํ ํ์ ํ์ง ๋ชปํฉ๋๋ค.
์ด๋ฌํ ์์ ์ ์ํด์๋ ์ฌ๋ฌ ๊ฐ์๊ธฐ (๋๋ ์ฑ์ด ์ปค์ง ํ ํ์ผ)์์ ์ ์งํด์ผํฉ๋๋ค. ํ์ฌ ์ฝ๋๋ฒ ์ด์ค์์ ์ฐ๋ฆฌ๋ ์ด๋ฏธ ๋์ผํ ์์ ์ ์ฒ๋ฆฌํ๋ 5 ๊ฐ์ ์์ ์ ๋ณด์์ต๋๋ค. ์ ์ง ๊ด๋ฆฌ๊ฐ ์ฝ๊ฐ ์ด๋ ต์ต๋๋ค.
์ด๊ฒ์ด ์ข์์ง ๋์์ง ์ฌ๋ถ๋ ์ฑ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ๋ด ๊ฒฝํ์ ๋์ผํ ์์ ์ ์ฒ๋ฆฌํ๋ ๋ง์ ์์ (๋๋ Redux ๊ฐ์๊ธฐ)์ด์๋ ๊ฒ์ ์ค์ ๋ก ๋งค์ฐ ํธ๋ฆฌํฉ๋๋ค. ์ด๋ ์ฑ ์์ ๋๋๊ณ ์ฌ๋๋ค์ด ๋๋จธ์ง ํ๊ณผ ์ถฉ๋ํ์ง ์๊ณ ๊ธฐ๋ฅ ๋ถ๊ธฐ์์ ์์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ด ๊ฒฝํ์ ํ๋์ ๊ฑฐ๋ํ ๋์ฐ๋ณ์ด๋ณด๋ค ๊ด๋ จ๋์ง ์์ ๋์ฐ๋ณ์ด๋ฅผ ๋ณ๋๋ก ์ ์งํ๋ ๊ฒ์ด ๋ ์ฝ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ด ๋๋ฌด ์ ์๋ํ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ๋๋ ๊ทธ๋ค์ด ์ข ์ข ์ฐจ์ ์ํ ๋ชจ๋ธ์ ์ฆ์์ด๋ผ๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด
์ด๋ค ๊ฒฝ์ฐ์๋ ํ ๋ฆฌ๋์๊ฐ ๋ค๋ฅธ ๋ฆฌ๋์์ ๋ฐ์ดํฐ์ ์์กด ํ ์ ์์ต๋๋ค (๋ฉ์์ง๋ฅผ ์ฝ์ง ์์ ์ํ์์ ๋ฉ์์ง๋ก ์ด๋ํ๊ฑฐ๋ ๋ฉ์์ง๋ฅผ ์ ์ค๋ ๋๋ก ๋ฉ์์ง๋ฅผ ๋ฉ์์ง์์ ์ค๋ ๋๋ก ์น๊ฒฉํ๋ ๋ฑ).
๋ฌธ์ ์ ์ฆ์์
๋๋ค. ์ํ ๋ด์์ ๋ฌผ๊ฑด์ ๋ง์ด ์ด๋ํด์ผํ๋ ๊ฒฝ์ฐ ์ํ ๋ชจ์์ ๋ ํ์คํํด์ผ ํ ์ ์์ต๋๋ค. ๋์ { readMessages, unreadMessages }
๋น์ ์ ํ ์ ์์ต๋๋ค { messagesById, threadsById, messageIdsByThreadIds }
. ๋ฉ์์ง๋ฅผ ์ฝ์์ต๋๊น? ์ข์ต๋๋ค. state.messagesById[id].isRead
ํฉ๋๋ค. ์ค๋ ๋์ ๋ํ ๋ฉ์์ง๋ฅผ ์ฝ๊ณ ์ถ์ต๋๊น? state.threadsById[threadId].messageIds
๋ฅผ ์ ํํ ๋ค์ messageIds.map(id => state.messagesById[id])
ํ์ธ์.
๋ฐ์ดํฐ๊ฐ ์ ๊ทํ๋๋ฉด ํ ๋ฐฐ์ด์์ ๋ค๋ฅธ ๋ฐฐ์ด๋ก ํญ๋ชฉ์ ๋ณต์ฌ ํ ํ์๊ฐ ์์ต๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํ๋๊ทธ๋ฅผ ๋ค์ง๊ฑฐ๋ ID๋ฅผ ์ถ๊ฐ / ์ ๊ฑฐ / ์ฐ๊ฒฐ / ์ฐ๊ฒฐ ํด์ ํฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ ์๋ํ๊ณ ์ถ์ต๋๋ค.
redux๋ฅผ ์๋ํ๊ธฐ ์ํด ๋ฐ๋ชจ ํ์ด์ง๋ฅผ ์์ฑํ์ต๋๋ค. ๋๋ combineReducer
๊ฐ ๋์๊ฒ ์๋นํ ๋ณต์กํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ชจ๋ ์์ ๋ combineReducer
๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ฌ์ ํ ๋ด ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ JavaScript ๊ฐ์ฒด๊ฐ ์๋ ๋จ์ผ ๋ถ๋ณ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ๋ชจ๋ธ๋ก ์ฌ์ฉํ ์ ์์ต๋๊น?
@jiyinyiyong ๋น์ ์ด ๋งํ๋ ๋ณต์ก์ฑ์ด ๋ฌด์์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง combineReducers
์ฌ์ฉํ์ง ์์๋๋ฉ๋๋ค. ๋์ฐ๋ฏธ ์ผ๋ฟ์
๋๋ค. ๋์ Immutable์ ์ฌ์ฉํ๋ ์ ์ฌํ ๋์ฐ๋ฏธ๋ฅผ ํ์ธํ์ญ์์ค. ๋ฌผ๋ก ์์ ๋ง์ ๊ธ์ ์ฐ์ธ์.
๋๋ ์ฃผ๋ก Immutable.js๋ฅผ ์ง์ํ๊ธฐ ์ํด combineReducers()
๋์ฐ๋ฏธ๋ฅผ ์์ฑํ์ง๋ง ๋ฃจํธ ๊ฐ์๊ธฐ์ฒ๋ผ ์ทจ๊ธ๋๋ ์ถ๊ฐ ๊ฐ์๊ธฐ๊ฐ ํ์ํ ์ ์์ต๋๋ค.
https://github.com/jokeyrhyme/wow-healer-bootcamp/blob/master/utils/combineReducers.js
์ฒซ ๋ฒ์งธ ์ธ์๋ ์ํ์ ๋ชจ์๊ณผ ์ผ์นํ๊ณ ์ต์์ ํ์ ์ํ๋ฅผ ์ ๊ณตํ๋ ์ผ์นํ๋ ํ์ ๊ฐ์๊ธฐ์ ์ ๋ฌํฉ๋๋ค. ์ด๊ฒ์ ๊ณต์ ๋ฒ์ ๊ณผ ๊ฑฐ์ ๋์ผํฉ๋๋ค.
๊ทธ๋ฌ๋ 0 ๊ฐ ์ด์์ ์ถ๊ฐ ์ธ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ ํ ์ฌํญ์ด๋ฉฐ ๋ค๋ฅธ ๋ฃจํธ ๋ฆฌ๋์์ฒ๋ผ ์ทจ๊ธ๋ฉ๋๋ค. ์ด ๊ฐ์๊ธฐ๋ ์์ ํ ์ํ๋ก ์ ๋ฌ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ถ์ฅ๋๋ ํ์ ๊ฐ์ ๊ธฐ ํจํด๋ณด๋ค ๋ ๋ง์ ์ก์ธ์ค๊ฐ ํ์ํ ๋ฐฉ์์ผ๋ก ์์ ์ ์ ๋ฌํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋จ์ฉํ๋ ๊ฒ์ ๋ถ๋ช ํ ์ข์ ์๊ฐ์ ์๋์ง๋ง ์ฌ๋ฌ ๊ฐ์ ํ์ ๊ฐ์๊ธฐ์ ์ฌ๋ฌ ๊ฐ์ ๋ฃจํธ ๊ฐ์๊ธฐ๋ฅผ ๊ฐ๋ ๊ฒ์ด ์ข์ ์ด์ํ ๊ฒฝ์ฐ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค.
์ฌ๋ฌ ๋ฃจํธ ๋ฆฌ๋์๋ฅผ ์ถ๊ฐํ๋ ๋์ ์ค๊ฐ ๋จ๊ณ์์ ์ถ๊ฐ ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๊ด๋ฒ์ํ ์ก์ธ์ค๊ฐ ํ์ํ ํ์ ๋ฆฌ๋์๋ฅผ ์ ์ ํ ์ ์์ต๋๋ค (์ฌ์ ํ ์ ์ฒด ์ก์ธ์ค๋ณด๋ค ์ ์). ์๋ฅผ ๋ค๋ฉด :
function a (state, action) { /* only sees within a */ return state; }
function b (state, action) { /* only sees within b */ return state; }
function c (state, action) { /* only sees within c */ return state; }
function ab (state, action) { /* partial state containing a and b */ return state; }
function bc (state, action) { /* partial state containing b and c */ return state; }
let rootReducer = combineReducers(
{ a, b, c },
[ 'a', 'b', ab ],
[ 'b', 'c', bc ]
);
๋ถ๋ถ ๋ฆฌ๋์ ๋ฐ ์ถ๊ฐ ๋ฃจํธ ๋ฆฌ๋์์ ๋ํ PR์ ์ ์ถํ ๊ฐ์น๊ฐ ์์ต๋๊น? ์ด๊ฒ์ ๋์ฐํ ์์ด๋์ด์ ๋๊น, ์๋๋ฉด ์ถฉ๋ถํ ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ ์ ์ฉ ํ ์ ์์ต๋๊น?
ํ ๋ก๊ฒ ๊ณผ ๋๋ฆ ๋๋ฌด ๊ฐ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง ๋ฐฐ์ฐ๊ณ ์ถ์ต๋๋ค. JavaScript๋ ์ฌ๋ฌ progammig ๋ค์ด์ด๊ทธ๋จ์ด ํผํฉ๋์ด ์์ผ๋ฉฐ ์ฐ๋ฆฌ๋ฅผ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์๋ดํฉ๋๋ค. ๋๋ ์ด์ FRP์ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ ์ค ์ฌ๋ฐ๋ฅธ ๊ฒ์ด ํผ๋ ์ค๋ฝ์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ๋์๊ฒ๋ ํผ๋์ ์ง์ ์ด๋ผ๋ ๊ฒ์ ์์๋ค. ๋ด ์ฌ์ฉ ์ฌ๋ก / ์๋ฃจ์ ์ ์ฌ๊ธฐ์ ๊ฒ์ํ์ญ์์ค.
์ธ ๊ฐ์ง ๋ฆฌ์์ค ์ ํ (ํด๋ผ์ด์ธํธ, ํ๋ก์ ํธ, ์์
)์ ๋ฐฐ์ด์ ์ฒ๋ฆฌํ๋ ์ธ ๊ฐ์ง ํ์ ๊ฐ์ ๊ธฐ๊ฐ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ ( REMOVE_CLIENT
)๋ฅผ ์ญ์ ํ ๋ ๋ชจ๋ ๊ด๋ จ ํ๋ก์ ํธ์ ์์
์ ์ญ์ ํด์ผํฉ๋๋ค. ์์
์ ํ๋ก์ ํธ๋ฅผ ํตํด ํด๋ผ์ด์ธํธ์ ๊ด๋ จ๋์ด ์์ผ๋ฏ๋ก ์์
๊ฐ์๊ธฐ๋ ์กฐ์ธ ๋
ผ๋ฆฌ๋ฅผ ์ํํ๊ธฐ ์ํด ํ๋ก์ ํธ์ ์ก์ธ์ค ํ ์ ์์ด์ผํฉ๋๋ค. ์์
๊ฐ์๊ธฐ๋ ์ญ์ ์ค์ธ ํด๋ผ์ด์ธํธ์ ์ํ ๋ชจ๋ ํ๋ก์ ํธ ID์ ๋ชฉ๋ก์ ๊ฐ์ ธ์จ ๋ค์ ์ ์ฅ์์์ ์ผ์นํ๋ ์์
์ ์ ๊ฑฐํด์ผํฉ๋๋ค.
๋ค์ ๋ฏธ๋ค์จ์ด๋ก์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
export default store => next => action => {
next({ ...action, getState: store.getState });
}
๋ฐ๋ผ์ ๋ชจ๋ ์์
์ action.getState()
๋ฅผ ํตํด ๋ฃจํธ ์ ์ฅ์์ ์ก์ธ์ค ํ ์ ์์ต๋๋ค.
@ rhys-vdw ๊ฐ์ฌํฉ๋๋ค! ์ ๋ง ์ ์ฉํ ๋ฏธ๋ค์จ์ด :)
@ rhys-vdw ๊ฐ์ฌํฉ๋๋ค โ ์ข์ ํด๊ฒฐ์ฑ
์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ํฐํฐ๊ฐ ๋ ๊ฐ ์ด์์ ๋ค๋ฅธ ์ํฐํฐ์์ ๊ณต์ ๋๊ฑฐ๋ ์ญ์ ์ค ์กด์ฌํ์ง ์๋ ๋ ์ฝ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒฝ์ฐ์ ๊ฐ์ด ์์ง ์ผ์ด์ค / ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํฉ๋๊น? ์ด๊ฒ์ ๋ํ ๋น์ ์ ์๊ฐ์ ๋ฃ๊ณ ์ถ์ด์.
@gaearon ์ ๊ทํ ๋ ์ํฐํฐ์ ์ด๋ฌํ ์ข
๋ฅ์ ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ Redux์ ๋ฌธ์ํ ํ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
ํน๋ณํ ๋ฐฉ๋ฒ์ ์์ต๋๋ค. ์คํค๋ง๋ฅผ ์ ์ํ๊ณ ์ด ์คํค๋ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ์๊ธฐ๋ฅผ ์์ฑํ์ฌ์ด๋ฅผ ์๋ํ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํญ๋ชฉ์ด ์ญ์ ๋ ๋ "์ฐ๋ ๊ธฐ"๋ฅผ ์์งํ๋ ๋ฐฉ๋ฒ์ "์๊ฒ"๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋ชจ๋ ๋งค์ฐ ์์ผ๋ก ํ๋ค๋ฆฌ๊ณ ๊ตฌํ ๋
ธ๋ ฅ์ด ํ์ํฉ๋๋ค :-). ๊ฐ์ธ์ ์ผ๋ก ๋๋ ์ญ์ ๊ฐ ์ค์ ์ ๋ฆฌ๋ฅผ ๋ณด์ฅํ๊ธฐ์ ์ถฉ๋ถํ ์ ๋๋ก ์์ฃผ ๋ฐ์ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ธ์ status
ํ๋๋ฅผ ๋ค์ง๊ณ ํญ๋ชฉ์ ์ ํํ ๋ ์ญ์ ๋ ํญ๋ชฉ์ ํ์ํ์ง ์๋๋กํฉ๋๋ค. ๋ฌผ๋ก ์ผ๋ฐ์ ์ธ ์์
์ด ์๋ ๊ฒฝ์ฐ ์ญ์ ์ ์๋ก ๊ณ ์น ์ ์์ต๋๋ค.
@gaearon ์ด๊ณ ์ ๋ต์ฅ์ ํ๋์ ๊ฐ์น๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํนํ ํด๋น ์ฃผ์ CRUD ์์
์ด ๋ง์ ๊ฒฝ์ฐ ํด๋น ์ ๋ น ํญ๋ชฉ์ด ๋น์ ์ ๋์ด ๋จ๋ฆด ์ ์๋์ง ํ์คํ์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ Redux
๊ฐ ์ ๊ทํ ๋ ์ํฐํฐ์ ์๋ฒ ๋๋ ์ํฐํฐ๋ฅผ ๋ชจ๋ ์ง์ํ๋ค๋ฉด ์์ด์ค๊ฐ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชฉ์ ์ ๋ง๋ ์ ๋ต์ ์ ํํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์๋ฒ ๋๋ ์ํฐํฐ์ ๊ฒฝ์ฐ Redux ๋ฌธ์์ ๋ฐ๋ผ ์ํฐ ํจํด ์ธ nested reducers
์ ์ฌ์ฉํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ์๊ธฐ์์ ๋๋จธ์ง ์ ์ฅ ์ํ์ ์ก์ธ์คํ๋ ๊ฒ์ด ์ด๋ ค์ ์ต๋๋ค. ์ผ๋ถ ๊ฒฝ์ฐ์๋ ์ค์ฒฉ ๋ combineReducers๋ฅผ ์ฌ์ฉํ๊ธฐ๊ฐ ์ ๋ง ์ด๋ ต์ต๋๋ค. .parent()
๋๋ .root()
๋๋ ์ด์ ๋๋ฑํ ์ํ์ ๊ฐ์ ๋๋จธ์ง ์ํ์ ์ก์ธ์คํ๋ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉด ์ข์ ๊ฒ์
๋๋ค.
๊ฐ์๊ธฐ์์ ๋ค๋ฅธ ๊ฐ์๊ธฐ์ ์ํ์ ์ก์ธ์คํ๋ ๊ฒ์ ๋๋ถ๋ถ ์ํฐ ํจํด์
๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ค์ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค.
๊ฐ์ฌ! ๋์ํฉ๋๋ค. ๋ฃจํธ ์ํ๋ฅผ ๊ฐ์๊ธฐ์ ์ ๋ฌํ๋ ค๊ณ ์๋ํ ํ ๋ ๋ณต์กํด์ก์ต๋๋ค. :-)
์, ๋ฃจํธ ์ํ๋ฅผ ์ ๋ฌํ๋ ๋ฌธ์ ๋ ๋ฆฌํฉํฐ๋ง์ด ์๋ก์ ์ํ ๋ชจ์์ ๊ฒฐํฉ๋์ด ์ํ ๊ตฌ์กฐ์ ๋ฆฌํฉํ ๋ง์ด๋ ๋ณ๊ฒฝ์ ๋ณต์กํ๊ฒ ๋ง๋ ๋ค๋ ๊ฒ์ ๋๋ค.
์ข์, ๋๋ ์ ๊ทํ ๋ ์ํ๋ฅผ ๊ฐ๋ ๊ฒ์ ์ด์ ์ ๋ถ๋ช ํ๋ณด๊ณ ๋ด ์ํ ์ข ๋ฅ์ redux ๋ถ๋ถ์ DB์ฒ๋ผ ์ทจ๊ธํ๋ค.
๋๋ ์ฌ์ ํ @gaearon (์ญ์ ๋ฅผ ์ํด ์ํฐํฐ ํ๋๊ทธ ์ง์ ) ๋๋ @ rhys-vdw์ ์ ๊ทผ ๋ฐฉ์์ด ๋ ๋์์ง (์ฐธ์กฐ๋ฅผ ํด๊ฒฐํ๊ณ ๊ด๋ จ ์ฐธ์กฐ๋ฅผ ์ ์๋ฆฌ์์ ์ ๊ฑฐ) ์๊ฐํ๊ณ ์์ต๋๋ค.
์์ด๋์ด / ์ค์ ๊ฒฝํ์ด ์์ต๋๊น?
redux๊ฐ elm๊ณผ ๋ ๋น์ทํ๊ณ ์ํ๊ฐ ์ ๊ทํ๋์ง ์์ ๊ฒฝ์ฐ ๊ฐ์๊ธฐ๋ฅผ ์ํ ๋ชจ์์์ ๋ถ๋ฆฌํ๋ฉด ์๋ฏธ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ํ๊ฐ ์ ๊ทํ ๋์๊ธฐ ๋๋ฌธ์ ๋ฆฌ๋์๋ ์ข ์ข ์ฑ ์ํ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ก์ธ์คํด์ผํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ฐ์๊ธฐ๋ ๋์์ ์์กดํ๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ ์ด์ ์ผ๋ก ๊ฒฐํฉ๋์ด ์์ต๋๋ค. ๋ค๋ฅธ redux ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฆฌ๋์๋ฅผ ์ฌ์ํ๊ฒ ์ฌ์ฌ์ฉ ํ ์ ์์ต๋๋ค.
์ํ ์ก์ธ์ค๋ฅผ ์์ ์ผ๋ก ํธ์ํ๊ณ ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์์ ์ ํจ์ฌ ๋ ์ถ์ ํ ํํ์ ์ปคํ ๋ง์ผ๋ก ๋ณด์ด๋ฉฐ ๊ฐ์๊ธฐ๊ฐ ๋ฃจํธ ์ํ์ ์ง์ ์ก์ธ์ค ํ ์ ์์ต๋๋ค. ์ด์ ๋ ํ์ํ์ง ์์ ์์ ๋ ์ํ ๋ชจ์๊ณผ ๊ฒฐํฉ๋๋ฉฐ ๋ฆฌ๋์๋ณด๋ค ๋ ๋ง์ ์์ ์ด ์๊ณ ๋ณ๊ฒฝํ ๊ณณ์ด ๋ ๋ง์ต๋๋ค.
์ํ๋ฅผ ๋ทฐ๋ก ์ ๋ฌํ๋ ๊ฒ์ด ์ํ ๋ชจ์ ๋ณ๊ฒฝ์ ์ฐจ๋จํ๋ ๊ฒ์ด ๋ ์ข์ง๋ง, ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋จ์ ๋ฐ๋ผ ์ถ๊ฐ ์ํ๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ ๋ฐ์ดํธํด์ผํ๋ ๋ง์ ์์ ๋งํผ์ด๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
๋ฆฌ๋์๊ฐ ๋ฃจํธ ์ํ์ ์ก์ธ์คํ๋๋ก ํ์ฉํ๋ IMHO๋ ํ์ฌ์ ํด๊ฒฐ ๋ฐฉ๋ฒ๋ณด๋ค ์ ์ฒด์ ์ธ ์ปคํ ๋ง์ด ์ ์ต๋๋ค.
@kurtharriger : ์ผ๋ฐ์ ์ธ ๊ถ์ฅ ํจํด์ ๋๋ฉ์ธ๋ณ๋ก Redux ์ํ๋ฅผ ๊ตฌ์ฑํ๊ณ combineReducers
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ๋๋ฉ์ธ์ ๊ฐ๋ณ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด์ง๋ง ๊ถ์ฅ ์ฌํญ์
๋๋ค. ์ ์ฒด ์ํ๋ฅผ ํน์ ํ์ ๋ฆฌ๋์ ํจ์๋ก ์ ๋ฌํ๋ ๊ฒ์ ํฌํจํ์ฌ ์ํฉ์ ๋ค๋ฅด๊ฒ ๊ด๋ฆฌํ๋ ์์ ๋ง์ ์ต์์ ๋ฆฌ๋์๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ ์ ์ผ๋ก ๊ฐ๋ฅํฉ๋๋ค. ๊ถ๊ทน์ ์ผ๋ก, ๋น์ ์ ์ ๋ง๋ก _ ํ๋์ _ ๊ฐ์๊ธฐ ๊ธฐ๋ฅ๋ง์ ๊ฐ์ง๊ณ combineReducers
๋ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์ ์ ์ฉํ ์ ํธ๋ฆฌํฐ์
๋๋ค.
๋น์ฆ๋์ค ๋ก์ง ๋ถํ ์ ๋ํ Redux FAQ ๋ต๋ณ์๋์ด ์ฃผ์ ์ ๋ํ ์ข์ ํ ๋ก ์ด ์์ต๋๋ค.
์, ๋ ๋ค๋ฅธ ์ต์
์ ํ๋์ ๊ฑฐ๋ํ ํจ์์์ ๋จ์ผ ๊ฐ์๊ธฐ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋ด์ฅ ๋ ๊ฒ์ ์ฌ์ฉํ๋ ๋์ ์์ ๋ง์ combineReducer ํจ์๋ฅผ ์์ฑํ๋ ๊ฒ์
๋๋ค.
์ถ๊ฐ ๋ฃจํธ ์ํ ์ธ์๋ฅผ ์ถ๊ฐํ๋ ๋ด์ฅํ combineReducers ๋ฉ์๋๊ฐ ์์ผ๋ฉด ์ ์ฉ ํ ์ ์์ง๋ง์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ค๊ณ ์๋ํ PR์ ์ํฐ ํจํด์ผ๋ก ๋ซํ์ต๋๋ค. ๋๋ IMHO๋ฅผ ์ ์ํ ๋์์ด ํจ์ฌ ๋ ์ ์ฒด์ ์ธ ๊ฒฐํฉ์ ์ด๋ํ๋ค๋ ์ ์ ์ฃผ์ฅํ๊ณ ์ถ์๊ณ ์๋ง๋ ์ด๊ฒ์ ์ํฐ ํจํด์ผ๋ก ๊ฐ์ฃผ๋์ด์๋ ์๋ฉ๋๋ค. ๋ํ ๋ฃจํธ ์ํ๊ฐ ์ถ๊ฐ ์ธ์๋ก ์ถ๊ฐ ๋ ๊ฒฝ์ฐ ๊ฐ์ ๋ก ์ฌ์ฉํด์ผํ๋ ๊ฒ๊ณผ๋ ๋ค๋ฅด๋ฏ๋ก ์ปคํ ๋ง์ ์ฌ์ ํ โโ์ตํธ ์ธ์
๋๋ค.
์ฐ๋ฆฌ๋์ด ๊ฒฐํฉ์ด ๋ช ์ ์ ์ด๊ธฐ๋ฅผ ์ํฉ๋๋ค. ์๋์ผ๋ก ํ ๋ ๋ช ์ ์ ์ด๋ฉฐ ๋ฌธ์ ๊ทธ๋๋ก N ์ค์ ์ฝ๋์ด๋ฉฐ N์ ์ผ๋ง๋ ๋ง์ ๊ฐ์๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ์๋์ง์ ๋๋ค. CombineReducers๋ฅผ ์ฌ์ฉํ์ง ๋ง๊ณ ๋ถ๋ชจ ๊ฐ์๊ธฐ๋ฅผ ์์ผ๋ก ์์ฑํ์ญ์์ค.
๋๋ redux / react์ ์ต์ํ์ง ์์ง๋ง ๊ฒธ์ํ๊ฒ ์ด๊ฒ์ ๋ฌป์ต๋๋ค. ์๋ก์ ์ํ์ ์ก์ธ์คํ๋ ๊ตฌ์ฑ๋ ๊ฐ์๊ธฐ๊ฐ ์ํ ๋ชจ์์ ์๋ก ๋ค๋ฅธ ์์ญ ์ฌ์ด์ ๊ฒฐํฉ์ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ ์ํฐ ํจํด์ด๋ผ๋ฉด์ด ๊ฒฐํฉ์ ์ด๋ฏธ mapStateToProps ( )์ ์ฐ๊ฒฐ (), ๊ทธ ํจ์๋ ๋ฃจํธ ์ํ๋ฅผ ์ ๊ณตํ๊ณ ๊ตฌ์ฑ ์์๋ ๋ชจ๋ ๊ณณ์์ / ์ด๋์์๋ ๊ฐ์ ธ์ ์ํ์ ์ป์ต๋๋ค.
์ํ ํ์ ํธ๋ฆฌ๋ฅผ ์บก์ํํด์ผํ๋ ๊ฒฝ์ฐ ๊ตฌ์ฑ ์์๋ ํด๋น ํ์ ํธ๋ฆฌ๋ฅผ ์จ๊ธฐ๋ ์ ๊ทผ์๋ฅผ ํตํด ์ํ์ ์ก์ธ์คํด์ผํฉ๋๋ค. ๊ทธ๋์ผ ๋ฆฌํฉํ ๋ง์์ด ํด๋น ๋ฒ์ ๋ด๋ถ์ ์ํ ๋ชจ์์ ๊ด๋ฆฌ ํ ์ โโ์์ต๋๋ค.
๋ด๊ฐ redux๋ฅผ ๋ฐฐ์ฐ๋ฉด์ ๋๋ ๋ด ์ฑ์์ ์ฅ๊ธฐ์ ์ธ ๋ฌธ์ ๊ฐ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ณ ์๋๋ฐ, ์ด๊ฒ์ ๊ฐ์๊ธฐ๊ฐ ์๋๋ผ mapStateToProps์ ์ํด ์ฑ ์ ์ฒด์ ๊ฑธ์ณ ์ํ ๋ชจ์์ด ๊ธด๋ฐํ๊ฒ ๊ฒฐํฉ๋์ด ์์ต๋๋ค. ์ธ์ฆ ์ฌ์ฉ์์ ์ด๋ฆ (์๋ฅผ ๋ค์ด ์ฃผ์ ๊ฐ์๊ธฐ ๋ ์ธ์ฆ ๊ฐ์๊ธฐ์ ์ํด ๊ฐ๊ฐ ์ถ์๋จ) ์ ๋ mapStateToProps์์๋ ์ด๋ฌํ ์ข ๋ฅ์ ์บก์ํ๋ฅผ ์ํํ๋ ์ ๊ทผ ์ ๋ฉ์๋์์ ๋ชจ๋ ์ํ ์ก์ธ์ค๋ฅผ ๋ํํ๋ ค๊ณ ์๋ํ๊ณ ์์ง๋ง ์๋ชป ์ง๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค. ๋๋ฌด.
@jwhiting : ์ด๋ ํนํ mapStateToProps
์์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ํ์์ ์ถ์ถํ๊ธฐ ์ํด "์ ํ๊ธฐ ํจ์"๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋ฌ ๋ชฉ์ ์ค ํ๋์
๋๋ค. state.some.nested.field
์ ์์น๋ฅผ โโ์ค์ ๋ก ์์์ผํ๋ ์ต์ํ์ ์ฅ์ ๋ง ์๋๋ก ๋ํ์ ์ํ๋ฅผ ์จ๊ธธ ์ ์์ต๋๋ค. ์์ง ๋ณด์ง ๋ชปํ๋ค๋ฉด Reselect ์ ํธ๋ฆฌํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Redux ๋ฌธ์์ Computing Derived Data ์น์
์ ํ์ธํ์ญ์์ค.
๋ค. ๋ฐ์ดํฐ ๋ณผ๋ฅจ์ด ์์ง๋ง ์ฌ์ ํ (์์ผ๋ก ์ด) ์ ํ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ๋ค์ ์ ํ์ ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ํ shopping-cart
์์ ๋ฅผ ํ์ธํ์ญ์์ค.
@markerikson @gaearon ์ด ์๋ฏธ๊ฐ ์์ผ๋ฉฐ ํ์ํ๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค. ํด๋น ๊ตฌ์ฑ ์์์ ์ฃผ์ ๊ด์ฌ์ฌ (๋๋ ๋ชจ๋ ์ํ ์ก์ธ์ค)์ ๋ํด mapStateToProps์ ์ ํ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ๋ถ ์ํ ๋ชจ์์ ๋ณ๊ฒฝ์ผ๋ก๋ถํฐ ๊ตฌ์ฑ ์์๋ฅผ ๋ณดํธ ํ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ด ํ๋ก์ ํธ์์ ์ํ ์บก์ํ๋ฅผ๋ณด๋ค ์๊ฒฉํ๊ฒ ์ํ ํ ์์๋ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์ถ์ต๋๋ค. ๊ทธ๋์ผ ์ฝ๋ ๊ท์จ์ด ์ ์ผํ ๊ฐ๋๊ฐ ์๋๋ฉฐ ๊ฑฐ๊ธฐ์์ ์ ์์ ํ์ํฉ๋๋ค.
๋ชจ๋ ์ฝ๋๋ฅผ ๋จ์ผ ๊ฐ์๊ธฐ์ ๋ณด๊ดํ๋ ๊ฒ์
์ฐ๋ ค. ๊ฐ์๊ธฐ๊ฐ ๋ฃจํธ์ ์ํด ํธ์ถ๋๋ฉด ์๋์ผ๋ก ํธ์ถ ํ ์ ์์ต๋๋ค.
๋ด๊ฐ ์ ์ํ๋๋ก ๋ฃจํธ ์ํ๋ฅผ ๋ช
์ ์ ์ผ๋ก ์ ๋ฌํ์ง๋ง
๋ถ๋ชจ ๊ฐ์๊ธฐ ๊ณ์ธต์๋ ๊ฒฐํฉ ๊ฐ์๊ธฐ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
๋ฐ. ๊ทธ๋ฌ๋ ์ฐข์ ํ์๊ฐ ์๋๋ก ์ข ๋ ํฉ์ฑ ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
๋์ค์ ๋๊ฐ๊ฑฐ๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ดํ๋ ๊ฒ์ฒ๋ผ ์ฝํฌ์ ์์งํฉ๋๊น?
2016 ๋
4 ์ 16 ์ผ ํ ์์ผ ์คํ 8:27 Josh Whiting [email protected]
์ผ๋ค :
@markerikson https://github.com/markerikson @gaearon
https://github.com/gaearon ์ดํด๊ฐ๋๋ฉฐ ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค. ๊ทธ ๋ฐ์ ๋ชจ๋ ๊ฒ์ ๋ํด mapStateToProps์์ ์ ํ๊ธฐ ์ฌ์ฉ
๊ตฌ์ฑ ์์์ ์ฃผ์ ๊ด์ฌ์ฌ (๋๋ ๋ชจ๋ ์ํ ์ก์ธ์ค์ ๋ํ)๋
์ด๋ฌผ์ง ๋ชจ์์ ๋ณํ๋ก ์ธํ ๊ตฌ์ฑ ์์. ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์ถ์ต๋๋ค
ํ์ง๋ง ๋ด ํ๋ก์ ํธ์์ ์ํ ์บก์ํ๋ฅผ ๋ ์๊ฒฉํ๊ฒ ์ํํ๊ธฐ ์ํด
๊ทธ๋์ ์ฝ๋ ๊ท์จ ๋ง์ด ๊ทธ๊ฒ์ ๋ณดํธํ๊ณ ํ์ํฉ๋๋ค.
๊ฑฐ๊ธฐ์ ์ ์.โ
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
https://github.com/reactjs/redux/issues/601#issuecomment -210940305
@kurtharriger : ์ฐ๋ฆฌ ๋ชจ๋๋ ๋ฆฌ๋์ ๋ก์ง์ ๋ง์ง๋ง ๋ถ๋ถ์ ํ๋์ ํจ์๋ก ์ ์งํ๋ ๊ฒ์ ๋์ ์๊ฐ์ด๋ฉฐ ์์
์ด ์ด๋ค ์ ์ผ๋ก๋ ํ์ ํจ์๋ก ์์๋์ด์ผํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ์ฌ๋์์ด๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์๋ก ๋ค๋ฅธ ์์ด๋์ด๋ฅผ ๊ฐ๊ณ ์์ผ๋ฉฐ ์์ ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ํด ์๋ก ๋ค๋ฅธ ์๊ตฌ๋ฅผ ๊ฐ๊ฒ ๋ ๊ฒ์
๋๋ค. Redux๋ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์ ๋ํ ๋ด์ฅ ์ ํธ๋ฆฌํฐ๋ก combineReducers
๋ฅผ ์ ๊ณตํฉ๋๋ค. ํ์ฌ ์กด์ฌํ๋ ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ง ์๋ค๋ฉด ๊ทธ๋ด ํ์๊ฐ ์์ต๋๋ค. ๋ชจ๋ ๊ฒ์ ์์ผ๋ก ์์ฑํ๋ , ์๋๋ฉด combineReducers
์ ๋ณํ์ ์ง์ ์์ฑํ๋ ์๊ด์์ด ์์ ๋ง์ ๋ฐฉ์์ผ๋ก ๊ฐ์๊ธฐ๋ฅผ ๊ตฌ์ฑ ํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ํจํด๊ณผ ์ฐ๋ ค์ ๋ถ๋ฆฌ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก๋ ๊ด๋ จ์ด ์์ง๋ง ๋์ ํ๋์ ์ทจํ๊ณ ์์ต๋๋ค.
์ฆ, ๋ด๊ฐ ์ฌ๋ฌ ๊ณณ์์ ๋ณผ ์์๋ ajax shouldFetch ํจํด์ ์ํ ๋ชจ์๊ณผ ๋ฐ์ ํ๊ฒ ์ฐ๊ฒฐ๋์ด์๋ ๊ฒ ๊ฐ๋ค. ์๋ฅผ ๋ค์ด ์ฌ๊ธฐ . ์ด ์์์ ๊ฐ์๊ธฐ๋ฅผ ์ฌ์ฌ์ฉํ์ง๋ง ์ํ์ ๋ฃจํธ์ ์ํฐํฐ ๊ฐ์ฒด๊ฐ ์์ผ๋ฉด ์ด๋ป๊ฒ๋ฉ๋๊น? ๊ทธ๋ฌ๋ฉด ํด๋น ์์ ์ด ์คํจํฉ๋๋ค. ์ฌ๊ธฐ์ ๊ถ์ฅํ๋ ๊ฒ์ ๋ฌด์์ ๋๊น? ์ผ์ด์ค ๋ณ ์กฐ์น๋ฅผ ์ถ๊ฐํด์ผํฉ๋๊น? ์๋๋ฉด ์ ํ์๋ฅผ ๋ฐ์๋ค์ด๋ ์ก์ ?
@shadowii ์ก์ ํฌ๋ฆฌ์์ดํฐ๊ฐ ์ ํ๊ธฐ๋ฅผ ๊ฐ์ ธ ์ค๋ ๊ฒ์ ๊ด์ฐฎ์ ๊ฒ ๊ฐ์ต๋๋ค. ์ ํ๊ธฐ์ ๊ฐ์๊ธฐ๋ฅผ ํจ๊ป ๋ฐฐ์นํ์ฌ ์ํ ๋ชจ์์ ๋ํ ์ง์์ด ํด๋น ํ์ผ์ ์ง์ญํ๋ฉ๋๋ค.
๋ค๋ฅธ ๊ฐ์๊ธฐ๊ฐ ๋์ผํ ์์
์ ํ์ ์ฒ๋ฆฌํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๊น?
์๋ฅผ ๋ค์ด, account
๋ฐ auth
๊ฐ์๊ธฐ๊ฐ์๋ ๊ฒฝ์ฐ ๋ ๋ค LOGIN_SUCCESS
์์
์ ํ (์ธ์ฆ ํ ํฐ ๋ฐ ํ์ด๋ก๋์ ๊ณ์ ๋ฐ์ดํฐ ํฌํจ)์ ์ฒ๋ฆฌํฉ๋๋ค. ํ๋๋ ๊ด๋ฆฌํ๋ ์ํ ์กฐ๊ฐ ๋ง ์
๋ฐ์ดํธํฉ๋๋ค. ๋๋ ํ๋์ด ๊ตญ๊ฐ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ํฅ์ ๋ฏธ์น ๋์ด ์ ๊ทผ๋ฒ์ ๊ฝค ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
๋ค๋ฅธ ๊ฐ์๊ธฐ๊ฐ ๋์ผํ ์์ ์ ํ์ ์ฒ๋ฆฌํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๊น?
๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋งค์ฐ ์ผ๋ฐ์ ์ด๊ณ ์ ์ฉํ ํจํด์ ๋๋ค. ์ฌ์ค ๊ทธ๊ฒ์ _reason_ ์ก์ ์ด ์กด์ฌํฉ๋๋ค. ๋ง์ฝ ์ก์ ์ด ๋ฆฌ๋์ 1 : 1์ ๋งคํ๋๋ค๋ฉด, ์ก์ ์ ๊ฐ๋ ๊ฒ์ ๊ฑฐ์ ์๋ฏธ๊ฐ ์์ ๊ฒ์ ๋๋ค.
@ rhys-vdw ๊ฒ์ ํ ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํด ๋ณด์์ต๋๋ค.
customMiddleare.js
const customMiddleware = store => next => action => {
next({ ...action, getState: store.getState });
};
๊ทธ๋ฆฌ๊ณ ๋ด ์์ ์์ฑ์๋
import customMiddleware from './customMiddleware';
var store = createStore(
rootReducer,
initialState,
applyMiddleware(
reduxPromise,
thunkMiddleware,
loggerMiddleware,
customMiddleware
)
);
return store;
๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
applyMiddleware.js? ee15 : 49 Uncaught TypeError : ๋ฏธ๋ค์จ์ด๋ ํจ์๊ฐ ์๋๋๋ค (โฆ)
(์ต๋ช
ํจ์) @ applyMiddleware.js? ee15 : 49
(์ต๋ช
ํจ์) @ applyMiddleware.js? ee15 : 48
createStore @ createStore.js? fe4c : 65
configureStore @ configureStore.js? ffde : 45
(์ต๋ช
ํจ์) @ index.jsx? fdd7 : 25
(์ต๋ช
ํจ์) @ bundle.js : 1639
webpack_require @ bundle.js : 556
fn @ bundle.js : 87 (์ต๋ช
ํจ์) @ bundle.js : 588
webpack_require @ bundle.js : 556
(์ต๋ช
ํจ์) @ bundle.js : 579
(์ต๋ช
ํจ์) @ bundle.js : 582
@ mars76 : ์๋ง๋ ๋ฌด์ธ๊ฐ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ฐ์ ธ ์ค์ง ์์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ์ด๊ฒ์ด ์ค์ ๋ก customMiddleware.js
์ ์ ์ฒด ๋ด์ฉ์ด๋ผ๋ฉด _anything_์ ๋ด ๋ณด๋ด์ง ์๋ ๊ฒ์
๋๋ค. ์ผ๋ฐ์ ์ผ๋ก 4 ๊ฐ์ ๋ฏธ๋ค์จ์ด๋ฅผ applyMiddleware
์ ์ ๋ฌํ๊ณ ์์ผ๋ฉฐ ๊ทธ์ค ํ๋๋ ์ ํจํ ์ฐธ์กฐ๊ฐ ์๋ ์ ์์ต๋๋ค. ๋ค๋ก ๋ฌผ๋ฌ๋์ ๋ชจ๋ ์ ๊ฑฐํ๊ณ ํ ๋ฒ์ ํ๋์ฉ ๋ค์ ์ถ๊ฐํ๊ณ ์ด๋ค ๊ฒ์ด ์ ํจํ์ง ์์์ง ํ์ธํ๊ณ ์ด์ ๋ฅผ ํ์
ํ์ญ์์ค. ๊ฐ์ ธ ์ค๊ธฐ ๋ฐ ๋ด๋ณด๋ด๊ธฐ ๋ฌธ์ ํ์ธํ๊ณ ํญ๋ชฉ์ ์ด๊ธฐํํ๋ ๋ฐฉ๋ฒ์ ๋ค์ ํ์ธํ์ญ์์ค.
์๋ ํ์ธ์,
๊ฐ์ฌํฉ๋๋ค @markerikson
๊ตฌ๋ฌธ์ ์๋์ ๊ฐ์ด ๋ณํํ๋๋ฐ ์ด์ ๊ด์ฐฎ์ต๋๋ค.
customMiddleware.js
export function customMiddleware(store) {
return function (next) {
return function (action) {
next(Object.assign({}, action, { getState: store.getState }));
};
};
}
console.log(customMiddleware);
์ด๋ป๊ฒ ๋ด๊ฐ Action Creator ์์ฒด (Reducer๊ฐ ์๋)์์ ์์ ์ ์ก์ธ์คํ๋ ค๊ณ ์๋ํ๊ณ ์์ต๋๋ค. Async ํธ์ถ์ํด์ผํ๊ณ ๋ค์ํ ๊ฐ์๊ธฐ์ ์ํด ๊ด๋ฆฌ๋๋ ์์ ์ํ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ ๋ฌํด์ผํฉ๋๋ค.
์ด๊ฒ์ด ๋ด๊ฐํ๋ ์ผ์ ๋๋ค. ์ด๊ฒ์ด ์ฌ๋ฐ๋ฅธ ์ ๊ทผ ๋ฐฉ์์ธ์ง ํ์คํ์ง ์์ต๋๋ค.
์ ๋ ๋ฐ์ดํฐ์ ํจ๊ป ์ก์ ์ ์ ๋ฌํ๊ณ ๊ฐ์๊ธฐ ๋ด๋ถ์์ ์ด์ ์ ์ฒด State์ ์ก์ธ์ค ํ ์ ์์ผ๋ฉฐ ํ์ํ ๋ถ๋ถ์ ์ถ์ถํ๊ณ Object๋ฅผ ์์ฑํ๊ณ ์ด ๋ฐ์ดํฐ๋ก ๋ค๋ฅธ ์ก์ ์ ์ ๋ฌํฉ๋๋ค.์ด ๋ฐ์ดํฐ๋ ๋ด Action Creator์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ Asyn ํธ์ถ์ํ๊ณ ์์ต๋๋ค.
๋ด ๊ฐ์ฅ ํฐ ๊ด์ฌ์ฌ๋ Reducer๊ฐ ์ด์ ์ก์ ์์ฑ๊ธฐ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ์๋ค๋ ๊ฒ์ ๋๋ค.
์๊ฒฌ์ ๊ฐ์ฌํฉ๋๋ค.
๊ฐ์ฌ
@ mars76 : ๋ค์ ๋งํ์ง๋ง, ๊ฐ์๊ธฐ ๋ด์์ ๋์คํจ์น๋ฅผ โโ์๋ํด์๋ ์๋ฉ๋๋ค .
์ก์ ์ ์์ ๋ด๋ถ์ ์์ ์ ์ก์ธ์คํ๋ ค๋ฉด redux-thunk ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ํ ๊ฐ์๊ธฐ ๊ฐ์ ๋ฐ์ดํฐ ๊ณต์ ์ ๋ํ ๊ณผ ์ผ๋ฐ์ ์ธ ์ฝํฌ ์ฌ์ฉ ์์ ์ ํจ๊ป ์์ฑํ ์์ ์ ์ฝ์ ์๋ ์์ต๋๋ค.
@markerikson์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋ด ์๋ชป์ด์ผ redux-thunk์ getState ()์ ๋ํด ๋ชฐ๋์ต๋๋ค. ๊ทธ๊ฒ์ ๋ด ์ผ์ ํจ์ฌ ์ฝ๊ฒ ๋ง๋ค๊ณ ๋ด ๊ฐ์๊ธฐ๋ฅผ ์์ํ๊ฒ ๋ง๋ญ๋๋ค.
@gaearon ์ก์ ์์ฑ์๊ฐ ์ ํ์๋ฅผ ๊ฐ์ ธ ์ค๋ ๊ฒ์ ์ธ๊ธํ์ ๋ ์ ์ฒด ์ํ๊ฐ ์ ํ์์๊ฒ ์ ๋ฌ๋๋๋ก ์ก์ ์์ฑ์์๊ฒ ์ ๋ฌ๋๋ค๋ ๊ฒ์ ์ผ๋์ ๋ ์ จ๋์? ์๋๋ฉด ๋ญ๊ฐ ๋น ์ก๋์?
@tacomanator : ์ฐธ๊ณ ๋ก Dan์ ์์ฆ Redux ๋ฌธ์ ์์ ๋ฌด์์ ํ์ ์ผ๋ฐ์ ์ผ๋ก ์๋ตํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ์ฐ์ ์์๊ฐ ๋๋ฌด ๋ง์ต๋๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ก์
์ ์์์์ ์ ํ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ฝํฌ ๋ด์์ ์ํํฉ๋๋ค. Thunk๋ getState
์ ์ก์ธ์ค ํ ์ ์์ผ๋ฏ๋ก ์ ์ฒด ์ํ ํธ๋ฆฌ์ ์ก์ธ์ค ํ ์ ์์ต๋๋ค.
import {someSelector} from "./selectors";
function someThunk(someParameter) {
return (dispatch, getState) => {
const specificData = someSelector(getState(), someParameter);
dispatch({type : "SOME_ACTION", payload : specificData});
}
}
@markerikson ๊ฐ์ฌํฉ๋๋ค. ์ฐธ๊ณ ๋ก ๋ด๊ฐ ๋ฌป๋ ์ด์ ๋ ์ฃผ๋ก ๋ฆฌ๋์๋ก ๋ณด๋ด๋ ๊ฒ๊ณผ๋ ๋์กฐ์ ์ผ๋ก ์ ํจ์ฑ ๊ฒ์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์ํด ์ ํ์์์ ํ์ ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ดํ ๊ฒ์ด์ง๋ง, ์๊ฐํ ์์๋ ์์๋ ์ ๊ณตํฉ๋๋ค.
๊ฐ์๊ธฐ๋ฅผ ํ๋๋ก ๊ฒฐํฉํ๋ ๋ฐ ์ฌ์ฉํ ๋น ๋ฅธ ํดํน์
const reducers = [ reducerA, reducerB, ..., reducerZ ];
let reducer = ( state = initialState, action ) => {
return reducers.reduce( ( state, reducerFn ) => (
reducerFn( state, action )
), state );
};
์ฌ๊ธฐ์ reducerA
์์ reducerZ
๋ ๊ฐ๋ณ ๊ฐ์๊ธฐ ๊ธฐ๋ฅ์
๋๋ค.
@brianpkelley : ๋ค, ๊ธฐ๋ณธ์ ์ผ๋ก https://github.com/acdlite/reduce-reducers ์ ๋๋ค.
@markerikson ์, ์ฒ์์ผ๋ก react / redux / etc๋ฅผ ์ฌ์ฉํ๊ณ ์ด ๋ฌธ์ ๋ฅผ ์กฐ์ฌํ๋ ๋์์ด ์ค๋ ๋๋ฅผ ์ฐพ์์ต๋๋ค. ๋ฐ์ฏค ๋๊น์ง ๊ฑด๋ ๋ฐ์์ต๋๋ค.
ํค, ๋ฌผ๋ก ์ ๋๋ค.
์ฐธ๊ณ ๋ก " combineReducers
๋ฅผ) ์ฌ์ฉํด์ผํฉ๋๊น?" ๋ผ๋ . ๋ฐ ๋ฌธ์์ ๊ตฌ์กฐํ ๊ฐ์๊ธฐ ์น์
. ๋ํ ์ ์ "Practical Redux"ํํ ๋ฆฌ์ผ ์๋ฆฌ์ฆ ์๋ ๋ช ๊ฐ์ง ๊ณ ๊ธ ๊ฐ์๊ธฐ ๊ธฐ์ ์ ๋ณด์ฌ์ฃผ๋ ๋ช ๊ฐ์ง ๊ฒ์๋ฌผ์ด ์์ต๋๋ค (7 ๋ถ ๋ฐ 8 ๋ถ ์ฐธ์กฐ).
redux-logic์ ์ฌ์ฉํ ๋ ๋ด ๋ ์ผํธ๋ transform
ํจ์์ ๋ฃจํธ ์ํ์์ ์์
์ ๋๋ฆฌ๋ ๊ฒ์
๋๋ค.
์:
const formInitLogic = createLogic({
type: 'FORM_INIT',
transform({ getState, action }, next) {
const state = getState();
next({
...action,
payload: {
...action.payload,
property1: state.branch1.someProperty > 5,
property2: state.branch1.anotherProperty + state.branch2.yetAnotherProperty,
},
});
},
});
๋๋ ๊ทธ๊ฒ์ด ์ฝ๋ ๊ตฌ์กฐ์ ๊ดํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
"ํ์ ์ํ ์์
์ ์ง์ ์ก์ธ์คํ์ง ๋ง์ญ์์ค"
๋ง์ ํ๋ก์ ํธ์์ redux๋ฅผ ์ฌ์ฉํ ํ ๊ฐ์ฅ ์ข์ ์ฝ๋ ๊ตฌ์กฐ๋ ๋ชจ๋ ํ์ ์ํ๋ฅผ ์์ ํ ๋ถ๋ฆฌ ๋ ๊ตฌ์ฑ ์์๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์์ ์์์ต๋๋ค.์ด ๊ตฌ์ฑ ์์ ์ค ํ๋๋ ์์ฒด ํด๋์ ๋
ผ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ์ด ์์ด๋์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ๋ค์ ํ์ผ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ ?
1- ๋ชจ๋ ์์ฉ ํ๋ก๊ทธ๋จ์๋ ๋ ๊ฐ์ง ์ ํ์ ์์
์ด ์์ต๋๋ค.
2- ์ถ๊ฐ๋ก์ด ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋๋ฅผ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ๊ณ ์ด๋ฆ์ ๋ณ๊ฒฝํ์ฌ ์ ์ํ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.)
2 ๊ฐ์ ๊ฐ์๊ธฐ๊ฐ ๋์ผํ ์์ฑ์ ๋ณ๊ฒฝํด์ผํ๋ ๊ฒฝ์ฐ๋ ์ด๋ป์ต๋๊น?
๋ค๋ฅธ ํ์ผ๋ก ๋ถํ ํ๊ณ ์ถ์ ๊ฐ์๊ธฐ๊ฐ ์๊ณ http ์์ฒญ์ด ์ด๋ค ์ด์ ๋ก ์คํจ ํ ๋ ๋ณ๊ฒฝํ๋ 'error'๋ผ๋ ์์ฑ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
์ด์ ์ด๋ ์์ ์์ ๊ฐ์๊ธฐ๊ฐ ์ปค์ ธ์ ์ฌ๋ฌ ๊ฐ์๊ธฐ๋ก ๋ถํ ํ๊ธฐ๋ก ๊ฒฐ์ ํ์ง๋ง ๋ชจ๋ '์ค๋ฅ'์์ฑ์ ๋ณ๊ฒฝํด์ผํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ญ?
@ Wassap124 ๋ ๊ฐ์๊ธฐ๊ฐ ๋์ผํ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๋์ผํ ์์ฑ์ ๋ณ๊ฒฝํ๋ ค๋ฉด ๋ ๊ฐ์ง ์์ ์ด ํ์ํฉ๋๊น?
๋ ์์ธํ ์ ๋ณด๊ฐ ์์ผ๋ฉด ์ฝํฌ๋ฅผ ์ฌ์ฉํ์ฌ "์ค๋ฅ ์ค์ "์์ ์ ์ ๋ฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@ rhys-vdw ๋๋ ๊ฝค ๊ธด ๊ฐ์๊ธฐ๋ฅผ ๋๋๋ ค๊ณ ๋
ธ๋ ฅํ๊ณ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋น์ ์ ์ ์๊ณผ ๊ด๋ จํ์ฌ ๋ถ์์ฉ์ด ์๋ค๋ ๊ท์น๊ณผ ๋ชจ์๋์ง ์์ต๋๊น?
@ Wassap124 , @ rhys-vdw : ๋ช
ํํํ๊ธฐ ์ํด, combineReducers
_ ๋ง ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ ๊ฐ์ ๊ฐ์๊ธฐ๊ฐ ๋์ผํ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ ์์ ์ ์ฌ์ฉ ์ฌ๋ก์ ๋ง๊ฒ ๋ค๋ฅธ ๋ฆฌ๋์ ๋ก์ง์ ์์ฑํ ์ ์์ต๋๋ค. https://redux.js.org/recipes/structuringreducers/beyondcombinereducers๋ฅผ ์ฐธ์กฐ
๋น ๋ฅธ ์์ค ์ค๋ช ์ํ๋ค๋ฉด ...
combineReducers
๋ ๋ค์๊ณผ ๊ฐ์ ํจ์ ์๋ช
์ ๋ฐํํฉ๋๋ค.
return function combination(state = {}, action) {
https://github.com/reduxjs/redux/blob/master/src/combineReducers.js#L145 ์ฐธ์กฐ
์ค์ ๊ฐ์๊ธฐ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ธฐ ์ํด ํด๋ก์ ๋ฅผ ๋ง๋ ํ.
๋ฐ๋ผ์ ์ ์ฅ์์์ ์ํ๋ฅผ ์ํํ๊ณ ๋ค์๋ก๋ํด์ผํ๋ ๊ฒฝ์ฐ ์์ ์ ์ ์ญ ์ ์ผ๋ก ์ฒ๋ฆฌ ํ ์ โโ์๋๋ก ๊ฐ๋จํ ๊ฒ์ ์ถ๊ฐ ํ ์ ์์ต๋๋ค.
const globalReducerHandler = () => {
return (state = {}, action) => {
if (action.type === 'DO_GLOBAL_THING') {
return globallyModifyState(state)
}
return reducers(state, action)
}
}
์ด๊ฒ์ ๋ฐ ํจํด ์ผ ์๋ ์๊ณ ์๋ ์๋ ์์ง๋ง ์ค์ฉ์ฃผ์๋ ํญ์ ๋ ์ค์ํ์ต๋๋ค.
๋ค๋ฅธ ๊ฐ์๊ธฐ์์ ๊ฐ์๊ธฐ๋ฅผ ํธ์ถํ๋ ๋์ (globalReducerHandler๊ฐ ํธ์ถํ๋ ๊ฐ์๊ธฐ์ ๊ด๋ จ์ด ์๊ธฐ ๋๋ฌธ์ ์ํฐ ํจํด์
๋๋ค) reduceReducers
์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ฐ์๊ธฐ์ ๊ฒฝ์ฐ ๋ณธ์ง์ ์ผ๋ก compose
์
๋๋ค ๋ฌธ์ ๊ทธ๋๋ก (Action ->)
๋ชจ๋๋์์ ๊ตฌ์ฑ).
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๊ฒ์ด ์ข์์ง ๋์์ง ์ฌ๋ถ๋ ์ฑ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ๋ด ๊ฒฝํ์ ๋์ผํ ์์ ์ ์ฒ๋ฆฌํ๋ ๋ง์ ์์ (๋๋ Redux ๊ฐ์๊ธฐ)์ด์๋ ๊ฒ์ ์ค์ ๋ก ๋งค์ฐ ํธ๋ฆฌํฉ๋๋ค. ์ด๋ ์ฑ ์์ ๋๋๊ณ ์ฌ๋๋ค์ด ๋๋จธ์ง ํ๊ณผ ์ถฉ๋ํ์ง ์๊ณ ๊ธฐ๋ฅ ๋ถ๊ธฐ์์ ์์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ด ๊ฒฝํ์ ํ๋์ ๊ฑฐ๋ํ ๋์ฐ๋ณ์ด๋ณด๋ค ๊ด๋ จ๋์ง ์์ ๋์ฐ๋ณ์ด๋ฅผ ๋ณ๋๋ก ์ ์งํ๋ ๊ฒ์ด ๋ ์ฝ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ด ๋๋ฌด ์ ์๋ํ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ๋๋ ๊ทธ๋ค์ด ์ข ์ข ์ฐจ์ ์ํ ๋ชจ๋ธ์ ์ฆ์์ด๋ผ๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด
๋ฌธ์ ์ ์ฆ์์ ๋๋ค. ์ํ ๋ด์์ ๋ฌผ๊ฑด์ ๋ง์ด ์ด๋ํด์ผํ๋ ๊ฒฝ์ฐ ์ํ ๋ชจ์์ ๋ ํ์คํํด์ผ ํ ์ ์์ต๋๋ค. ๋์
{ readMessages, unreadMessages }
๋น์ ์ ํ ์ ์์ต๋๋ค{ messagesById, threadsById, messageIdsByThreadIds }
. ๋ฉ์์ง๋ฅผ ์ฝ์์ต๋๊น? ์ข์ต๋๋ค.state.messagesById[id].isRead
ํฉ๋๋ค. ์ค๋ ๋์ ๋ํ ๋ฉ์์ง๋ฅผ ์ฝ๊ณ ์ถ์ต๋๊น?state.threadsById[threadId].messageIds
๋ฅผ ์ ํํ ๋ค์messageIds.map(id => state.messagesById[id])
ํ์ธ์.๋ฐ์ดํฐ๊ฐ ์ ๊ทํ๋๋ฉด ํ ๋ฐฐ์ด์์ ๋ค๋ฅธ ๋ฐฐ์ด๋ก ํญ๋ชฉ์ ๋ณต์ฌ ํ ํ์๊ฐ ์์ต๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํ๋๊ทธ๋ฅผ ๋ค์ง๊ฑฐ๋ ID๋ฅผ ์ถ๊ฐ / ์ ๊ฑฐ / ์ฐ๊ฒฐ / ์ฐ๊ฒฐ ํด์ ํฉ๋๋ค.