ํด๊ฒฐ ๋ฐฉ๋ฒ: Redux ์คํํฐ ํคํธ ์ฌ์ฉ
์ด ์ค๋ ๋์ ์์ด๋์ด๋ ๊ฒฐ๊ตญ ์๋ก์ด Redux Starter Kit ํจํค์ง ๋ก ๋ฐ๋์์ต๋๋ค. ์ฌ๊ธฐ์๋ ์คํ ์ด ์ค์ , ๋ฆฌ๋์ ์ ์, ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ์ ๋ฐ์ดํธ ๋ก์ง, ์ฌ์ง์ด ์ก์ ์์ฑ์๋ ์ก์ ์ ํ์ ์ง์ ์์ฑํ์ง ์๊ณ ๋ ์๋์ผ๋ก ์ํ์ ์ ์ฒด "์ฌ๋ผ์ด์ค"๋ฅผ ์์ฑํ๋ ๋ฑ ๋ง์ ์ผ๋ฐ์ ์ธ Redux ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋จ์ํํ๋ ์ ํธ๋ฆฌํฐ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
Redux ์คํํฐ ํคํธ๊ฐ ํด๊ฒฐํด์ผ ํ๋ ๋ฌธ์ (๋ฐ ํด๊ฒฐํ์ง ์๋ ๋ฌธ์ )์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ด๊ฐ ์์ฑํ "Vision for Redux Starter Kit" ์ ์ธ๋ฌธ์ ์ฐธ์กฐํ์ธ์ .
Redux์ ๋ํด ๊ฐ์ฅ ๋ง์ด ๋ณธ ๋ถ๋ง์ "๋ณด์ผ๋ฌํ๋ ์ดํธ๊ฐ ๋๋ฌด ๋ง๋ค"๋ ๊ฒ์ ๋๋ค. ๋ํ ๋ฐฐ์ธ ๊ฒ์ด ๋๋ฌด ๋ง๋ค๋ ๋ถ๋ง, ์ ์ฉํ ์์ ์ ์ํํ๋ ๋ฐ ํ์ํ ๋ค๋ฅธ ์ ๋์จ์ด ๋๋ฌด ๋ง๋ค๋ ๋ถ๋ง, Redux์ ์๊ฒฌ์ด ์๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ ์ ๊ณต ์ง์นจ์ ์ ๊ณตํ์ง ์๋ ์ธก๋ฉด์ด ๋๋ฌด ๋ง๋ค๋ ๋ถ๋ง๋ ์์ต๋๋ค.
์ด๋ฌํ ์ธก๋ฉด ์ค ๋ช ๊ฐ์ง์ ๊ดํด @tannerlinsley ์ ๋ฐฉ๊ธ ๋ ผ์ํ์ต๋๋ค. ์ฐ๋ฆฌ๋ Redux ์ฃผ๋ณ์ ์ถ์ํ ๊ณ์ธต์ธ Jumpstate ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์ต ๊ณก์ ์ ์ฝ๊ฒ ํ๊ธฐ ์ํ ๋ฐฉ๋ฒ ๋ฐ "์ข์" Redux ์ฌ์ฉ๋ฒ์ ๋ํ ๋ค์ํ ์ฒ ํ์ ์๊ฒฌ์ ๋ํด ๋ ผ์ํ์ต๋๋ค.
๊ทธ ์ค์์ ์ฐ๋ฆฌ๋ ๋ ๋์ ํ ๋ก ์ ์ํด ์ ๊ธฐํ๊ณ ์ถ์ ๋ช ๊ฐ์ง ์ง๋ฌธ์ ์๊ฐํด ๋์ต๋๋ค.
์ปค๋ฎค๋ํฐ์ Redux ์ฌ์ฉ์ ๋ํ ๋ถ๋ง, ๋ฌธ์ ์ ๋ฐ ์ฐ๋ ค ์ฌํญ์ ์ ์ํ๊ณ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ ์๊ณผ ์์ด๋์ด๋ ์ ๊ณตํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ช ๊ฐ์ง ์์ด๋์ด:
dispatch(actionType, payload)
๋ ์ก์
ํฌ๋ฆฌ์์ดํฐ์ ํ์์ฑ์ ์ค์ผ ์ ์์ต๋๋ค.createReducer({[actionType]: (state, payload) => state}, initState)
redux๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ ๋ด๊ฐ ์๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ํ์ฅ์ฑ์ด ์ข์ง ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์ด redux-thunk์์ ๋ฉ์ด์ง๊ณ ๊ฒฐ๊ตญ ๋๋ฌด ๋ง์ ์ผ์ ์์ํ๋ ์ก์ ์ ์์๋ก ์ด์ด์ง๋ฉฐ ์คํ๋ ค ์ธก๋ฉด ๊ด๋ฆฌ๋ฅผ ์ํด ๋ค๋ฅธ ๊ฒ์ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. - redux-observable ๋๋ redux-saga์ ๊ฐ์ ํจ๊ณผ.
ํนํ redux๋ฅผ ์์ํ ๋ ๊ทธ ๋งค๋ ฅ์ ์ดํดํ ์ ์์ง๋ง '๋ชจ๋ฒ ์ฌ๋ก ์์ฉ๊ตฌ ํจํค์ง'์ ์ผ๋ถ๋ก ๋ฒ๋ค๋งํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ์์ด๋์ด์ธ์ง ํ์ ํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ด ๋ถ๋ถ์ ๋์๊ฒ ๋ ์ค์ํฉ๋๋ค(์ด๊ฒ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์์ด๋์ด๊ฐ ์๋๋ผ ์ ์ด๋ ๋์๊ฒ ์ค์ํ ์ ์ฝ ์กฐ๊ฑด์ด ๋ ๊ฒ์ ๋๋ค).
Redux๋ "๊ฐ์ฅ ๊ฐ๊ฒฐํ ๋ฐฉ๋ฒ"์ด ์๋๋ผ ๋ฐ์ดํฐ ํ๋ฆ์ ๋ช ํํ๊ณ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํ ๊ฒ์ ๋๋ค.
Redux์ ์ข์ ์ ์ ๊ทธ๊ฒ์ด ํ๋ ์์ํฌ๋ผ๊ธฐ๋ณด๋ค ๋์์ธ ํจํด์ ๊ฐ๊น๊ณ ๋น์ ์ด ๋ณด๋ ๋ชจ๋ ์ฝ๋(์คํ ์ด์ react-redux
์ ์ธ)๊ฐ ๋น์ ์ ๊ฒ์ด๋ผ๋ ์ ์
๋๋ค.
Jumpstate๋ฅผ ์ดํด๋ณด๋ฉด(์ง๊ธ๊น์ง๋ ์ด์ ๋ํด ๋ชฐ๋์ต๋๋ค) Redux์ ๋ํด ๋ด๊ฐ ๋ณธ ์ฒซ ๋ฒ์งธ ์ถ์ํ ๊ณ์ธต ์ค ์ข์ ๋ณด์ด๋ ๊ฒ์ ๋๋ค. ์ฌ์ง์ด ์ข์! ๊ทธ๋ฌ๋ ๋์์ MobX์ ๊ฐ์ ๋ค๋ฅธ ํ๋ ์์ํฌ์์ ๋ฒ์ด๋๊ฒ ํ๊ณ ๋์ผํ ๊ฒ์ ํ ์ด๋ธ์ ๊ฐ์ ธ์ค๋ ์ฌ๋ฌ ํ๋ ์์ํฌ๋ฅผ ๊ฐ๋ ๊ฒ์ ๊ทธ๋ค์ง ์ ์ฉํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ Redux๊ฐ ๋ค๋ฅธ ๋๊ตฌ์ ๋์ผํ ํ๊ฒฝ์ ์๊ธฐ ๋๋ฌธ์ ์ง๊ณต ์ํ์์ Redux๋ฅผ ๊ฐ์ ํ ์ ์๋ ๋ฐฉ๋ฒ๋ฟ๋ง ์๋๋ผ Redux๊ฐ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ๋ค๋ฅธ ์ ์ ์ด์ ์ ๋ง์ถ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ ๋ค๋ฅธ ์ค์ํ ์ฌ์ค์ ์ ๊ท ์ฌ์ฉ์๊ฐ Redux๋ฅผ ์ฌ์ฉํ ๋ ๊ฒช๋ ๋ง์ ๋ฌธ์ ๊ฐ Redux ์์ฒด๊ฐ ์๋๋ผ JavaScript๋ผ๋ ๊ฒ์ ๋๋ค. Angular์ ๊ฐ์ ๋ค๋ฅธ ํฐ ํ๋ ์์ํฌ๋ JavaScript ์์ฒด๋ฅผ ์ถ์ํํฉ๋๋ค. Redux ๊ฐ์๊ธฐ๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋จ์ํ ์ด๋ณด์์๊ฒ ์ต์ํ์ง ์์ ์ ์๋ ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ "๋์์ธ ํจํด"์ ์ ์ฉํ๋ ๊ฒ์ด๋ฉฐ ์ฌ๋๋ค์ด ๋์ ๋ธ๋๋ฐ์ค๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๊ฒ ๋ง๋ค ๊ฒ์ ๋๋ค.
๋ง์ง๋ง์ผ๋ก ๋ง์ ์์ฉ๊ตฌ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ตฌ์ฑ ์์, ๊ฐ์๊ธฐ ๋ฐ ์์ ์์ฑ์ ์ฌ์ด์ 1:1:1 ๊ด๊ณ๋ฅผ ์ถ๊ฐํ๋ ค๊ณ ์๋ํฉ๋๋ค(3๊ฐ ๋ชจ๋๊ฐ ์๋ ์๋ ์์ง๋ง ์ข ์ข 2๊ฐ). , ์ฌ๋ฌ ๋ฆฌ๋์์ ์ํ๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋ฌ ๊ตฌ์ฑ ์์ ๋ฑ. ๊ทธ๊ฒ์ ์ง์ฅ๊ณผ ๋ค๋ฅธ ์ฅ์์์ ๋ด๊ฐ ๋๋ตํ๋ #1 ์ง๋ฌธ ์ค ํ๋์ด๋ฉฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ๋ฐ๋ผ์ ํด๋น ์์ญ์์ ๋์์ด ๋๋ ๋๊ตฌ๋ ์ด๊ฒ์ ์์ง ์์์ผ ํฉ๋๋ค(๋ํ "์ค์์น๊ฐ ์ด์ํ๋ค"๋ ์ธ๊ณ ์ต๊ณ ์ ์ฃผ์ฅ์ด ์๋๋๋ค).
๋ฐ๋ผ์ IMO, CTA์๋ ์ข์ ๋ฐ๋๋ผ JavaScript ๋ฆฌ์์ค๋ฅผ ์ฐ๊ฒฐํ๊ณ "์์ํ๊ธฐ" ๊ฐ๋ ์ ๋ฐ๋ผ "์ด์ "๋ฅผ ๋ ๋ง์ด ๋ฌธ์ํํ๊ณ ์์ ์ ๋จ์ํ๊ฒ ์ ์งํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค. ๋ง์ ์๋ก์ด ๊ฐ๋ ์ ์ ํ ๋ฐฐ์ฐ์ง ์๊ณ ๋ Redux์์ ๊ฑฐ๋ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์ ๋ redux๋ฅผ ๊ด์ฐฐํ ์ ์๋ ์ฌ๋์ด์ง๋ง ๋ฌธ์ ์์ด Thunk๋ฅผ ์ฌ์ฉํ๋ ์์ญ๋ง ์ค์ ์ฝ๋ ์ฑ์ ๋ณด์์ต๋๋ค(์์ ์ฑ์ด ์ฝํฌ๋ก ์ธํด ์ฌ๊ณ ๋ฅผ ์น๋ ๊ฒ๋ ๋ณด์์ต๋๋ค). ์์ฃผ ์ ์ ์์ "ํต์ฌ" ๊ฐ๋ ์ ์๊ฐํ๊ณ ๊ทธ๊ฒ๋ค์ด ์ด๋ป๊ฒ ์๋ง์ ๊ฐ๋ ์ ์ ์ฉ๋ ์ ์๋์ง ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ๋ง์ ๋์์ด ๋ฉ๋๋ค.
"๋น์ฉ์ ๊ด๊ณ์์ด ๋ชจ๋ ์์ฉ๊ตฌ๋ ์ค์ฌ์ผ ํฉ๋๋ค"๋ ์ค๋๋ ์ํํธ์จ์ด ์์ง๋์ด๋ง ์ปค๋ฎค๋ํฐ ์ ์ฒด์ ๋ฌธ์ ์ ๋๋ค. ํด๊ฒฐํ๊ธฐ๊ฐ ๋ ์ด๋ ต์ต๋๋ค.
์ฒ์๋ถํฐ redux๋ฅผ ์ฌ์ฉํ์ฌ ๋ด ์ฃผ์ ๊ด์ฌ์ฌ๋ ์ฝ๋๋ฅผ ์ฝ๊ฑฐ๋ ์ธ ๋ N๊ฐ์ ํ์ผ ์ฌ์ด๋ฅผ ์ด๋ํด์ผ ํ์ผ๋ฉฐ ๋จ์ผ UI ๋ถ๋ถ์ b/c ๋ก์ง์ด ์ฝ๋๋ฒ ์ด์ค ์ ์ฒด์ ๊ฑธ์ณ ์์ , ์์ ์ ํ ๋ฐ ์ฌ๋ฌ ๊ฐ์๊ธฐ. UI์ ๋ชจ๋ ์์น์์ ์ํ ํธ๋ฆฌ์ ์ด๋ ๋ถ๋ถ์๋ ์ ๊ทผํ ์ ์๊ณ ๋จ์ผ ์์ (๋ด๊ฐ redux๋ฅผ ์ฌ์ฉํ๋ ์ฃผ์ ์ด์ )์ ๋ํ ์๋ต์ผ๋ก ์ํ์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ณ๊ฒฝํ ์ ์๋ค๋ ์ ์ด ์ ๋ง ๋ง์์ ๋ญ๋๋ค. ๋จ์ผ ํ๋์ ๋ํ ์๋ต์ผ๋ก ์ํ๊ฐ ๋ณ๊ฒฝ๋ ์๋ก ๋ด ๋ ผ๋ฆฌ๊ฐ ๋ ํ๋ ค์ง๋๋ค. ๋๋ ์ฌ์ฉ์๊ฐ ์ด๊ฒ ๋๋ ์ ๊ฒ์ ํ์ ๋ ์ผ์ด๋ ์ผ์ ๋จ์ํ ์ฝ๊ฑฐ๋ ์ธ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ด๊ฐ ์ํ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช ํ ์ ์์ต๋๋ค.
// meta code
dispatch(ACTION);
onAction = {
ACTION: [
// handler 1: hide spinner here,
// handler 2: change status there,
// handler 3: update entity
],
};
๊ฒฐ๊ตญ ๋๋ redux-interactions
+ redux-tree
๋ฅผ ์๊ฐํด ๋๊ณ ์ง๊ธ๊น์ง๋ ๊ฝค ๋ง์กฑํฉ๋๋ค.
ํ์ฌ ํ๋ก์ ํธ์ ์ ๊ทผ ๋ฐฉ์:
์ฐธ๊ณ , ์์ฉ ํ๋ก๊ทธ๋จ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ๋งค์ฐ ๋ค๋ฅผ ์ ์์ต๋๋ค. :) ์ค์๊ฐ ๊ฐ์ฒด ์ ๋ฐ์ดํธ๋ฅผ ์ถ๊ฐํ๋ฉด ์๋ง๋ sagas ๋๋ observable์ด thunk/promise๋ณด๋ค ์ด์ ์ ์ ๊ณตํ ๊ฒ์ ๋๋ค.
service(name, method, ...opts)
(์: ๋ฏธ๋ค์จ์ด๊ฐ ์ด๋ฅผ ์ ํํ๊ณ x_FULFILLED
, x_PENDING
๋ฐ x_REJECTED
). ์ด ์์
์ ์ด๋ฆ์ ๋ฎ์ด์ธ ์๋ ์์ต๋๋ค.๋จผ์ componentDidMount()
๋ฅผ ์ฌ์ฉํ์ฌ API๋ฅผ ํธ์ถํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์ฑ ์์ ์ํ์ ์ ์ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฅผ ์ํด API ๋ํผ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฆ, ์์
์ด ๊ณ์ ์ ์ก๋๊ณ (์์ฒญ ์ ๋ณด์ธ ๋ฉํ๋ฅผ ํฌํจํ์ฌ ๋ก๊ฑฐ ๋ฏธ๋ค์จ์ด์ ์ํด ๊ธฐ๋ก๋จ) ํด๋น ๊ตฌ์ฑ ์์์ ๋ํ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ๋๋ก ๋ฆฌํฉํ ๋งํ๋ ค๋ ๊ฒฝ์ฐ ํ์ํ ๋ชจ๋ ๊ฒ์
๋๋ค. to๋ ์์
์ ์์ ํ๋ ๊ฐ์๊ธฐ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค. ๋ก์ปฌ ์ํ๋ง ์ฌ์ฉํ์ฌ ์์ํ๊ณ ํด๋น ๊ตฌ์ฑ ์์์ ์ํ๋ฅผ ๋ค๋ฅธ ๊ตฌ์ฑ ์์์์ ์ก์ธ์ค/์์ ํด์ผ ํ ๋ redux๋ก ๋ฆฌํฉํฐ๋งํฉ๋๋ค. ์ฆ, ๋ชจ๋ ๊ฒ์ ๋ํ ์ข
์ด ํ์ ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ณณ์์ redux๋ฅผ ์ฌ์ฉํ๋ ๋งค๋ ฅ์ ๋ด
๋๋ค. ํ์ฌ ํ๊ณผ ์ง์ ์ผ์ ์ ๊ฐ์ํ ๋ atm์ ๋์์ด ๋์ง ์์ต๋๋ค.
redux-saga๋ฅผ ์กฐ๊ธ ์ฌ์ฉํด ๋ณด์์ง๋ง ๊ฐ์ฅ ๋ณต์กํ ๋น๋๊ธฐ ํ๋ฆ์ ๋ก๊ทธ์ธ/๋ก๊ทธ์์์ด๋ฏ๋ก ์๋ํ๋ฏ๋ก(์ฝ๋๊ฐ ํฌ๊ฒ ๋ณต์กํ์ง ์์) ์ ํํ ํฐ ์ด์ ๋ ์์ต๋๋ค(ํ์ง๋ง ํ ์คํธํ ๊ฐ์น๊ฐ ์์ ์ ์์). ์ด์ - iterable + mock์ ํ ์คํธํ๊ธฐ์ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค). redux-observable ์๋ฅผ ๋ค์ด ์ด๋ฒคํธ๋ฅผ ๋ฉ์ง๊ฒ ๋ ๋ฒ ํด๋ฆญํ๋ ค๋ ๊ฒฝ์ฐ์ ๊ฐ์ด ๊ด์ฐฐ ๊ฐ๋ฅ ํญ๋ชฉ์ด ์์ฒด์ ์ผ๋ก ์ด์ ์ ์ ๊ณตํ์ง ์๋ ํ ์ฆ๊ฐ์ ์ธ ์ด์ ์ ๋ณผ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ๋ฆฌ๋์๋ฅผ ๋ฐํํ๋ ์์ฒด ํฉํ ๋ฆฌ ํจ์๋ฅผ ๊ฐ๊ณ ์ฌ์ฉ์ ์ ์ ๊ธฐ๋ฅ ์์ ์์ฒด ๊ณ ์ฐจ ๋ฆฌ๋์๋ฅผ ๊ฐ์ถค์ผ๋ก์จ ์์ฉ๊ตฌ์์ ์ฝ๊ฐ ๋ฒ์ด๋ฌ์ต๋๋ค. ํญ๋ชฉ์ ์์ ํ๋ ์์ ).
๋ด๊ฐ ํด์ผ ํ๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ ๊ธฐ๋ณธ ๋ฐ์ ์ฑ์์ ์์ ํ๋ ๊ฑฐ๋ํ ํํ ๋ฆฌ์ผ์ด๋ฉฐ, ๊ตฌ์ฑ ์์ ๊ฐ ํต์ ๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ๋ฅผ ์์ฐํ ๋ค์, redux๋ฅผ ๋์ ํ๊ณ , ๊ณ์ ์งํ ํ์ฌ ํน์ ์ํฉ์์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ์์ฐํ๊ณ ์ด๋ป๊ฒ ํ ์ ์๋์ง ๋ณด์ฌ์ค๋๋ค. redux-x๋ก ๋์์ ๋ฐ์ผ์ธ์ . ์ฆ, ์ธ์ , ๋ฌด์์ ์ฌ์ฉํด์ผ ํ๋์ง์ ๋ํ ์๋ด์ ๋๋ค. ์ด ๋ฐฉํฅ์ ๋ํ ํ ๋ก ์ด ์๋ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ด ๋ถ๋ช ํ ์์ต๋๋ค.
๋ํ ๊ด๋ จ์ฑ์ด ์๋ ๊ฒ์ gothinkster/react-redux-realworld-example-app ์์ ์ฌ์ฉ๋๋ ํจํด์ ๋ํด ์์ฝ์ ๋๋ค.
redux๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ ๋ด๊ฐ ์๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ํ์ฅ์ด ์ ๋์ง ์๋๋ค๋ ๊ฒ์ ์๊ฒ ๋์ด ๊ฒฐ๊ตญ redux-thunk์์ ๋ฉ์ด์ง๊ฒ ๋ฉ๋๋ค.
๋๋ ๋น์ ์ด ๋งํ๋ ๊ฒ์ ์ดํดํ์ง๋ง ์ฌ๊ธฐ์ ๋ด ์ด๋ฉด์ ์ธ ์ฐ๋ ค๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ฑฐ๋ํ JS ๊ฐ๋ฐ์ ๊ทธ๋ฃน์ด ์์ง _ํ์ดํ ๊ธฐ๋ฅ_ ๋ฐ ๊ธฐํ ๊ธฐ๋ณธ ES(6|2015) ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์๋๋ค๋ ์ผํ์ ์ธ ์ฆ๊ฑฐ๋ฅผ ์ ์ ๋ ๋ง์ด ๋ณด๊ณ ์์ต๋๋ค. , ์ดํด ๋ถ์กฑ, ํ๋ฐ ๋ฑ์ผ๋ก ์ธํด. Redux๋ฅผ ์์ํ๊ณ ์ถ์ดํ๋ ์ฌ๋๋ค๊ณผ Redux๊ฐ ์๊ฐํ๋ _patterns_ ํ์ต์ผ๋ก ํํ์ ๋ณผ ์ ์๋ ์ฌ๋๋ค์ด ๋จผ์ Observable์ด๋ Generator๋ฅผ ๋ฐฐ์ฐ๊ธฐ๋ฅผ ๊ธฐ๋ํ๋ ๊ฒ์ ์๋ง๋ ๋๋ฌด ๋ง์ ๊ฒ์ ์๊ตฌํ๋ค๊ณ ์๊ฐํฉ๋๊น?
Redux-thunk๋ ๋ํ ์ผ๋ฐ์ ์ผ๋ก redux ๋ฏธ๋ค์จ์ด๊ฐ ๋๋๋ฅผ ๊ตฌ๋ถ๋ฆฐ๋ค๋ ์ ์์ ์ฝ๊ฐ ๋ณต์กํ์ง๋ง ์ต์ํ JS๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ ์ ํํ๊ธฐ ์ฌ์ด ํจ์/์ฝ๋ฐฑ์ผ ๋ฟ์ ๋๋ค. "best-practice-always-redux"๊ฐ ์๋ "learn-redux"๋ก ํ์๋๋๋ผ๋ ๋จ์ผ ๋ค์ด๋ก๋๋ฅผ ํตํด ์ฌ์ฉํ ์ ์๋ ์์ํ๊ธฐ ์ํ ๊ด๋ จ ๋๊ตฌ์ ์์ ํ ํจํค์ง๋ฅผ ๊ฐ๋ ์์ด๋์ด๊ฐ ์ ๋ง ๋ง์์ ๋ญ๋๋ค. create-react-app์ด ์ค์ ํ ๋ชจ๋ ๊ฒ์ ๋ฐฐ์ธ ๋ ์กฐ์ ์ด ํ์ํ ๊ฒ๊ณผ ์ ์ฌํ๊ฒ, ์ด๊ฒ์ ์์ ์ ์กฐ์ ์ ์ฅ๋ คํ ์ ์๊ณ , ์๋ง๋ ๊ฐ๋จํ redux-thunk ์ค์ ์ saga ๋ฑ์ ์์ฒด ํ์์ผ๋ก ์ฌ์ฉํ๋๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค ์ ์์ต๋๋ค. "ํ์ถ"์ ...
๊ทธ๋ฅ ๋ช ๊ฐ์ง ์๊ฐ.
๋๋ ๋น์ ์ด ๋งํ๋ ๊ฒ์ ์ดํดํ์ง๋ง ์ฌ๊ธฐ์ ๋ด ์ด๋ฉด์ ์ธ ์ฐ๋ ค๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ฑฐ๋ํ JS ๊ฐ๋ฐ์ ๊ทธ๋ฃน์ด ์์ง ํ์ดํ ๊ธฐ๋ฅ ๋ฐ ๊ธฐํ ๊ธฐ๋ณธ ES(6|2015) ๊ธฐ๋ฅ์กฐ์ฐจ ์ฌ์ฉํ์ง ์๋๋ค๋ ์ผํ์ ์ธ ์ฆ๊ฑฐ๋ฅผ ์ ์ ๋ ๋ง์ด ๋ณด๊ณ ์์ต๋๋ค. , ์ดํด ๋ถ์กฑ, ํ๋ฐ ๋ฑ์ผ๋ก ์ธํด. Redux๋ฅผ ์์ํ๊ณ ์ถ์ดํ๊ณ Redux๊ฐ ๋์ ํ ํจํด์ ํ์ตํ์ฌ ํํ์ ๋ฐ์ ์ ์๋ ์ฌ๋๋ค์ด Observable์ด๋ Generator๋ฅผ ๋จผ์ ๋ฐฐ์ฐ๊ธฐ๋ฅผ ๊ธฐ๋ํ๋ ๊ฒ์ ์๋ง๋ ๋๋ฌด ๋ง์ ๊ฒ์ ์๊ตฌํ๋ค๊ณ ์๊ฐํฉ๋๊น?
๋น๊ณ ! ์ฐ๋ฆฌ๋ ๋ง์ ์ฌ๋๋ค์ด JS๋ฅผ ์ฒ์ ์ ํ๋ ํ๊ฒฝ์ ์์ต๋๋ค. ํนํ ๊ทธ ์ฌ๋๋ค์ด ๋ค๋ฅธ ์ํ๊ณ(์๋ฐ, ๋ ์ผ ๋ฑ)์ ์๋ จ๋ ์ํํธ์จ์ด ์์ง๋์ด๋ผ๋ฉด ๋ชจ๋ฅด๋ ๊ฐ๋ ์ ๋ฐฐ์ฐ๊ธฐ ์ ์ ์๊ณ ์๋ ๊ฐ๋ ์ ๋น ๋ฅด๊ฒ ์๋ํ๊ณ ์ ์ฉํ ๊ฒ์ด๊ณ ์ ๋๋ก ์๋ํ์ง ์๊ณ ๋งํ๊ฒ ๋ ๊ฒ์ ๋๋ค. ๊ธฐ๋ฅ์ ์ธ UX ๋์์ธ ํจํด์ ๋ฐ์ด๋ค๊ธฐ ์ ์ ์ฌ๋๋ค์ด JS๋ฅผ ๊น์ด ์ดํดํ๋๋ก ์ค๋ํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ฌด์์ธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
Redux ๋ฌธ์์๋ ์ง๊ธ ๋ฌด์ธ๊ฐ๋ฅผ ์ฐพ๊ณ ์๊ณ Redux ์์ ์ ์ฒด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฑํํ๊ณ ์ถ์ง ์์ ๋ ์๋ฅผ ์ํด Reducing Boilerplate์ ๋ํ ์น์ ์ด ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ด ๋ ผ์์ ๋ํด ์ฝ๊ฐ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํ๋ฉฐ ์ด๊ฒ์ด ์๋ง๋ ์ด๋ฏธ ๋ง์ด ์์ ๊ฑฐ๋ฅผ ํ ์ ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ผ ํฉ๋๋ค. Redux ํ์ ์ฌ๊ธฐ์์ ์ ์๋ ์ ์๋ ๋ง์ ๊ฒ๋ค์ ๋ฃ๊ณ , ๊ณ ๋ คํ๊ณ , ๊ฑฐ๋ถํ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ ๋ ผ์๋ ๊ฒ๋ค์ ๋ํด์๋ง ์ธ์ฐ๋ฉด ์ด ํ ๋ก ์์ ์๋ฌด ๊ฒ๋ ๋์ค์ง ์์ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค.
์ฆ, ๋ชจ๋ ์ฌ๋(์ ๊ท ๋ฐ ๊ฒฝํ์)์ด ํ๋ ์์ํฌ์ ๋ ์ฝ๊ฒ ์ก์ธ์คํ ์ ์๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ด์ผ๊ธฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์์ฉ๊ตฌ๋ฅผ ์ค์ด๊ธฐ ์ํด ์ ์ํ๋ ๋ชจ๋ ๊ฒ์ ํ์ํ ๋๋ง๋ค ์ถ์ํ ์๋์ ํญ๋ชฉ์ผ๋ก ๋์๊ฐ ์ ์์ด์ผ ํฉ๋๋ค. ์ถ์ํ ์์ฑ์๊ฐ ์๊ฐํ์ง ๋ชปํ ํ ๊ฐ์ง ์ถ๊ฐ ์ฌํญ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๋์ค์ ํ์ ์์ค์ผ๋ก ๋์๊ฐ๊ธฐ ์ํด ์ถ์ํ๋ฅผ ์ฑํํ๋ ๊ฒ์ ์ฌ๋ฏธ๊ฐ ์์ต๋๋ค.
Redux ํ์ต ๊ณก์ ์ ๊ฐํ๋ฅด์ง๋ง ์ผ๋จ ๊ฐ๋ ์ ์ดํดํ๋ฉด
์ถ์ํ ๊ณ์ธต์ ์ข ์ข ์ฌ๋ผ์ง๋๋ค.
์ด ๊ฒฝ์ฐ Redux์ ์ด๋ค ๋ถ๋ถ์ ๊ฐ์ ํ๊ธฐ ์ํด ์ ์ํ๊ณ ์๋์ง ๊ถ๊ธํฉ๋๋ค. ์ฆ์ ๋ค์ ์ถ๊ฐํ ํ์๊ฐ ์๋ ๋ถ๋ถ์ ์ ๊ฑฐํ๊ฑฐ๋ ์ถ์ํํ์๊ฒ ์ต๋๊น?
์ด๊ฒ์ ์ฝ 1๋
์ ์ง์ฅ์์ ๊ฐ์ฐ์ ์ํด ๋ง๋ ์ ์ฒด ๋ฐ์/๋ฆฌ๋์ค ์๋ช
์ฃผ๊ธฐ์ ๋ค์ด์ด๊ทธ๋จ์
๋๋ค.
์ฌ๊ธฐ์๋ ๊ฝค ๋ง์ ๋ถ๋ถ์ด ์์ง๋ง, ๊ทธ ์ค ์ด๋ ๊ฒ๋ ์์ด Redux๊ฐ ์ ์๋ํ๋ค๊ณ ์์ํ ์ ์์ต๋๋ค. ์ปจํ ์ด๋๋ ๋๋๋ก ์ฑ๊ฐ์ ์ผ์ด์ง๋ง ์ปจํ ์ด๋๋ฅผ ์ ๊ฑฐํ๋ฉด ๋ทฐ ๋ก์ง๊ณผ ๋ฐ์ดํฐ ๋ ์ด์์์ด ๊ธด๋ฐํ๊ฒ ์ฐ๊ฒฐ๋ฉ๋๋ค. ์์ ์ ์ ๊ฑฐํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก Redux๋ฅผ ์ฒ์๋ถํฐ ์ฌ์ฉํ๋ ์์ ์ ๋์น๋ MVC๊ฐ ๋ฉ๋๋ค. ํด๋น ๋ค์ด์ด๊ทธ๋จ์ "๋ณด๊ธฐ"๋ ์ ์ฅ์๋ฅผ ๊ตฌ๋ ํ๊ณ ๋ฐ์ ๊ตฌ์ฑ ์์๋ฅผ ๋ ๋๋งํ๋ ๊ธฐ๋ฅ์ผ๋ก ๋ชจ๋ธ๋งํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ ๊ฑฐ์ ์กด์ฌํ์ง ์์ต๋๋ค.
์ ์ฒด ํ๋ ์์ํฌ ์์ฒด์์ ์ ๊ฑฐํด์ผ ํ ์์ฉ๊ตฌ๊ฐ ๋ง์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ง๋ ์ก์ ์์ฑ์, ๋ฆฌ๋์ ๋๋ ์ปจํ ์ด๋์ ๊ฐ์ ํ๋ ์์ํฌ์ ๊ฐ๋ณ ๋ถ๋ถ์ ์๋ ์์ฉ๊ตฌ๋ฅผ ์ฐธ์กฐํ๊ณ ์์ ๊ฒ์ ๋๋ค. ์ด ๊ฒฝ์ฐ ์์์ ์ธ๊ธํ ์์ฉ๊ตฌ ์ค์ด๊ธฐ ํ์ด์ง์ ํ์ ์ด๋ฏธ ์ด๋ฌํ ๋ฌธ์ ์ ๋๋ถ๋ถ์ ํด๊ฒฐํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ "๋ ๋์"๊ฒ์ผ๋ก ๋ง๋ค๊ธฐ ์ํด ๊ทธ ์์ ์๋ฌด๊ฒ๋ ํ์ํ์ง ์์ต๋๋ค. (์ฐธ๊ณ : ๋ ๋์ ๊ฒ์ ๋ง๋ค๊ธฐ ์ํด ๋ฌด์ธ๊ฐ๋ฅผ ์ถ๊ฐํ๋ ๋ฐ ๊ฐ๋ฐฉ์ ์ด์ง ์๋ค๋ ๊ฒ์ ์๋๋๋ค. ๋จ์ง ์์ง ๋ณด์ง ๋ชปํ์ ๋ฟ์ ๋๋ค.)
์๋ง๋ ์ด๊ฒ์ ์์ฉ๊ตฌ ๊ฐ์ ๋ฌธ์ ๊ฐ ์๋๋ผ Redux ๊ต์ก์ ๊ฐ์ ํ๋ ๋ฌธ์ ์ผ ๊ฒ์ ๋๋ค. ํ๋ ์์ํฌ๊ฐ ์ด๋ณด์์๊ฒ ์ด๋ ต๋ค๋ฉด Redux ๋ฌธ์๋ฅผ ๊ฐ์ ํ๊ณ ๋ ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋๋ก ํด์ผ ํ ์ ์์ต๋๋ค. ์๋ง๋ ๊ฐ์ํ๋ ์์ฉ๊ตฌ ํ ์ค ์ผ๋ถ๋ ๋ฌธ์์์ ๋ ์ ๊ทน์ ์ผ๋ก ๊ด๊ณ ํด์ผ ํ ์๋ ์์ต๋๋ค.
ํ์ํ ๋จ๊ณ(๋ณด์ผ๋ฌ ํ๋ ์ดํธ)์ ์์ ์ค์ด๋ ๊ฒ์ด ํญ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ ์๋๋๋ค. ๋ด ๊ฒ์๋ฌผ์ ๋งจ ์ฒ์๋ถํฐ ๋ด ์์ ์ ๊ฐ์กฐํ๊ธฐ ์ํด ์ฌ๋๋ค์ด ์ฌ์ฉํด์ผ ํ ๋ชจ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ์ง ์์๊ธฐ ๋๋ฌธ์ ํ๊ธฐ๋ ์ถ์ํ๋ฅผ ์์ฑํ๊ณ ์ถ์ง๋ ์์ต๋๋ค.
์ง๊ธ๊น์ง ์ข์ ํ ๋ก . ์ ๊ฐ ๋ณผ ์ ์๋ ์ผ๋ฐ์ ์ธ "๋ณด์ผ๋ฌ ํ๋ ์ดํธ" ๊ด๋ จ ๋ถ๋ง ์ฌํญ์ ๋ํ ๋ช ๊ฐ์ง ๊ฐ๋จํ ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
dispatch
๊ฐ ํ์ํ ์ด์ ๋ ๋ฌด์์
๋๊น? ์๋ํ๋ ค๋ฉด ์ด ๋ชจ๋ ๊ธฐ๋ฅ์ ๋ง๋ฌด๋ฆฌํด์ผ ํ๋ ์ด์ ๊ฐ ๋ฌด์์
๋๊น?"๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ์ ํ์ ์ฃผ์์ ๋ํ ๋ช ๊ฐ์ง ๊ตฌ์ฒด์ ์ธ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ "๋ณด์ผ๋ฌํ๋ ์ดํธ" ๋ฌธ์ ์ ๋ํ ์ผ๋ถ ์๋ต์ ์ฆ์ ์ญ์ ํ๋ ค๋ฉด ๋์ด๋ 5๊ฐ์ง ๋ฒ์ฃผ ์ค " dispatch
"๋ง ์ค์ ๋ก _ํ์_๋ฉ๋๋ค. ๋๋จธ์ง:
store.dispatch()
๋ฅผ ํธ์ถํด์ผ _ํด์ผ_ ํฉ๋๋ค. ์ด๊ฒ์ด Redux์ ๊ธฐ๋ณธ ์ค๊ณ ๊ฒฐ์ ์
๋๋ค. ์ก์
์์ฑ์๋ฅผ ๋ฐ์ธ๋ฉํ๋ฉด ์ฐ๊ฒฐ๋์ง ์์ ์์ ๊ตฌ์ฑ ์์์ ์ ๋ฌํ ์ ์์ผ๋ฉฐ ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค ์ฌ์ ํ ๋์คํจ์น๋๋๋ก ํ ์ ์์ต๋๋ค.๋ฐ๋ผ์ ์ ๋ฐ์ ์ผ๋ก ์ด๋ฌํ "๋ณด์ผ๋ฌํ๋ ์ดํธ" ๋ฌธ์ ์์ _ํ์_์ธ ๊ฒ์ ๊ฑฐ์ ์์ต๋๋ค. ๋ฌธ์์ ์์ ์ ์ค๋ณต ์ ๊ฑฐ ์ฝ๋ ๋ฐ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ์ ๊ฐ์ "์ข์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ๋ฒ"์ ์กฐํฉ์ ๋๋ค.
@markerikson ์ด ์ ๊ธฐํ ์ง๋ฌธ์ ์ ๋ง ๊ณต์ ํ๋ค๊ณ ์๊ฐํ๋ฉฐ ๊ณผ๊ฑฐ ์ด๋ ์์ ์ ๋ ์์ ์ ์ด ์์ต๋๋ค.
Redux๋ ์ด๋ค ์๋ฏธ์์๋ ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง์ ์ํ "์ ์์ค" ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ๊ทธ๋ฌํ ์ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋๋ถ๋ถ์ ๊ฒฝ์ฐ๋ฅผ ์ค๋ช ํ๊ธฐ ์ํด ์ฝ๊ฒ ์ถ์ํํ ์ ์๋ ๋ง์ ๊ฒ์ ๋ ธ์ถํฉ๋๋ค. @gaearon ์ด ์๋ ๊ทธ๋ ๊ฒ ํ์ง ์์ ์ด์ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ต๋ํ ์๊ณ ์ ์ฐํ๊ฒ ์ ์งํ๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ ๊ฒฐ์ ๋๋ถ์ ์ฐ๋ฆฌ๋ Redux ์ฝ์ด์ ๋ชจ๋ ๊ฒ์ ๊ฐ์ง ํ์ ์์ด Redux ์์ ๋ค์ํ ๊ฒ๋ค์ ๊ตฌ์ถํ ์ ์์์ต๋๋ค.
Redux ์์ ์ข์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ๋ฐํ๊ณ ์์ ํํ๋ ์ฌ๋ฐ๋ฅธ ๊ฒฝ๋ก(์: Jumpstate?)๋ฅผ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๋๋ค์๊ฒ ์ด๋ฅผ ๊ฐ๋ฅด์น๋ ๊ฒ์ผ๋ก ์์ํ ๋ค์ ํ์ํ ๋ Redux๋ฅผ ์ง์ ์ฌ์ฉํ ์ ์๋ ์ฌ์ด ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํฉ๋๋ค.
Redux๋ ํต์ฌ ์ฝ๋๋ฒ ์ด์ค์์ ํจ์ฌ ๋ ๋ง์ ๊ฒ์ ํ์๋ก ํ๋ค๊ณ ์๊ฐํ์ง ์์ผ๋ฉฐ ์๊ตฌ์ ์ผ๋ก ์ถ์ํํด์ผ ํ๋ ๋ถ๋ถ์ด ๋ณด์ด์ง ์์ต๋๋ค. (๊ทธ๋ ๋ค๋ฉด ์๋ ค์ฃผ์ธ์ :smile:) ์ โโ์๊ฐ์๋ Redux ์ฝ์ด์์ ๋ฌด์ธ๊ฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ์ฌ ์ป์ ์ ์๋ ๊ฒ์ด ๋ง์ง ์์ต๋๋ค.
๋ชจ๋ ์ฌ๋์ด ์ฌ์ฉํ ์ ์์ ๋งํผ ์์ ์ ์ด๊ณ ์ ์ฐํ๊ฒ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ํ๋ ๊ฒ์ด ๋ ๋์ ์ต์ ์ผ ์ ์์ต๋๋ค. ๋งํ๋ฏ์ด "๋ณด์ผ๋ฌ ํ๋ ์ดํธ"๋ ์ค์ ๋ก ๋ง์ด ํ์ํ์ง ์์ผ๋ฏ๋ก Redux ์์ฒด๋ฅผ ์์ ํ๋ ๋์ Redux ์๋จ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ฑฐํฉ์๋ค.
๋ค๋ฅธ ์ปค๋ฎค๋ํฐ์์ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ๋ ์๋ Rust ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋๋ค. "mio" ๋ผ๋ Rust ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ํ ๋น์ฐจ๋จ IO ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค. Redux์ ๋ง์ฐฌ๊ฐ์ง๋ก ์๊ณ ๋ฎ์ ์์ค์ ์ค์ ์ ๋ก๋๋ค. ๋ฌธ์ ๋ ์ ๋ง ์ด๋ ต๊ณ ์์ฉ๊ตฌ๋ก ๊ฐ๋ ์ฐจ ์๊ธฐ ๋๋ฌธ์ ์๋ฌด๋ ์ง์ ์ฌ์ฉํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๋๋ถ๋ถ์ ์ฌ๋๋ค์ mio๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ณ ๋งค์ฐ ์ ์ฉํ๊ณ ์ธ์ฒด๊ณตํ์ ์ผ๋ก ๋ง๋ค์ด์ฃผ๋ tokio ๋ผ๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฐ ์์ผ๋ก mio์ ๋ฐฐ๊ด์ด ํ์ํ ์ฌ๋์ ์ง์ ์ฌ์ฉํ ์ ์์ง๋ง ๋นจ๋ฆฌ ๋ง๋ค๊ณ ์ถ์ ์ฌ๋์ tokio๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ ์ฌํ ๋ชจ๋ธ์ ์ฑํํด์ผ ํฉ๋๋ค.
@sunjay ์ ๋ช ๊ฐ์ง ์๊ฒฌ์ ํ์ฅํ๋ ค๋ฉด ๋ค์์ ์ํํ์ญ์์ค.
์ต๊ทผ #775์ ๋ด์ฉ์ ์ ํฌ์ฐฉํ๋ ๋๊ธ์ด ์์์ต๋๋ค.
Redux๋ ์ถฉ๋ถํ ๊ตฌ์กฐ์ ์ ์ฐ์ฑ์ ๊ท ํ์ ์ ๊ณตํ๋ ์ผ๋ฐ ํ๋ ์์ํฌ์ ๋๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฐ์๊ฐ ๊ทธ๋ํฝ ๋๋ฒ๊ฑฐ ๋๋ ๋ฏธ๋ค์จ์ด์ ๊ฐ์ ๊ฒ์ ์ฌ์ฌ์ฉํ ์ ์๋ ๋์์ ์ฌ์ฉ ์ฌ๋ก์ ๋ํ ๋ง์ถคํ ์ํ ๊ด๋ฆฌ๋ฅผ ๊ตฌ์ถํ ์ ์๋ ํ๋ซํผ์ ์ ๊ณตํฉ๋๋ค.
์, Redux๋ ์ฌ๋ฌ ๋ฉด์์ "๋จ์ง ํจํด"์
๋๋ค. ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ธฐ๋ฅ์ด ์๋ฒฝํฉ๋๋ค. ์ค์ ๋ฐ์ฏค ๊ณํ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์๋ ์ธํธ์ ๊ตฌ์กฐ ์กฐ์ ( #1702, #2214 ) ๋ฐ combineReducers
๋ ์ ์ฐํ๊ฒ ๋ง๋๋ ๊ฒ( #1768 , #1792 ๋ฑ)๊ณผ ๊ฐ์ ๊ฒ์
๋๋ค. ).
Redux๊ฐ ๋ง๋ค์ด์ง ์ง ๊ฑฐ์ 2๋ ์ด ์ง๋ฌ๊ณ ์ด์ ์ฌ๋๋ค์ด Redux๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ๊ณ ์๋์ง ์ ์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, @jimbolla ๋ #2214์์ ์๋ ค์ง ๋ชจ๋ ์์ ๊ฐํ ์ฅ์น ๋ชฉ๋ก์ ์์งํ๊ณ ์๋ ๋ฐฉ์๊ณผ ์ฉ๋๋ฅผ ๋ถ๋ฅํ์ต๋๋ค. ์ ๋ ์ฌ์ ํ Redux์ ๋จ์์ฑ๊ณผ ์ ์ฐ์ฑ์ ๋ํ ์ด๋ ฌํ ํฌ์ด์ง๋ง Redux๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ผ๋ฐ ์ฌ์ฉ์ ๋จ์ํํ๊ณ ์ฌ๋๋ค์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ์ฌ์ ํ ๊ด์ฉ์ ์ธ ์ถ์ํ๋ฅผ ๋ณด๊ณ ์ถ์ต๋๋ค.
์ค ๊ด๋ จ ์ฃผ์ ์ ๋ ๋ค๋ฅธ ์ธํธ์ ๊ฐ์ธ์ ์ผ๋ก ๋๋ ทํ ๊ด์ฌ์ด ์๋ ๊ฒ์ "์บก์ํ๋ ๋ ผ๋ฆฌ/๊ตฌ์ฑ ์์"( @slorber ์ "Elm/Redux๋ฅผ ์ฌ์ฉํ ํ์ฅ ๊ฐ๋ฅํ ํ๋ก ํธ์๋" ํ๋ ์ด๊ทธ๋ผ์ด๋ ๊ธฐ์ค) ๋ฐ "ํ๋ฌ๊ทธ"์ ๋ํ ์์ด๋์ด์ ๋๋ค. -and-play Redux ์ค์ "(https://github.com/brianneisler/duxtape/issues/1 , https://github.com/jcoreio/redux-features/issues/7 ๋ฑ์ ์คํ์์ ๋ณผ ์ ์์). ์ ์ญ ์ํ ๋ฐ ์ฑ ์ค์ ์ ์ผ๋ถ ์ฌ์ฉ ์ฌ๋ก์ ์ ํฉํ์ง๋ง ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก์๋ ์ ํฉํ์ง ์์ต๋๋ค.
ํฅ๋ฏธ๋ก์ด ๊ด๋ จ ์ฌํญ์ผ๋ก @toranb ๋ https://github.com/ember-redux/ember-redux ์์ Redux์ฉ Ember ๋ํผ๋ฅผ ๋ง๋๋ ํ๋ฅญํ ์์
์ ์ํํ์ต๋๋ค. Ember ์ธ๊ณ๋ _์ ๋ง__ "๊ตฌ์ฑ๋ณด๋ค ๊ด๋ก"์ด๋ฏ๋ก ember-redux
๋ redux-thunk
๋ฑ์ ํฌํจํ์ฌ ํฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ ์ ์ฅ์ ๊ตฌ์ฑ์ ์ค์ ํฉ๋๋ค. ๊ทธ๋ฌํ ์ ๊ทผ ๋ฐฉ์์ด ๋์์ด ๋ ์ ์์ต๋๋ค.
๋ค, ์ ๋ ์ฌ๊ธฐ์์ ์ฌ๋ฌ ๊ฐ์ง ๋ค์ํ ์๊ฐ์ ์์๋ด๊ณ ์์ต๋๋ค. ํ์ง๋ง ๊ทธ๊ฒ๋ค์ ๋ค์ํ ๋ฐฉ์์ผ๋ก ๊ด๋ จ๋์ด ์์ต๋๋ค. ์ ๋ฐ์ ์ผ๋ก Redux๋ฅผ ๋ฐฐ์ฐ๊ณ ์ฌ์ฉํ๋ ๋ฐ ๋ํ ์ฅ๋ฒฝ์ ๋ฎ์ถ๊ณ ์ ๋ฐ์ ์ผ๋ก ๊ณ ๊ธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํ์ฑํํ๊ณ ์ถ์ต๋๋ค.
Redux๋ ์ ๋ฌธํ๋์ง ์์ ์ผ๋ฐ API์ ๋๋ค. ์ด๊ฒ์ ๋ ๋ง์ ๊ฒฝ์ฐ๋ฅผ ๋ค๋ฃจ๋ฉด์ ๋ ์ฅํฉํ๊ฒ ๋ง๋ญ๋๋ค. ๊ทธ ํ์ ๋ณต์กํ ์ํํธ์จ์ด์ ์๋ ๋ฐ๋ฉด, ์๋กญ๊ฑฐ๋ ๋จ์ํ ํ๋ก์ ํธ๋ ํ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ์ผ๋ฐ API๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ๋ฌธํ๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ ์์ฉ๊ตฌ๋ฅผ ์ค์ด๋ https://github.com/acdlite/redux-actions ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋๋ ์ฌ์ ํ redux์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ๊ทธ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ๋ ๊ฒ๋ง์ผ๋ก๋ ๋ด ์๊ตฌ ์ฌํญ์ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
๋ค๋ฅธ ๋ฌธ์ ๋ ์์ฒญ๋๊ฒ ๋ณต์กํ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ณ ํต์ ๊ฒฝํํ์ง ์์ ์๋ก์ด ์ฌ๋๋ค์ด ์์ ์ด ๋ฌด์์ธ์ง ๊ถ๊ธํดํ๋ ๊ฒ์ ๋๋ค. ๊ธ์, ๊ทธ๋ค์๊ฒ ๊ทธ๋ค์ ๊ณ ํต์ ๊ฒฝํํ ๋๊น์ง redux๋ฅผ ์ฌ์ฉํ์ง ์์์ผ ํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ Dan์ egghead ์๋ฆฌ์ฆ๋ ์ด ์ง์ ์ ์์ฃผ ์ฝ๊ฒ ์ง๋์น ์ ์์ต๋๋ค.
https://egghead.io/courses/getting-started-with-redux
https://egghead.io/series/building-react-applications-with-idiomatic-redux
์ฐธ์กฐ: ์ถ์ํ์ ์คํํธ๋ผ: https://www.youtube.com/watch?v=mVVNJKv9esE
์ธ๊ธํ ๋ฐ์ ๊ฐ์ด redux-actions
๋ ์ผ๋ถ ์์ฉ๊ตฌ๋ฅผ ์ ๊ฑฐํ๋ ๋ฐ ์๋นํ ๋ฅ์ํฉ๋๋ค. .toString
๋ฅผ ์ฒจ๋ถํ์ฌ ๋ฐฉ์ ์์์ ์์๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ์ ๋ง ์ข์ ์์ด๋์ด์
๋๋ค. ๊ทธ๋ฌ๋ redux-actions
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ์ด ๋
ผ๋ฆฌ๋ฅผ ์ง์ ์์ฑํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
Imho ๋์คํจ์น๋ ์์
์คํธ๋ฆผ์ ๊ด์ฐฐํ๊ธฐ ์ํ ๊ธฐ๋ณธ ์ ๊ณต ๋ฉ์ปค๋์ฆ( subscribe
์ ์ฝ๋ฐฑ ์ธ์?)์ด ์์ด์ผ ํฉ๋๋ค(๋ฏธ๋ค์จ์ด์์ ์ํํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์๋นํ ์ ํ์ ์
๋๋ค. ์ธ๋ถ, ์ฆ ๊ตฌ์ฑ ์์ ๋๋ connect
)
๋๋ ์ข ์ข redux๋ฅผ ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ ๊ฐ๋ฅด์น๋๋ฐ ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ์๋นํ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
๋๋ redux๊ฐ ๊ทธ ์์ฒด๋ก ์ด์ฒด์ ์ผ๋ก ์๋ฏธ๊ฐ ์๋ ํ๋ฅญํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๊ณ ์๊ฐํ๋ฉฐ, ๊ทธ๊ฒ์ด ํ๋ฅญํ ์ถ์ํ๋ฅผ ๊ฐ์ง๊ณ ์๊ณ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉ๋ ๋ ํ์ฅ์ฑ์ด ๋งค์ฐ ๋ฐ์ด๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ํ redux๋ ๋ชจ๋ UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ์ฌ์ฉํ ์ ์์ง๋ง ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ฐ์๊ณผ ํจ๊ป ์ฌ์ฉ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ง์ ์ข์ ๊ฐ์ด ์์ง์ด๋ ๋ถ๋ถ์์ ๋น๋กฏ๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ ๊ฐ ๊ฐ์ก๋ ๋ช ๊ฐ์ง ์๊ฐ์ด ์์ต๋๋ค. ์ด ๋ชจ๋ ๊ฒ์ redux ์์ ๊ตฌ์ถ๋ ์ ์์ผ๋ฏ๋ก ๊ทธ๋๋ก ์ ์ง๋ ์ ์์ต๋๋ค.
render
๋ฉ์๋์์ ๋ฉ์ฒญํ ๊ตฌ์ฑ ์์๋ฅผ ๋ ๋๋งํ ์ ์์ต๋๋ค.redux action loadUsers
๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๋ ค๋ฉด _redux-cli_๋ฅผ ์ ๊ณตํ์ธ์.NS
๋์ํฉ๋๋ค. redux-actions
๋ ์์ฉ๊ตฌ๋ฅผ ์ ๊ฑฐํ๋ ๋ช ๊ฐ์ง ๊ฐ๋จํ ์ถ์ํ์ ์ข์ ์์
๋๋ค.
์ด๋ ๊ฒ ๋ฌป๊ฒ ์ต๋๋ค. Create-React-App์๋ ๋ฏธ๋ฆฌ ๋น๋๋ Babel ๋ฐ Webpack ๊ตฌ์ฑ์ด ํฌํจ๋ react-scripts
ํจํค์ง๊ฐ ์์ผ๋ฉฐ ํฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ์ด ๋ง์ด ๋ด์ฅ๋์ด ์์ต๋๋ค. ํด๋น redux-scripts
ํจํค์ง๋ ์ด๋ป๊ฒ ์๊ฒผ์ต๋๊น?
redux-thunk
๋ํ ๋ค๋ฅธ (๋ถ์ ์ ์ธ) ์๊ฒฌ์ ๋์ํฉ๋๋ค. ์ด๋ณด์์๊ฒ๋ ๊ถ์ฅํ์ง ์์ต๋๋ค(๋ ์ด์ ๊ถ์ฅํ์ง ์์ ๊ฒ์
๋๋ค).
dispatch
๋ฅผ ๊ฐ์ ธ์ ์ ๋ฌํด์ผ ํ๋ ๊ฒ์ ์ฝ๋์ ์์ ๋ถ๋ถ์ผ ๋ฟ์
๋๋ค.React-Native ์์ฉ ํ๋ก๊ทธ๋จ์์ ๊ฝค ๋ง์ด ์ฌ์ฉํ๊ณ ๋๋ถ๋ถ ์ ์ฉํ์ง๋ง redux-thunk ์์
์์ฑ์๊ฐ void
ํจ๊ณผ์ ์ผ๋ก ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์์
์ ํจ๊ป ๊ตฌ์ฑํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค("๋ก๊ทธ์ธ ์ฑ๊ณต ํ ํ๋กํ ๋ก๋" ์ฐธ์กฐ)
๊ทธ๊ฒ์ ์ฌ๋๋ค์ด "๋ฌด์์ด๋ ํ ์ ์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ React ์ด๋ฒคํธ ํธ๋ค๋ฌ/์ฝ๋ฐฑ์์ ์ฆ์ dispatch
ํ๋ ๊ฒ"์ด๋ผ๊ณ ์๊ฐํ๋๋ก ๋ถ์ถ๊ธฐ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ connect
from react-redux
ํ๊ณ mapDispatchToProps
์ ํฌ๊ฒ ์์กดํ๊ธฐ ๋๋ฌธ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๊ฐ ์ผ๋ฐ ํจ์์ผ
(์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ถ๋ถ ์๋ ์ด์ ์์ฑ๋์์ผ๋ฉฐ ๋ ํฐ Redux ์ํ๊ณ์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ ๋๋ก ํ์ ํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์ต์ ๋ฒ์ ์ด ์๋ ์ ์์ต๋๋ค.)
@bodhi : ์ ์ ์ _๋๋ฌด_ ๋ง์ด ์งํํ์ง ์๊ณ , ๋๋ ๊ทธ ๊ฒฐ๋ก ๋ค ์ค ์ผ๋ถ์ ๋์ํ์ง ์์ ๊ฒ์
๋๋ค. redux-thunk
๋ 11 ์ค์ด๋ฉฐ "Thunk๊ฐ ๋ฌด์์ธ๊ฐ์?" ์ ๊ฐ์ ๋ฉ์ง ์ค๋ช
Idiomatic Redux: Thoughts on Thunks, Sagas, Abstraction, and Reusability ์์ thunks(๊ทธ๋ฆฌ๊ณ ์ด๋ ์ ๋๋ sagas)์
์ผ๋ถ ๊ฐ์ ์ถ์ํ ๊ณ์ธต์์ ๋ถ์์ฉ์ ์ฒ๋ฆฌํ๋ _some_ "์ถ๋ณต๋ฐ์" ๋๋ "๋ด์ฅ๋" ๋ฐฉ๋ฒ์ด ํ์ํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. Sagas์ Observable์ ๋ ๋ค ํ๋ฅญํฉ๋๋ค. ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ดํดํ๋ค๋ฉด _if_์ ๋๋ค. ์ฌ๊ธฐ์ ์ ์ฌ์ ์ธ ๋ชฉํ๊ฐ Redux๋ฅผ ๋ฐฐ์ฐ๊ณ ์ฌ์ฉํ๋ ์ฌ์ด ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด๋ผ๋ ์ ์ ๊ฐ์ํ ๋ ์ ์ ํ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
redux-thunk
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ํํ๋ ๊ฒ๋ฟ๋ง ์๋๋ผ ํ์ฌ ์ํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ์์
์ ์ํํ๋ ๊ฒ์ด๊ธฐ๋ ํฉ๋๋ค. ๋งค์ฐ ๊นจ๋ํ๊ณ ๊ฐ๋จํ ์ธํฐํ์ด์ค๋ก ์ก์
์์ฑ์์ ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค.
Bodhi: ์ฃผ์ ์์ ์กฐ๊ธ ๋ฒ์ด๋ ๊ฒ์ผ ์๋ ์์ง๋ง, dispatch๊ฐ void๋ฅผ ๋ฐํํ์ง ์๊ณ ๋ด๋ถ ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค๋ ์ ์ ์ธ๊ธํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค. ๋ฐ๋ผ์ ์๋ฅผ ๋ค์ด ์ฝ์์ ๋ฐํํ๋ฉด ์์
์ ์ฝ๊ฒ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์ฝ์ด๋ณด๊ธฐ์์ ๊ตฌ์ฑ์ ๋ํ ์น์
์ ์ฐธ์กฐํ์ญ์์ค.
https://github.com/gaearon/redux-thunk/blob/master/README.md
๊ทธ ์ธ์ ์ด ๊ณต๊ฐ ํ ๋ก ์ ์ ๊ณตํ ์ปค๋ฎค๋ํฐ์ ๊ฐ์ฌ์ ๋ง์ ์ ํ๊ณ ์ถ์ต๋๋ค. ๋ชจ๋ ์ฌ๋์ ์๊ฐ๊ณผ ์์ด๋์ด๋ฅผ ๋ฃ๋ ๊ฒ์ด ๋งค์ฐ ํฅ๋ฏธ๋กญ์ต๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ง๊ธ๊น์ง ์ฝํฌ๋ฅผ ๊ณ ์ํ์ง๋ง "๋ฌด์จ ์ผ์ด ์ผ์ด๋ฌ๋์ง"์ "์ํ๊ฐ ์ด๋ป๊ฒ ๋ณ๊ฒฝ๋์ด์ผ ํ๋์ง"๋ฅผ ๋ช
ํํ๊ฒ ๊ตฌ๋ถํ๋ ค๊ณ ํฉ๋๋ค. ๋๋ ์ฐ๋ฆฌ ์ฝ๋์์ ์ฐ๋ฆฌ๊ฐ ์ค์๋ฅผ ํ๋ ๊ฝค ๋ง์ ๊ฒฝ์ฐ๋ฅผ ๋ด
๋๋ค(๋ฆฌ๋์๊ฐ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ฌ๋์ง ๋ฐ์ํ๋ ๋์ ์ ๋ฌด์์ ํด์ผํ ์ง ์๋ ค์ฃผ๋ ์ก์
์ ์ฌ์ฉ) do (์์ง sagas์์ ํ๋งค๋์ง ์์).
2017๋ 3์ 19์ผ 23:48์ Bodhi [email protected]์ด ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
redux-thunk์ ๋ํ ๋ค๋ฅธ (๋ถ์ ์ ์ธ) ์๊ฒฌ์ ๋์ํฉ๋๋ค. ์ด๋ณด์์๊ฒ๋ ๊ถ์ฅํ์ง ์์ต๋๋ค(๋ ์ด์ ๊ถ์ฅํ์ง ์์ ๊ฒ์ ๋๋ค).
๋ง๋ฒ์ด ์์๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๊ฒ์ ์ค์ ๋ก ๋ง์ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๋ฅผ ์ ๊ฑฐํ์ง ์์ต๋๋ค. ๋ ๋ณต์กํ ๋น๋๊ธฐ ํ๋ก์ธ์ค๊ฐ ์ฃผ์ด์ง๋ฉด ์ํ์์ ๋์คํจ์น๋ฅผ โโ๊ฐ์ ธ์ ์ ๋ฌํด์ผ ํ๋ ๊ฒ์ ์ฝ๋์ ์์ ๋ถ๋ถ์ผ ๋ฟ์ ๋๋ค.
๊ทธ ๊ฒฐ๊ณผ ๋ ํฐ ์ํฌํ๋ก๋ก ํจ๊ป ๊ตฌ์ฑํ ์ ์๋ ์์ ์์ฑ์๊ฐ ์์ฑ๋ฉ๋๋ค.
redux ์คํ์ผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ณด๋ค ํ๋ ์์ํฌ์ ๊ฐ๊น๊ฒ ๋ง๋๋ ๊ฒ์ ๋ํด ์ ์ค๋ช ํ ์ ์๋ ๋ง์ง๋ง ์์ : ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํธ์ถํ๋ ๋์ ํ๋ ์์ํฌ์ ์์กดํ์ฌ ์ฝ๋๋ฅผ ํธ์ถํฉ๋๋ค.
React-Native ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ฝค ๋ง์ด ์ฌ์ฉํ๊ณ ๋๋ถ๋ถ ์ ์ฉํ์ง๋ง redux-thunk ์ก์ ์์ฑ์๊ฐ ํจ๊ณผ์ ์ผ๋ก void(์ฆ, ๋ค์ ์์ ์ ์์๋ฅผ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉํ ์ฝ์๊ณผ ๊ฐ์ ๊ฒ์ ์์ต๋๋ค.์ฌ๋๋ค์ด "๋ฌด์์ด๋ ํ ์ ์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ React ์ด๋ฒคํธ ํธ๋ค๋ฌ/์ฝ๋ฐฑ์์ ์ฆ์ ์ ๋ฌํ๋ ๊ฒ"์ด๋ผ๊ณ ์๊ฐํ๋๋ก ๋ถ์ถ๊ธฐ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ react-redux์ connect๋ฅผ ์ฌ์ฉํ๊ณ mapDispatchToProps์ ํฌ๊ฒ ์์กดํ๊ธฐ ๋๋ฌธ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์ผ๋ฐ ํจ์์ผ ์ ์๋ค๋ ์ฌ์ค์ ์์ด๋ฒ๋ฆฌ๋ ๊ฒฝํฅ์ด ์์์ต๋๋ค.
(์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ถ๋ถ ์๋ ์ด์ ์์ฑ๋์์ผ๋ฉฐ ๋ ํฐ Redux ์ํ๊ณ์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ ๋๋ก ํ์ ํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์ต์ ๋ฒ์ ์ด ์๋ ์ ์์ต๋๋ค.)
โ
์ด ์ค๋ ๋์ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฉ์์ง๋ฅผ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ๋ณด๊ฑฐ๋ ์ค๋ ๋๋ฅผ ์์๊ฑฐํ์ธ์.
(ํ์ ํธ๋ฅผ ๊ณ์ํด์ ์ฃ์กํ์ง๋ง...)
๋์คํจ์น๋ void๋ฅผ ๋ฐํํ์ง ์๊ณ ๋ด๋ถ ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค๋ ์ ์ ์ธ๊ธํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
ํ, ๋๋จํด! ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ๊ธฐ ์ ์ ๋ฌธ์๋ฅผ ๋๋ฌด ์์ธํ ์ดํด๋ณธ ์ ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
Redux๋ฅผ ํจ์ฌ ์ฝ๊ฒ ๋ง๋ค์ด์ค ๊ฐ์ฅ ๊ฐ์น ์๋ ๊ฒ ์ค ํ๋๋ ์์ ์ ๋ช ๋ น์ด ์๋ ์ด๋ฒคํธ ๋ก ์ทจ๊ธํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์์ ์ ๋์์ธํ๋ ๋ฐฉ๋ฒ๊ณผ ์์ ์ ๋ฃ์ ๋ด์ฉ์ ๊ฒฐ์ ํ๋ ๋ฐ ์ด๋ ค์์ ๊ฒช์ง ์์ต๋๋ค.
๊ตฌ์ฑ ์์๊ฐ ์ฌ์ฉ์ ์ํธ ์์ฉ ์ํ์ ์ํฅ์ ๋ฏธ์น๋ ๋ฐฉ๋ฒ์ ์ ํ์๊ฐ ์์ต๋๋ค, ๊ทธ๋ค์ ๋จ์ง, ์๋ฅผ ๋ค๋ฉด "๋ฒํผ X๋ฅผ ํด๋ฆญ"๊ทธ ์์ ์์๋์ ๋ฌด์์ ์ธ๋ถ ์ธ๊ณ๋ฅผ ๋งํ๋ค. ์์ ์ ๋ช ๋ น์ผ๋ก ์ฌ์ฉํ ๋ ๊ตฌ์ฑ ์์์ ์ํ ๊ฐ์ ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ์ ํจ๊ณผ์ ์ผ๋ก ๋์ ํฉ๋๋ค.
๋ฆฌ๋์๋ ๊ตฌ์ฑ ์์์ ๋ฐ์ธ๋ฉ๋์ง ์์ผ๋ฉฐ ๊ตฌ์ฑ ์์ ์ํ๊ฐ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ํ ๋ฅผ ๋ํ๋ด๋ฉฐ ์ด๋ป๊ฒ ๋ณ๊ฒฝ "์ํ๋ก ๋ฌด์์ ํ ๊ฒ์ธ๊ฐ" ๋ผ๋ ๋ฌธ์ฅ์ด ์๋๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ๋ฆฌ๋์์์ ๋จ์ผ ์ก์ ์ ์ฒ๋ฆฌํ๋ ๋ฐ ์ธ์ง์ ์ฅ๋ฒฝ์ด ์์ต๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์ฌ๋ฌ ์์ ์ ๋๊ธฐ์ ์ผ๋ก ๋์คํจ์นํ๋ ๊ฒฝ์ฐ๋ ์ ๊ฑฐ๋ฉ๋๋ค.
์ฌ๋ฌ ์์น์์ ๋จ์ผ ์์ ์ ์ ๋ฌํ๋ ๊ฒฝ์ฐ๋ ์ฌ๋ผ์ง๋๋ค. ์์ ์์ฑ์๋ฅผ ๊ตฌ์ฑ ์์ ๊ทผ์ฒ์ ๋์ด ์์ ์ ์ ๋ฌํ ๊ตฌ์ฑ ์์๋ฅผ ์ฝ๊ฒ ์ถ์ ํ ์ ์์ต๋๋ค.
DevTools์ ์์ ๋ก๊ทธ๋ฅผ ๋ณด๋ฉด ์ฑ ๋ด๋ถ์์ ๋ฐ์ํ ์ผ ์ ์ ์ฒด ๊ธฐ๋ก์ ๋ณผ ์ ์์ผ๋ฉฐ ์์ ์ ์ํฅ์ ๋ฐ๋ ๊ตฌ์ฒด์ ์ธ ์ํ ์กฐ๊ฐ์ ์ฝ๊ฒ ๋ณผ ์ ์์ต๋๋ค. ์ญ์ฌ๋ ๊ฐ๋ฅํ ํ ๊ฐ์ฅ ์งง์ต๋๋ค.
์ด ํ ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ ๋ฐ์ดํฐ ํ๋ฆ์ ์ง์ ํ ๋จ๋ฐฉํฅ์ผ๋ก ๋ง๋ค๊ณ redux-saga
๋๋ redux-observable
์ ๊ฐ์ ๋ถ์์ฉ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ฐ์ค๋ฝ๊ฒ ์คํํฉ๋๋ค.
@aikoven ์ด ๋ง์ ์ ์ ์ผ๋ก ๋์ํ์ง๋ง(๊ณผ๊ฑฐ์๋ redux๋ฅผ ์ด๋ฒคํธ ์์ฑ๊ณผ ๋น๊ตํ๋ ๋ฐ ํ์คํ ๋ง์ ํ ๋ก ์ด ์์์ต๋๋ค), ๋งค์ฐ ์ผ๋ฐ์ ์ผ๋ก ๋ณผ ์ ์๋ FETCH_USER
์ ๊ฐ์ ๊ฒ์ผ๋ก ๋ฌด์์ ํฉ๋๊น? ์ํํด์ผ ํจ). ๊ทธ๊ฒ์ "์ด๋ฒคํธ์ ๊ฐ์"๋ณด๋ค "๋ช
๋ น๊ณผ ๊ฐ์"๊ฒ ๊ฐ์ต๋๋ค.
@blocka ๋คํธ์ํฌ ์์ฒญ์ผ๋ก FETCH_USER_STARTED
๋ฐ FETCH_USER_DONE
/ FETCH_USER_FAILED
์์
์ผ๋ก ๋ํ๋ ์ ์์ผ๋ฉฐ, ์ด๊ฒ์ด ์์ฒญ ๊ฒฐ๊ณผ๊ฐ ์ํ๋ก ๋๋๋ ๋ฐฉ์์
๋๋ค.
๐ redux-actions
์์ฉ๊ตฌ๋ฅผ ์ค์ด๋ ๊ฒ ์ธ์๋ ๋ด๊ฐ ์ข์ํ๋ ๊ฒ์ redux์ ๋งค์ฐ ์์ฐ์ค๋ฌ์ด ํ์ฅ์ฒ๋ผ ๋๊ปด์ง๋ค๋ ๊ฒ์
๋๋ค. jumpstate
๊ฐ์ ๊ฒฝ์ฐ ๊ตฌํ์ด ์กฐ๊ธ ๋ ๋ฉ์ด์ง๊ณ ์๋ค๊ณ ๋๋ผ๊ณ ์ด์ ํ๋๊ฐ ์๋ ๋ ๊ฐ์ง๋ฅผ ๋ฐฐ์์ผ ํฉ๋๋ค.
๊ทธ๋์ ์ ์์ ์ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๋ฅผ ์ค์ด๊ธฐ ์ํด ์ถ๊ฐํ๋ ๋ชจ๋ ํ๋ฌ๊ทธ์ธ์ด ๋ ์ฅํฉํ API๋ฅผ ์ฌ์ฉํ๋๋ผ๋ redux๋ก ์์ ํ๋ ๊ฒ๊ณผ ๋งค์ฐ ํก์ฌํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
๋ง์ ์์ฉ๊ตฌ๋ ๋ชจ๋ ํ๊ฒฝ์ ์๋ ๊ฒ๊ณผ ๋์ผํ ์์ฉ๊ตฌ์ ๋๋ค. ์ค๋ณต์ด ๋ฐ์ํ๋ฉด ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์ ์ ์ ์ถ์ํ๋ก ํด๊ฒฐํฉ๋๋ค. ์ด๋ฌํ ์ถ์ํ๋ ํ์ฌ ํ๋ก์ ํธ ์ธ๋ถ์์๋ ์ ์ฉํ์ง ์์ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ฉฐ "์์ ์ด์"์ ์กด์ฌํ ์ ์์ต๋๋ค. ๋ชจ๋ ํ๋ก์ ํธ์ ์๊ตฌ ์ฌํญ์ ๋ค๋ฆ ๋๋ค.
redux๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. FETCH_X_STARTED
์ก์
๊ณผ fetchX()
์ก์
์์ฑ๊ธฐ, ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฆฌ๋์ ๋ฑ์ด ํ์ํ๋ค๋ฉด ์์ ๋กญ๊ฒ ์ถ์ํ๋ฅผ ๋ง๋ค์ด ๋ณด์ธ์!
์์ฉ๊ตฌ์ ๋ํ redux๋ฅผ ๋น๋ํ๋ ๊ฒ์ ๋ชจ๋ ์ฝ๋๋ฅผ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ์ ๋ค์ ๋๋ฌด ๋ง์ ์์ฉ๊ตฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋น๋ํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
redux-thunk๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ํํ๋ ๊ฒ๋ฟ๋ง ์๋๋ผ ํ์ฌ ์ํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ์์ ์ ์ํํ๋ ๊ฒ์ด๊ธฐ๋ ํฉ๋๋ค. ๋งค์ฐ ๊นจ๋ํ๊ณ ๊ฐ๋จํ ์ธํฐํ์ด์ค๋ก ์ก์ ์์ฑ์์ ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค.
๋๊ธฐ ์ฝ๋์ redux-thunk๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ข์ ์๊ฐ์ด ์๋๋ฉฐ ๋ฌธ์์์ ์ธ๊ธํด์ผ ํฉ๋๋ค.
๋ง์ ๊ธฐ๋ฅ์ ํจ๊ป ๊ตฌ์ฑํ๋ฉด ๋์คํจ์น ํ๋ฆ์ด ์์์ ์์กดํ์ง ์๋๋ค๋ ๊ฒ์ ํ์ ํ ์ ์์ผ๋ฏ๋ก ์ถ๋ก ํ๊ณ ํ
์คํธํ๊ธฐ๊ฐ ๋ ์ด๋ ต์ต๋๋ค.
์์ํ ์ก์ ์์ฑ์๊ฐ ์๊ณ ๋ ๋ณต์กํ ์ํ ์์ ์ ์ํด ๋จ์ํ ์ก์ ์ผ๊ด ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋์ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํ ์คํธํ ์์ ํจ์๋ง ๊ฐ๊ฒ ๋ฉ๋๋ค.
๋ ๋์ ์ดํด๋ฅผ ์ํด ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์ถ์ฒํฉ๋๋ค. http://blog.isquaredsoftware.com/2017/01/idiomatic-redux-thoughts-on-thunks-sagas-abstraction-and-reusability/
@Machiaweliczny ๊ธฐ์ฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ ์ง๋ฌธ์ ๋น์ฆ๋์ค ๋ก์ง์ ์ด๋์ ๋๋๊ฐ์ ๋ํ ๊ฒ์ ๋๋ค( https://medium.com/@jeffbski/where -do-i-put-my-business-logic-in-a-์์ ๋ ผ์๋จ). react-redux-application-9253ef91ce1#.3ce3hk7y0). ๋์คํจ์น ํ๋ฆ(thunk, epic, saga ๋ฑ)์ด ํ์ฌ ์์ฉ ํ๋ก๊ทธ๋จ ์ํ์ ์ ๋ ์ก์ธ์คํ ์ ์์ด์ผ ํ๋ค๊ณ ๋งํ๋ ๊ฒ์ด ์๋๋๋ค. ๊ทธ๋ ์ฃ ?
@dfbaskin
Redux๋ ๋๋ฉ์ธ ๊ธฐ๋ฐ ๊ฐ๋ฐ์ด ์๋์ ๋ช ์ฌํ์ญ์์ค. "๋น์ฆ๋์ค ๋ ผ๋ฆฌ"๋ ์ฌ๊ธฐ์์ ํจ์ฌ ๋ชจํธํ ๊ด์ฌ์ฌ์ด๋ฉฐ "์ด๋ค ๊ฐ๋ ์ ๊ธฐ๋ฅ ์๋ช ์ด ๋ด๊ฐ ๊ตฌํํ๋ ค๋ ๋ ผ๋ฆฌ์ ๊ฐ์ฅ ์ ๋ง๋์ง"์ ๋๋ค. ๊ทํ์ "๋น์ฆ๋์ค ๋ก์ง"์ ๊ทํ๊ฐ ํ์๋ก ํ๋ ๊ฒ์ ๋ฐ๋ผ ์ ํ๊ธฐ, ๊ฐ์๊ธฐ, ์์ ์์ฑ๊ธฐ ๋ฐ "์ค์ผ์คํธ๋ ์ดํฐ"(์ด์ ๋ํด ๋ ๋์ ๋จ์ด๊ฐ ์์ง ์์ต๋๊น?)์ ๊ฑธ์ณ ๋ถ์ฐ๋์ด ์์ต๋๋ค.
(state, action) => state
๊ฐ์๊ธฐ๋ ์ผ๋ฐ์ ์ผ๋ก "์ํ์ ์์กดํ๋ ๋
ผ๋ฆฌ"๊ฐ ์์ด์ผ ํ๋ ๊ณณ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์คํ Elm Architecture์ ๊ฐ์ ๊ฒ์์ ์ด๋ฌํ ๋ชจ๋ ๋
ผ๋ฆฌ๋ "์
๋ฐ์ดํธ" ๊ธฐ๋ฅ(์ฐ๋ฆฌ์ ๊ฐ์๊ธฐ์ ๋์ผ)์ ์์ต๋๋ค.
๋ถํํ๋ Redux์์ ๊ฐ์๊ธฐ๋ ๋๊ธฐ ๋ ผ๋ฆฌ๋ง ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ํ์ ์์กดํ๋ ๋น๋๊ธฐ์ "๋น์ฆ๋์ค ๋ก์ง"์ ๋์คํจ์น(๊ตฌ์ฑ ์์์ ํด๋น ์ ๋ณด๊ฐ ์๋ ๊ฒฝ์ฐ ํญ์ ๊ทธ๋ฐ ๊ฒ์ ์๋)๋ฅผ ํตํด ๊ตฌ์ฑ ์์์์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ ํํ ์ค์ผ์คํธ๋ ์ดํฐ ๊ฐ๋ (thunk, sagas, epic)์ ํตํด ๊ฐ์ ธ์์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด ์ํ์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
๊ฐ์๊ธฐ์ ํ๊ณ๊ฐ ์๋์๋ค๋ฉด ๊ทธ๋ด ํ์๊ฐ ์์์ ๊ฒ์ ๋๋ค. ์ฌ๋๋ค์ด redux-saga ๋๋ redux-observable์ ์ฌ์ฉํ ๋ ์ค์ ๋ก ๊ทธ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๊ทธ๋ค์ ์ก์ /์ก์ ์์ฑ์๋ ์ผ๋ฐ์ ์ผ๋ก ๊ฑฐ์ ์ฌ์ํด์ง๋ฉฐ(๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ ๊ทํ ๋๋ ํ์ํ์ ํ๋ฌ์ค ๋๋ ๋ง์ด๋์ค), ์ฌ๊ฐ/์ํฝ์ ๊ฑฐ์ "๋์ฒด ๋ฆฌ๋์"์ ๋๋ค. , ์ด์ ์ก์ ๊ณผ ์ํ์ ์ก์ธ์คํ๊ณ "์ฌ๋ฌผ"์ ๋ฐํํ๋ ๋ ๋ค๋ฅธ ๊ฒ์ด ์์ผ๋ฉฐ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ค์ ๊ฐ์๊ธฐ์ ๋ณต์ก์ฑ์ด ์ค์ด๋ญ๋๋ค. ๋ฆฌ๋์์ ์ค์ผ์คํธ๋ ์ดํฐ๋ ๋งค์ฐ ๋ฐ์ ํ๊ฒ ๊ด๋ จ๋์ด ์์ต๋๋ค.
@Machiaweliczny : "
๋ ์ข์ ํ ๋ก ์ด์ง๋ง ์ฐ๋ฆฌ๋ ์ฃผ์ ์์ ์กฐ๊ธ ๋ฒ์ด๋๊ธฐ ์์ํ์ต๋๋ค. (์ ์ชฝ์ ๋ณด์ด๋ ์์ ๊ฑฐ ๋ณด๊ด์์ธ๊ฐ์? :) )
์๋ ์ง๋ฌธ์ผ๋ก ๋์๊ฐ ๋ณด๊ฒ ์ต๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ด๋ค ๊ตฌ์ฒด์ ์ธ ๋จ๊ณ๋ฅผ ๊ตฌํํ ์ ์์ต๋๊น?
๋ ผ์์ ์ฌ์ง๊ฐ ์๊ณ ์คํ ๊ฐ๋ฅํ ๋จ๊ธฐ ๋จ๊ณ์ ์์ญ์์ ์ ๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํ๊ณ ์ถ์ต๋๋ค.
1) ์คํ ์ด๋ฅผ ๋ ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์๋๋ก ํฉ๋๋ค(๊ธฐ๋ณธ ๊ตฌ์ฑ์ผ ์๋ ์๋์? ์ฌ์ ํ ๊ทธ๋ฐ ๊ฒ์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง Elm์๋ "์คํํฐ ์ฑ" ์ ํ๊ณผ ์ผ๋ฐ ์ฑ ์ ํ์ด ์์์ต๋๋ค. ์คํํฐ ์ฑ์ด ์ฌ์ฉ๋์์ต๋๋ค. ๊ฐ๋จํ ์ฑ๊ณผ ๊ต์ก ์๋ฃ์์ ์ฌ๋๋ค์ด ๋ง ๋ฐฐ์ฐ๋ ๊ฒฝ์ฐ์ 90%๋ฅผ ์ปค๋ฒํ๊ธฐ ์ํด ์ง๊ธ๊น์ง ์๋ช ์ ๋ํ ๋ฌธ์๋ฅผ ๊ฒ์ํ์ง ์๊ณ ๊ธฐ๋ณธ ๋ฏธ๋ค์จ์ด(devtools, thunks)๋ก Redux ์คํ ์ด๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค๋ ๊ฒ์ ์ธ์ ํฉ๋๋ค. ๋๋ ๋ง์ ์ฌ๋๋ค์ด ์ ๊ท ์ด๋ฏผ์๋ค์ด Redux ํต์ฌ ๊ฐ๋ ์ ๋ฐฐ์ฐ๊ธฐ ์ํด ์์ ์ ๋ฏธ๋ค์จ์ด๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ์์์ผ ํ๋ค๊ณ ์ฃผ์ฅํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
2) ์ด๊ฒ์ ์ด๋ฏธ ํด๋น๋ ์ ์์ต๋๋ค. create-react-app์ ์์ "์คํํฐ ์คํ ์ด"์ ํจ๊ป Redux๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ๊ฐ๋ฅํ ํ ์ฌ์ด์ง ํ์ธํ์ฌ ์ ๊ท ์ฌ์ฉ์๊ฐ 2๋ถ ์์ Redux ์ฑ์ ์คํํ๊ณ ์คํํ ์ ์๋๋ก ํ์ญ์์ค.
๋๋ ์ด๊ฒ์ด ์ฐ๋ฆฌ๋ฅผ ์์ฃผ ๋ฉ๋ฆฌ ๋ฐ๋ ค๊ฐ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
ํธ์ง: ์คํํฐ ์ฑ์ด๋ ์ฑ ์์ฉ๊ตฌ๋ฅผ ์๋ฏธํ๋ ๊ฒ์ด ์๋๋ผ ๊ตฌ์ฑํ ์ ์์ง๋ง ์ฌ๋๋ค์ด ๊ฐ์ ธ์ค๊ณ ์๋ฃํ ์ ์๋ ํฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ์ด ์๋ "createStore"๋ฅผ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฑ์ฅํ๋ฉด "์ค์ " createStore๋ก ์ด๋ํ ์ ์์ต๋๋ค.
๊ทธ๊ฒ์ ๋ฐ๋ก ๊ฑฐ๊ธฐ์์ ๊ฝค ํ์์ ์ธ ๊ฐ๋ ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
2017๋
3์ 20์ผ ์์์ผ ์ค์ 10:02 Francois Ward [email protected]
์ผ๋ค:
๋ ผ์์ ์ฌ์ง๊ฐ ์๊ณ ์คํ ๊ฐ๋ฅํ ๋จ๊ธฐ ๋จ๊ณ์ ์์ญ์์ ์ ๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํ๊ณ ์ถ์ต๋๋ค.
1.
์ ์ฅ์๋ฅผ ๋ ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์๋๋ก ํฉ๋๋ค(๊ธฐ๋ณธ์ ์ผ๋ก
๊ตฌ์ฑ? ์ง๊ธ๋ ๊ทธ๋ฐ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋๋ฆ ๋๋ฌด๋
"์คํํฐ ์ฑ" ์ ํ ๋ฐ ์ผ๋ฐ ์ฑ ์ ํ. ์คํํฐ ์ฑ์ ๋ค์ ์ฉ๋๋ก ์ฌ์ฉ๋์์ต๋๋ค.
์ฌ๋๋ค์ด 90% ๊ฒฝ์ฐ๋ฅผ ์ปค๋ฒํ๋ ๊ฐ๋จํ ์ฑ๊ณผ ๊ต์ก ์๋ฃ์์
๊ทธ๋ฅ ํ์ต. ์ง๊ธ๊น์ง Redux ์คํ ์ด๋ฅผ ๊ตฌ์ฑํ ์ ์์์ ์ธ์ ํฉ๋๋ค.
๋ฌธ์๋ฅผ ๊ฒ์ํ์ง ์๊ณ ๊ธฐ๋ณธ ๋ฏธ๋ค์จ์ด(devtools, thunks)๋ฅผ ์ฌ์ฉํ์ฌ
์๋ช . ๋๋ ๋ง์ ์ฌ๋๋ค์ด ์๋ก์ด ์ด๋ฏผ์๊ฐ ํ์ํ๋ค๊ณ ์ฃผ์ฅํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
Redux ์ฝ์ด๋ฅผ ๋ฐฐ์ฐ๊ธฐ ์ํด ์์ ์ ๋ฏธ๋ค์จ์ด๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ์๊ณ
๊ฐ๋ .
2.์ด๊ฒ์ ์ด๋ฏธ ๊ฒฝ์ฐ์ผ ์ ์์ต๋๋ค. ์์ ๋ด์ฉ์ผ๋ก Redux๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
react-app์ ์์ฑํ๋ "์คํํฐ ์คํ ์ด"๋ ๊ฐ๋ฅํ ํ ๊ฐ๋จํ๋ฏ๋ก ์ด๋ณด์
2๋ถ ์์ Redux ์ฑ์ ์คํํ๊ณ ์คํํ ์ ์์ต๋๋ค.๋๋ ์ด๊ฒ์ด ์ฐ๋ฆฌ๋ฅผ ์์ฃผ ๋ฉ๋ฆฌ ๋ฐ๋ ค๊ฐ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธ
https://github.com/reactjs/redux/issues/2295#issuecomment-287806663 ๋๋ ์์๊ฑฐ
์ค๋ ๋
https://github.com/notifications/unsubscribe-auth/AFUmCQYkUwjkCugevDBWC8TOu0HhWJTnks5rnqMWgaJpZM4MhnVF
.
์ฐ๋ฆฌ ๋ชจ๋์ combineReducers
๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋์ ๊ฐ ์ํ ์ฌ๋ผ์ด์ค์ ์ ์ฉ ๋ฆฌ๋์๋ฅผ ๊ฐ์ต๋๋ค(์ด ์ ๊ทผ ๋ฐฉ์์ "์ฌ๋ผ์ด์ค ๋ฆฌ๋์"๋ผ๊ณ ๋ ํ๋ ๋ฌธ์์ ๊ตฌ์กฐํ ๋ฆฌ๋์ ์น์
์ ์ค๋ช
๋์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค). ์ด๊ฒ์ switch ๋ฌธ์ด ํจ์ฌ ๋ ์๊ธฐ ๋๋ฌธ์ ์ํฉ์ ๋ ์ฝ๊ฒ ์ถ๋ก ํ ์ ์์ต๋๋ค. ๋ํ ์ฝ๋ ๊ธฐ๋ฐ ์ ์ฒด์ ๊ณตํต ๋ฆฌ๋์๊ฐ ๋ฑ์ฅํ ์ ์์์ต๋๋ค. ๊ฐ์ฅ ๋จ์ํ ๋ฆฌ๋์๋ ์ก์
์ ํ์ ์ ์ธํ๊ณ ๋ชจ๋์์ ๋์ผํ๋ฏ๋ก ์ก์
์ ํ๋ณ๋ก ์ด๋ฌํ ๋ฆฌ๋์๋ฅผ ๋ง๋๋ ๋์ฐ๋ฏธ ๊ธฐ๋ฅ(๋ฆฌ๋์ ํฉํ ๋ฆฌ?)์ ์ฌ์ฉํ์ฌ ์์ฉ๊ตฌ๋ฅผ ์ค์ผ ์ ์์์ต๋๋ค.
const { makeIndicator, makePayloadAssignor } from '../shared/reducers';
const searchModule = combineReducers({
searching: makeIndicator(c.SEARCH),
results: makePayloadAssignor(c.SEARCH_RESPONSE, [])
});
์๋ง๋ ์ด์ ๊ฐ์ ๋ ์ผ๋ฐ์ ์ธ ์ฌ๋ผ์ด์ค ๋ฆฌ๋์๋ฅผ ์๋ณํ๋ ๊ฒ์ ์ฐ๋ฆฌ ๋ฆฌ๋์์ ๊ธฐ๋ณธ ๋น๋ฉ ๋ธ๋ก์ผ๋ก ์ฌ์ฉ๋ ์ ์๋ ์์ฉ๊ตฌ ๋ฌธ์ ๋ฅผ ์ํํ๋ ์ข์ ๋ฐฉ๋ฒ์ด ๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ๊ธฐ๋ณธ์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฆฌํฉํ ๋ง์
๋๋ค. ๋ด๊ฐ ์ ์ ๋งํ๋ฏ์ด ... "์๋ฐ ์คํฌ๋ฆฝํธ"์๋
์ฝ๋์ ์ถ์ํ์ ๊ฐ์ ๊ฒ์ ์ ์ฉํ ๋๊น์ง ๋ง์ "๋ณด์ผ๋ฌ ํ๋ ์ดํธ".
Redux๋ ์๋ฐ์คํฌ๋ฆฝํธ์ผ ๋ฟ์ ๋๋ค. ๊ทธ๊ฒ์ ๋ํด ๋ง๋ฒ ๊ฐ์ ๊ฒ์ ์์ต๋๋ค.
2017๋
3์ 20์ผ ์์์ผ ์คํ 12์ 44๋ถ, Markus Coetzee [email protected]
์ผ๋ค:
์ฐ๋ฆฌ ๋ชจ๋์ CombineReducers๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ์ํ ์ฌ๋ผ์ด์ค๊ฐ
๋ชจ๋์๋ ์ ์ฉ ๊ฐ์๊ธฐ๊ฐ ์์ต๋๋ค(์ด ์ ๊ทผ ๋ฐฉ์์ด ์ค๋ช ๋์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฌธ์์ Structuring Reducers ์น์ ์์ "์ฌ๋ผ์ด์ค
๊ฐ์๊ธฐ"). ์ด๋ ๊ฒ ํ๋ฉด ์ค์์น๊ฐ
์ง์ ์ ํจ์ฌ ์ ์ต๋๋ค. ๋ํ ์ผ๋ฐ์ ์ธ ๊ฐ์๊ธฐ๊ฐ ๋ฑ์ฅํ๋๋ก ํ์ฉํ์ต๋๋ค.
์ฐ๋ฆฌ์ ์ฝ๋ ๊ธฐ๋ฐ ์ ๋ฐ์ ๊ฑธ์ณ. ๊ฐ์ฅ ๋จ์ํ ๊ฐ์๊ธฐ๋ ๋ชจ๋ ๊ฐ์ ๋์ผํ์ต๋๋ค.
์ก์ ์ ํ์ ์ ์ธํ๊ณ ๋ค์๊ณผ ๊ฐ์ด ์์ฉ๊ตฌ๋ฅผ ์ค์ผ ์ ์์์ต๋๋ค.
์ด๋ฌํ ๋ฆฌ๋์๋ฅผ ๋ง๋๋ ๋์ฐ๋ฏธ ๊ธฐ๋ฅ(๋ฆฌ๋์ ํฉํ ๋ฆฌ?)์ด ์์ต๋๋ค.
ํ๋ ์ ํ๋ณ:const { makeIndicator, makePayloadAssignor } from '../shared/reducers';
const searchModule = CombineReducers({
๊ฒ์: makeIndicator(c.SEARCH),
๊ฒฐ๊ณผ: makePayloadAssignor(c.SEARCH_RESPONSE, [])
});์๋ง๋ ์ด์ ๊ฐ์ ๋ ์ผ๋ฐ์ ์ธ ์ฌ๋ผ์ด์ค ๋ฆฌ๋์๋ฅผ ์๋ณํ๋ ๊ฒ์ด ์ข์ ๊ฒ์ ๋๋ค.
์์ฉ๊ตฌ ๋ฌธ์ ๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ
๊ฐ์๊ธฐ๋ฅผ ์ํ ๊ธฐ๋ณธ ๋น๋ฉ ๋ธ๋ก์ ๋๋ค.โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธ
https://github.com/reactjs/redux/issues/2295#issuecomment-287820595 ๋๋ ์์๊ฑฐ
์ค๋ ๋
https://github.com/notifications/unsubscribe-auth/AACourLpL5--NJiRzrWmKFJ31cl5DXJrks5rnqzxgaJpZM4MhnVF
.
์์ฉ๊ตฌ ๊ฐ์๊ธฐ๋ฅผ ๊ฐ๋ฐํ๋ ๊ฒ๋ณด๋ค ์ผ๋ฐ์ ์ธ redux ํจํด์ ์ค๋ช ํ๋ ๊ฒ์ด ๋ ๋ซ๋ค๋ ๋๋ถ๋ถ์ ์๊ฒฌ์ ๋์ํฉ๋๋ค. ์ ํ์๋ค๊ณผ ์ ๋ 1.5๋ ์ ์ redux๋ก ์์ ํ๊ธฐ ์์ํ๊ณ ๊ฐ์ฅ ๋จ์ํ ๊ฒ๋ค์ ๋ํด ํผ๋์ค๋ฌ์ํ์ต๋๋ค. redux๋ ๋๋ถ๋ถ ์ด๋ฒคํธ ์์ฑ์ด๊ณ , ๋์ผํ ์์ ์ ์ฌ๋ฌ ๋ฆฌ๋์์์ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, ํด๋น ์์ ์๋ id ๋ฟ๋ง ์๋๋ผ ์ ์ฒด ๋น์ฆ๋์ค ๊ฐ์ฒด๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค. , ๊ฐ์๊ธฐ๋ ๊ธฐ๋ฅ์ผ ๋ฟ์ด๋ฉฐ ์์ฑ, ์์ฑ, ๋ถํ ๋ฑ ์ํ๋ ๋ชจ๋ ์์ ์ ์์ ๋กญ๊ฒ ์ํํ ์ ์์ต๋๋ค. ์๊ฒฉ ๋ช ๋ น์ผ๋ก ์์ ์ ์ฌ์ฉํ๊ณ ๊ณ ์ ์ ์ธ ๋ฉ์๋ ํธ์ถ์ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ฅผ ๊ถ๊ธํดํ๋ ์ผ๋ฐ์ ์ธ ์ค์๋ฅผ ํ์ต๋๋ค. ๊ฑฐ๋ํ ๋ฏธ๋ค์จ์ด๋ฅผ ๋ง๋ค๊ณ "์ ๋๋ ์ดํฐ๊ฐ ๋๋ฌด ๋ณต์กํ๊ธฐ ๋๋ฌธ์"(redux-saga๋ ํ๋ฅญํ์ง๋ง!) redux-saga๋ฅผ ํผํ๊ณ ๊ฑฐ๋ํ ์ค์์น๋ก ๊ธด ํ์ผ์ ๋ง๋ค์์ต๋๋ค. ์ด๊ฒ์ ๋ฌผ๋ก ํ๋ฒํ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ ๋๋ฌธ์ด๊ธฐ๋ ํ์ง๋ง ๊ตฌ์กฐํ๋ ์ ๋ณด๊ฐ ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์ด๊ธฐ๋ ํฉ๋๋ค. ์ค๋ ๋ฌธ์๋ ํจ์ฌ ๋ ๋์์ก์ต๋๋ค. ์ ์ง ๋ณด์์๋ค ๋๋ถ์ ๋๋ค!
์ด๊ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก์์ Redux์ ๋ํ ๋งค์ฐ ๊ท์คํ ์ฃผ์ ์ ๋๋ค.
์ด๊ฒ์ ๊ธฐ๋ณธ์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฆฌํฉํ ๋ง์ ๋๋ค. ๋ด๊ฐ ์ ์ ๋งํ๋ฏ์ด ... "์๋ฐ ์คํฌ๋ฆฝํธ"์๋
์ฝ๋์ ์ถ์ํ์ ๊ฐ์ ๊ฒ์ ์ ์ฉํ ๋๊น์ง ๋ง์ "๋ณด์ผ๋ฌ ํ๋ ์ดํธ".
Redux๋ ์๋ฐ์คํฌ๋ฆฝํธ์ผ ๋ฟ์ ๋๋ค. ๊ทธ๊ฒ์ ๋ํด ๋ง๋ฒ ๊ฐ์ ๊ฒ์ ์์ต๋๋ค.
์๋ฒฝํด, @blocka! ์ด ๋ฉ์์ง๋ ๋๋ฆฌ ํผ์ง ํ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
Redux๋ ์ต์ํ์ ์ ๊ทผ ๋ฐฉ์ ๋๋ฌธ์ ์ฌ๋๋ค์๊ฒ ๋ ํนํ๊ณ ์์ฉ๊ตฌ ๊ฐ์ ๋๋์ ์ค๋๋ค. Minimal์ ์ผ๋ฐ์ ์ผ๋ก "ํ๋ ์์ํฌ"์ ๋ํด ์ด์ํ๊ฒ ๋๊ปด์ง๋๋ค(์ต์ ์ฝ๋, ์ต์ ์์น).
์ด๋ค ์ฌ๋๋ค์ JavaScript ์์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ๋ณด๋ค "framework-y" ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ์ต์ํฉ๋๋ค. ๊ฐ๋ฐ์๊ฐ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ ๋ ๊ธฐ๋ณธ ์ ๊ณต ๋ฐฉ์์ด ์์์ ์ผ๋ก ์์๋ฉ๋๋ค. ์ง์ฅ์ฒ๋ผ ์ฌํ์ง๋ง ์ฌ์ค์ ๋๋ค.
Redux๊ฐ ๊ทธ ์ด๋ ๋๋ณด๋ค ์์ํ๊ธฐ ์ฌ์์ง๊ณ ์๋ค๊ณ ์๊ฐํ์ง๋ง Redux๊ฐ ๋ชจ๋ ๊ฒ์ ํ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํ์ง ์๋๋ค๋ ์ ์ ๋ถ๋ช ํ ํด์ผ ํฉ๋๋ค. @gaearon ์ ํญ์
์ด์ ๊ทธ๊ฒ์ ๋ํ ์งง์ ๊ธฐ์ฌ๋ฅผ ์ผ์ต๋๋ค. React๋ Redux๋ฅผ ํํ์ง ๋ง์ญ์์ค . ๋ฌผ๋ก ๋๋ ์ด ๋ชจ๋ ๊ฒ์ ๋ํด ํ๋ฆด ์ ์๋ค.
๊ณ ๊ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ ์ถ์ํ ๊ณ์ธต์ ๊ฐ๋ ์ ๋ก๊ฐ ์์ต๋๋ค. ์ต๊ทผ Tensorflow๋ ํต์ฌ API( http://www.fast.ai/2017/01/03/keras/) ์์ Keras๋ฅผ ์ถ์ํ๋ก ๋์ ํ์ต๋๋ค
TensorFlow๋ฅผ ์ฌ์ฉํ๋ฉด ๋ด๊ฐ TensorFlow๋ฅผ ์ฌ์ฉํ ๋งํผ ๋๋ํ์ง ์๋ค๋ ๋๋์ด ๋ญ๋๋ค. Keras๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๊ฒฝ๋ง์ด ์๊ฐ๋ณด๋ค ์ฝ๋ค๋ ๋๋์ด ๋ญ๋๋ค. ์ด๊ฒ์ TensorFlow์ API๊ฐ ์ฅํฉํ๊ณ ํผ๋์ค๋ฝ๊ณ Keras๊ฐ ๋ด๊ฐ ๊ฒฝํํ ๊ฒ ์ค ๊ฐ์ฅ ์ฌ๋ ค ๊น๊ฒ ๋์์ธ๋๊ณ ํํ๋ ฅ์ด ํ๋ถํ API๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋๋ ์ฒ์ ๋ช ์ฐจ๋ก์ ์ค๋ง์ค๋ฌ์ด ์ํธ ์์ฉ ํ์ TensorFlow๋ฅผ ๊ณต๊ฐ์ ์ผ๋ก ๋นํํ๊ธฐ์๋ ๋๋ฌด ์ฐฝํผํ์ต๋๋ค. ๋๋ฌด ํฌ๋ฐํ๊ณ ๋ถ์์ฐ์ค๋ฝ๊ฒ ๋๊ปด์ก์ง๋ง ์ด๊ฒ์ ํ์คํ ๋ด ์คํจ์์ต๋๋ค.
Redux๋ฅผ ์ฒ์ ์ ํ๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค์๊ฒ ๋น์ทํ ๊ฒฝํ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. Tensorflow
๋ฅผ Redux
, Keras
๋ฅผ Jumpstate
๋ฐ๊ฟ๋๋ค. Redux๋ ๋งค์ฐ ๊ฐ๋ ฅํ์ง๋ง ๋๋ถ๋ถ์ ์ฌ์ฉ์๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ์ปจํธ๋กค์ด ํ์ํ์ง ์์ ์ ์์ต๋๋ค. ์๋ง๋ ๊ทธ๋ค์ Angular์์ ์ค๊ณ ์๊ฑฐ๋ ๋ถํธ์บ ํ์์ React + Redux๋ฅผ ๋ฐฐ์ฐ๊ฑฐ๋ ๋ค์ํ ํํ ๋ฆฌ์ผ์ ๋ณด๊ณ ์์ ๊ฒ์
๋๋ค. Redux๋ ์ ๊ท ์ฌ์ฉ์๋ฅผ ์ํด ๋ค๋คํด์ง ํ์๋ ์์ง๋ง ์ ์ฌ์ ์ฌ์ฉ ์ฌ๋ก์ 80%๋ฅผ ์ปค๋ฒํ ์ ์๋ ๋ ์ฌ์ด ์ถ์ํ๋ฅผ ์ ๊ณตํ๋ ๊ฒ๋ ์ํฐ ํจํด์ด ์๋๋๋ค.
์ฌ๋ฌ๋ถ, redux๊ฐ ์๋ ๊ทธ๋๋ก ๊ด์ฐฎ์๋ค๋ฉด ์ด๋ฐ ๋ํ๋ฅผ ๋๋์ง ์์์ ๊ฒ์ ๋๋ค. redux๊ฐ ์ ์ฉํ๊ฑฐ๋ ๊ตฌ์กฐ์ ์ผ๋ก ๊ฑด์ ํ์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ์ฌ๋๋ค์ ์ฒ์ ๋ฐฐ์ธ ๋ ์ฌ์ ํ "๋์๋ค"๊ณ ๋๋๋๋ค. ์ด๋ฌํ ๊ฐ์ ์ ์ ํจํฉ๋๋ค.
์ด ์ค๋ ๋์ ๋๊ธ์ ๋ค๋ ์ฌ๋๋ค์ ๋ชจ๋ redux ์ ๋ฌธ๊ฐ์ ๋๋ค. ๋ฌผ๋ก ์ฐ๋ฆฌ๋ redux์ ๋ง์กฑํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ ์ฒ ํ์ ๋ด๋ฉดํํ์ผ๋ฉฐ "๋ณด์ผ๋ฌ ํ๋ ์ดํธ"๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ์์ ์ ์ถ์ํ๋ฅผ ๋ง๋๋ ๊ฒ์ด ํธ์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด ์ค๋ ๋๊ฐ ์ ๊ณตํ๋ ค๋ ์ฒญ์ค์ด ์๋๋๋ค. redux๋ฅผ ์ฒ์ ์ฌ์ฉํ๋ ์ฌ์ฉ์, ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ฒ์ ์ ํ๋ ์ฌ์ฉ์์๊ฒ ์ฝ๊ฐ์ ๊ณต๊ฐ ์ด ํ์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด: ๋ค์์ redux์ ๋ํด ์์ฃผ ๋ฃ๋ ๋ถ๋ง์ ๋๋ค(์ ์ค๋ ๋์ ๋ํด ์ธ๊ธ๋์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค): redux๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. react-redux, redux-thunk, redux-actions ๋ฑ๋ ์ฌ์ฉํด์ผ ํฉ๋๋ค. .
๋ง ๊ทธ๋๋ก redux๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋ค๋ฅธ ๋ชจ๋ ํจํค์ง๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๊น? ์๋์.
๋๋ถ๋ถ์ redux ์ฌ์ฉ์๋ ์ด๋ฌํ ์ถ๊ฐ ํจํค์ง์ ์ผ๋ถ ๋๋ ์ ์ฒด๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๊น? ์.
package.json
์ ํจํค์ง ์๊ฐ ์ค์ํฉ๋๊น? ์๋ ์ ๋ง.
package.json
์ ํจํค์ง ์๊ฐ ์ฌ๋๋ค์ ๊ธฐ๋ถ์ ์ํฅ์ ์ค๋๊น? ์ ์ ์ผ๋ก.
์ด์ redux ์์ฒด๋ ๊ทธ๋๋ก ์ ์ง๋์ด์ผ ํ๊ณ ๋ค๋ฅธ ํจํค์ง( create-redux-app
๋๋ ๋ฌด์์ด๋ )๊ฐ ์ด๋ค์ ํจ๊ป ์กฐ๋ฆฝํด์ผ ํ๋ค๊ณ ๋ฏฟ๋ ๊ฒ์ด ํ๋นํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ค์ ๋ก ๋ณต์กํ ๋ฌธ์ ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์ฌ์ฉ์์๊ฒ RTFM์ ์๋ฆฌ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
redux๊ฐ ์ ์ฉํ๊ฑฐ๋ ๊ตฌ์กฐ์ ์ผ๋ก ๊ฑด์ ํ์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ์ฌ๋๋ค์ ์ฒ์ ๋ฐฐ์ธ ๋ ์ฌ์ ํ "๋์๋ค"๊ณ ๋๋๋๋ค. ์ด ๊ฐ์ ์ ์ ํจํ๋ค
์ ์ ์ผ๋ก. ๊ทธ๋ฌ๋ ๋ชจ๋ ์ฌ๋๋ค์ด ๊ทธ๋ ๊ฒ ๋๋ผ๋ ๊ฒ์ ์๋๋๋ค. ์ผ๋ถ๋ ๊ทธ๋ ์ต๋๋ค. ๋ฌธ์ ๊ฐ ์๋ ์ฌ๋๋ค์ ์ด์ผ๊ธฐ๋ ์ ๋ ๋ฃ์ง ๋ชปํ ๊ฒ์์ ๋ช ์ฌํ์ญ์์ค. ์ง๋ฌธ์ ํ๊ฑฐ๋ stackoverflow/reactiflux๋ฅผ ๋๋ฅด๋ ์ฌ๋๋ง ๋ณผ ์ ์์ต๋๋ค. ํ ๋ฒ๋ ํด๋ณด์ง ์์ ์ฌ๋๋ค ์ค ์ผ๋ถ๋ ๋์์ด ํ์ํ์ง๋ง ์ด๋ป๊ฒ ์์ฒญํด์ผ ํ ์ง ๋ชจ๋ฅด๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค... ๊ทธ๋ฆฌ๊ณ ์ผ๋ถ๋ ์ ์ง๋ด๊ณ ์์ต๋๋ค. ๋น์ ์ ๊ทธ๋ค์ ๋ ๋์๊ฒ ๋ง๋ค๊ณ ์ถ์ง ์์ต๋๋ค... ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ทธ๋ค์ ๊ทธ๋ ๊ฒ ํ ๊ฒ์ ๋๋ค. ๋์ ํฌ๋ผ์ ์ค๋ ์ฌ๋์ด ๋๋ฉฐ ์ ์ ๋ก ์ด๋์ด ๋ ๊ฒ์ ๋๋ค.
Redux๋ ์๋ฌด ์ด์ ์์ด ์ธ๊ธฐ๋ฅผ ์ป์ง ๋ชปํ์ต๋๋ค. ์ ๋ง ๋ง์ ๋ถ๋ค์ด ๋ง์๋ค๊ณ ํ์ ์ ๋ค๋ฅธ ๋ถ๋ค๊ป๋ ์ถ์ฒํด ์ฃผ์ จ์ด์ :)
์ด์ redux ์์ฒด๋ ๊ทธ๋๋ก ์์ด์ผ ํ๊ณ ๋ค๋ฅธ ํจํค์ง(create-redux-app ๋๋ ๋ฌด์์ด๋ )๊ฐ ํจ๊ป ์กฐ๋ฆฝํด์ผ ํ๋ค๊ณ ๋ฏฟ๋ ๊ฒ์ด ํ๋นํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด ์์ด๋์ด๊ฐ ๋ง์์ ๋ค์์ต๋๋ค. ๊ธฐ์กด์ ์์ฉ๊ตฌ๊ฐ ์ด๋ฏธ ํด๊ฒฐํ๋ค๊ณ ์ฃผ์ฅํ๋ ๊ฒ๋ ๊ฐ๋ฅํ์ง๋ง, React์ ์
๋ฌธํ๋ ค๊ณ ํ ๋ ๋๊ตฌ์ ์๋๋๋ ๊ฒ์ ๋ํด ์ฌ๋๋ค์ด ๋ถํํ๋ ๋น์ React์๋ ์์ฉ๊ตฌ๊ฐ ๋ง์์ต๋๋ค. create-react-app
๋ ์ด ๋ชจ๋ ๊ฒ์ ๋ํ ํ๋ฅญํ ๋ต๋ณ์ด์์ต๋๋ค. ์๋ํ๋ฉด ์ด๋ณด์๊ฐ ์ด๋ฏธ React _์์ฒด_์ ์
๋ฌธํ๊ธฐ ์ํ ๋ง์ ๋จ๊ณ๋ฅผ ์ ๊ฑฐํ๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ํ๋ ์๋์์ ์ฌ์ ํ ์์ฉ๊ตฌ์ ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ฌ์ ํ ์ฌ๋๋ค์ด ์ํ๊ณ๋ฅผ ๊ตฌ๋งคํ๋๋ก ์ฅ๋ คํ๊ณ Redux ์์ฒด๊ฐ ์๋์ ์ผ๋ก ๋ง์ ๊ฒ์ ํ์ง ์๋๋ค๋ ๊ฒ์ ๋ถ๋ช ํ ํด์ผ ํฉ๋๋ค . React๋ Redux๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ์ํ๊ณ์์ ๋๋ง์น ์ ์์ต๋๋ค.
Redux ์ฝ์ด์ redux-thunk
์ ๊ฐ์ ํจํค์ง๋ฅผ ํฌํจํ๋ ๊ฒ์ด ์ฌ๊ธฐ๋ก ๊ฐ๋ ๊ธธ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
๋ช
ํ์ฑ์ ์ํด ๋ด๊ฐ ๋์ง๊ณ ์๋ ์์ด๋์ด์ ์ข
๋ฅ๋ ์ค์ ๋ก ํต์ฌ์ ์ง์ ํฌํจํ๋ ๊ฒ์ ๊ดํ ๊ฒ์ด ์๋๋๋ค. ๊ทธ๋ค์ create-react-app
๋ผ์ธ์ ๋ฐ๋ผ ๋ณ๋์ ํจํค์ง ๋๋ CLI ๋๊ตฌ ๋๋ ๊ธฐํ๊ฐ ๋ ์ผ์ข
์ "์ฌ์ ๊ตฌ์ถ๋ ๊ตฌ์ฑ" ๋๋ "์ฌ์ฉ ์ฉ์ดํ ์ถ์ํ ๊ณ์ธต"์ ๊ฐ์์ ์ผ๋ก ์์ฑํ๋ ๊ฒ์
๋๋ค.
๋๋ Jumpstate/Jumpsuit์ ์ ์๋ก ์ฐจ์ํ๋ ๊ฒ์ด ๋ ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค.
TL;DR:
Redux๋ ๋๋ฌด ๋ฎ์ ์์ค์ด๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ฐ๊ธฐ ์ด๋ ต๊ณ ๊ตฌ์ฑ/ํตํฉํ๊ธฐ ์ด๋ ต์ต๋๋ค. ์ปค๋ฎค๋ํฐ๋ 90% ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ชฉํ๋ก ํ๋ ํ์คํ๋ ์์ ์์ค redux API์ ์ด์ ์ ํ์ฉํ์ฌ ํ์ต ๊ณก์ ์ ์ฉ์ดํ๊ฒ ํ๊ณ ๋ ๊ฐ๋จํ ํ๋ก์ ํธ๋ฅผ ์ํ ์๋ฃจ์
์ผ๋ก ์ด์ํ ์๋ ์์ต๋๋ค. Jumpstate๋ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋
ธ๋ ฅํ๊ณ ์์ง๋ง ์ฅ๊ธฐ์ ์ธ ํด๊ฒฐ์ฑ
์ ์๋๋๋ค. ์ฐ๋ฆฌ๋ ์ด API๊ฐ ์ด๋ป๊ฒ ๋ณด์ผ์ง์ ๋ํ ๊ฐ๋ฅํ ์์ด๋์ด(์ค์ ๋๋ ๋ฉํ ์ฝ๋)๋ฅผ ์ ์ํ๊ธฐ ์์ํด์ผ ํฉ๋๋ค.
Redux๋ ์ฒ์๋ถํฐ ๋ฐฐ์ฐ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต๊ณ ๋น๋๊ธฐ ๋ก์ง, ๋ถ์์ฉ, ์ฌ์ฉ์ ์ ์ ๋ฏธ๋ค์จ์ด ๋ฑ๊ณผ ๊ฐ์ ์๋ก์ด ๊ฐ๋ ๊ณผ ํตํฉํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต์ต๋๋ค. ๋ฆฌ์กํธ ์ํ๊ณ์ ์์ฃผ ์๋ก์ด ๊ฒ์ด์์ต๋๋ค.
๋ฐ์์ ๋ฐฐ์ฐ๊ณ ๋ฉฐ์น ๋ง์ ๋๋ ์ฆ์ redux๋ฅผ ๋ฐฐ์ฐ๋๋ก ๊ถ์ฅ๋์์ต๋๋ค. ์ด ๊ถ์ฅ ์ฌํญ์ ๋์ผํ ์์ ์ ์ํํ(๋๋ ์ํ ์ค์ธ) ๋งค์ฐ ๊ฒฝํ์ด ๋ง์ ๊ฐ๋ฐ์์ ์ด๋ณด ๊ฐ๋ฐ์ ๋ชจ๋์๊ฒ์ ๋์จ ๊ฒ์ ๋๋ค. setState ์ด์์ผ๋ก ํ์ฅ๋ ๋ชจ๋ ๊ฒ์ ๋ํ ์ฌ์ค์์ ์๋ฃจ์ ์ผ๋ก ํ์๋ฐ์์ต๋๋ค(setState ๊ฒ์ดํธ๋ ์ฌ๊ธฐ์ ์ ์ธํฉ์๋ค ๐ ). redux๊ฐ ํ๋ฅญํ๊ธฐ ๋๋ฌธ์ ์ด ๋ชจ๋ ๊ฒ์ ์ ๋นํ ์ด์ ๊ฐ ์์ต๋๋ค.
๋๋ ๋ถ๊ฐํผํ๊ฒ ํ์ต ๊ณก์ ์ ๋ถ๋ชํ๊ณ ๋์์ ๊ตฌํ์ ๋ Redux์ ๋ํ ๋ง์ผํ ๋ฐ ๋ฌธ์ํ๋ ์ ๊ทผ ๋ฐฉ์์ด "Redux๋ ์ด๋ ต๊ณ ๊ฐ๋ ์ ์ ์์ค์ด๋ฉฐ API๋ ์ ๊ฒจ ์์ผ๋ฉฐ ์ ์์ ์ผ๋ฉด ๋ฉ๋๋ค. ๊ทธ๊ฒ."
์ด๊ฒ์ด ๋ด๊ฐ ๋ชจ๋ ๋๋ฃ๋ค๊ณผ ํจ๊ป ํ ์ผ์ ๋๋ค. ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ํ๋๋ก ๊ต์ก๋ฐ์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ํตํด ํ์ ์ป์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ์ฌ์ ์ ๋ฐ๋ผ ๋๋ redux๊ฐ ์ ๊ณตํด์ผ ํ๋ ๋ณต์ก์ฑ๊ณผ ๊ณ ๊ธ ๊ธฐ๋ฅ ์ค ์ผ๋ถ๋ฅผ ์ผ์์ ์ผ๋ก ์๋์ ์ผ๋ก ์จ๊ธฐ๋ ์ถ์ํ ๊ณ์ธต์ ์์ฃผ ์ด๊ธฐ์ ๋ง๋ค๋ ค๊ณ ํ์ต๋๋ค.
๋๋ ์ปค์คํ ์ก์ ์์ฑ์๊ฐ ํ์ํ์ง ์์๊ณ , ์ก์ ๊ณผ ๋์คํจ์ฒ๋ฅผ ์ปดํฌ๋ํธ์ ๋งคํํ๋ ๊ฒ์ ๋ํด ๊ฑฑ์ ํ๊ณ ์ถ์ง ์์๊ณ , ๋ค๋ฅธ ๋ง์ ์ฌ๋๋ค๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก switch ๋ฌธ ๋์ ๋ ์ฅํฉํ ๋ฆฌ๋์ ๋ ์ด์์์ ์ ํํ์ต๋๋ค.
๊ทธ๊ฒ์ ํ์์ ์ผ๋ก ์๋ํ์ต๋๋ค. ์ฌ์ค, ๋ค๋ฅธ ๋๋ฃ๋ค๊ณผ ํ์ต ๊ณก์ ์ผ๋ก ๋น์ทํ๊ฒ ๊ณ ๊ตฐ๋ถํฌํ๋ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ ์ํด redux๋ฅผ ๋ฐฐ์ฐ๋ ๊ณผ์ ์ ๊ฐ์ํํ์ต๋๋ค.
์ฐ๋ฆฌ๋ ๊ณ ๊ธ ๋๋ "๊ด์ฉ์ " redux๊ฐ ํ์ํ ๋ ๊ณ์ ์ฌ์ฉํ ์ ์๋๋ก ์ค๊ณํ์ง๋ง ์ค์ ๋ก 90% ์ฌ์ฉ ์ฌ๋ก์ ๋ง๊ฒ ์ค๊ณํ์ต๋๋ค.
๊ฒฐ์ฝ jumpstate๊ฐ ๋ชจ๋ ๊ธฐ๋ฐ์ ํฌ๊ดํ๋ค๊ณ ๋งํ๋ ๊ฒ์ด ์๋๋๋ค. ์ค์ ๋ก jumpstate๊ฐ "๊ด์ฉ์ ์ผ๋ก" ์๋ํ๋ ค๋ฉด ๋ณ๊ฒฝํด์ผ ํ ์ฌํญ์ด ๋๋ฌด ๋ง์ต๋๋ค(์ฌ์ฉ์ ์ง์ ๊ฐ๋ฅํ ์์ ์์ฑ๊ธฐ, ์ ์ญ ์์ ๊ฐ์ ธ์ค๊ธฐ ์ ๊ฑฐ... ๋ง์ด) ํ์ง๋ง ๋ง์ ์ฌ๋๋ค์ด ๊ธฐ๋ณธ์ ๋ฐฐ์ฐ๋ ๋ฐ ํ์คํ ๋์์ด ๋์๊ณ ๋งค์ฐ ๊ฐ๋จํ ์์ค์์ redux๊ฐ ์๋ํ๋ ๋ฐฉ์์ ์ดํดํ ์ ์๋ ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํ์ต๋๋ค. ๋๋ ํญ์ Jumpstate๊ฐ ๋๊ตฐ๊ฐ๊ฐ redux๋ฅผ ๋ฐฐ์ฐ๋ ๋ฐ ๋์์ด ๋์๋ค๋ ๋ฉ์์ง๋ฅผ Jumpstate slack ์กฐ์ง์์ ๋ฐ์ต๋๋ค.
๊ทธ ์ฌ๋๋ค์ด ์ค๋๋ ์๋ ์ฌ์ ํ jumpstate๋ฅผ ์ฌ์ฉํ๊ณ ์๋์ง ์ฌ๋ถ๋ ๊ทธ๋ค์ง ์ค์ํ์ง ์์ต๋๋ค(๊ทธ๋ฌ๋ ๋ง์ ์ฌ๋๋ค์ด ์ค๋๋ ์๋ ์ฌ์ ํ ๊ทธ๊ฒ์ ํ๋ก๋์ ์์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค). ์ค์ํ ๊ฒ์ ๊ทธ๋ค์ด ๊ฐ์ง ๊ฒฝํ๊ณผ redux ์ํ๊ณ์์ ์ผ๋ง๋ ๋นจ๋ฆฌ ์์ฐ์ฑ์ ๋ฐํํ ์ ์์๋์ง์์ต๋๋ค.
์ด ํ ๋ก ์ ๋ํด ์๊ฐ๋๋ ๋ช ๊ฐ์ง ์์ด๋์ด:
์ด๋ค ์์ผ๋ก๋ ๊ฐ์ ๋ ๋ฌธ์๋ก ์ด ๋ฌธ์ ๋ฅผ ์ผ๋ง๋ ํด๊ฒฐํ ์ ์์ต๋๊น?
๋ง์ด. Redux ๋ฌธ์์ ๊ดํด์๋ AngularJS์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ถํ์ํ๊ฒ ์ฅํฉํ์ง๋ง AngularJS์ ๋ฌ๋ฆฌ "ํ์ํ๊ณ ๋งํ์ง ์๊ธฐ" ์์น์ ์คํจํ๊ธฐ ๋๋ฌธ์ AngularJS 1์ ๋ฌธ์๋ณด๋ค ํจ์ฌ ๋ ๋์๋ค๊ณ ์๊ฐํฉ๋๋ค.
Redux์ ๋ฌธ์๋ ์ฝ๋์ ์ค์ ๋ฐ๋ชจ๋ณด๋ค ์ฝ๋ ์ค๋ํซ์ ์ ํธํฉ๋๋ค. ์ฆ, "์ฌ๊ธฐ์ ์ฝ๋ ์ธํธ๊ฐ ์์ต๋๋ค. ์ฐ๊ฒฐ ๋ฐฉ๋ฒ์ ๋งํ์ง ์๊ฒ ์ง๋ง ์๋ํ๋ค๋ ๊ฒ์ ๋ฏฟ์ผ์ญ์์ค"๋ผ๋ ์๊ฐ์ด ๋๋ฌด ๋ง์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๋ด์์ ์์ ๋ฅผ ์คํํ ์ ์๋ ๋ฅ๋ ฅ์ด ์๋ค๋ ๊ฒ์ ์ฌ์ฉ์๊ฐ ๋ก์ปฌ์์ ํ๋ ์ผ์ด ์ ๋๋ก ์๋ํ๊ณ ๋ฌด์ธ๊ฐ๊ฐ ์๋ํ์ง ์์ผ๋ฉด ์ค์ค๋ก ๊บผ์ง๋ค๋ ์์ ์ ๋ณธ๋ฅ์ ๋ฏฟ์ด์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๊ฐ๋จํ Todo List ์ฑ์กฐ์ฐจ๋ Redux์ "hello world" ์ต๊ณ ์ ์๋ ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํจ์ฌ ๊ฐ๋จํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ๋ค์ด์ด๊ทธ๋จ์ด ํ์คํ ๋์์ด ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๋๋ @sunjay ์ ๊ฒ์ ์ข์ํฉ๋๋ค. ๋ ๋์ ๋ฐฉ๋ฒ์ ํ์ผ์ด ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋์ด ์๋์ง ๋ฑ ๋์ ์์ค์ ๋ณด๊ธฐ์์ ํ ์ผ ๋ชฉ๋ก ์์ ์์ฒด๋ฅผ ์ํด ๋์์ธํ๋ ๊ฒ์ ๋๋ค. ์ด๋ฏธ์ง๋ ๊ธด ํ ์คํธ๋ฅผ ์ ๋ฌํ๋ ๋ฐ ๊ฑฐ์ ํญ์ ๋ ์ข์ผ๋ฉฐ ๋ฌธ์์ ์ฅํฉํจ์ ์ค์ด๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ์ด๋ฏธ์ง๋ ๋ํ ์ด๋ณด์๊ฐ ์ด์ ์ ์ ์งํ๊ณ Redux๋ฅผ ์ ์ฒด์ ์ผ๋ก ๋ ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๋ด ๋ ์ผํธ: ์ฝ์ด๋ฅผ ๋ณ๊ฒฝํ์ง ๋ง์ญ์์ค. ๊ทธ ๊ด์ฑ๋ ๋จ์ํจ์ ์์ต๋๋ค. ์ด ์์ ์์ ๋ฌด์ธ๊ฐ๋ฅผ ์ถ๊ฐํ๋ฉด ์ ์ฒด์์ ์ ๊ฑฐ๋ ์ ์์ต๋๋ค.
์ฌ์ฉ์ ์นํ์ฑ๊ณผ ์ถ๊ฐ ์ถ์ํ๋ ์ฌ์ฉ์ ์์ญ์์ ๋ฐ์ํ ์ ์์ต๋๋ค. ๊ณต์์ ์ผ๋ก๋ ๊ด์ฉ์ ์ผ๋ก ์ฌ์ฉํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์์ธก ๊ฐ๋ฅํ ์ํ ์ปจํ ์ด๋์ ๋๋ค.
์ค ์ ์์ด Let's be be โค๏ธ
์ฆ, ๊ทธ ์์ ๋ ๋ง์ ์๊ฒฌ์ด ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค์ด ์ํ๋ ๋๋ก ํจํค์ง๋ก ๋ง๋ค ์ ์์ต๋๋ค. ์ ๋ ๊ทธ๋ ๊ธด ํ๋ฐ ์ฝ์ด๋ ๋ฐ๊พธ์ง ๋ง์๋ค, ์ ๋ฐ์.
@HenrikJoreteg , ๋๋ ค์ํ์ง
๋ง์ด. Redux ๋ฌธ์์ ๊ดํด์๋ AngularJS์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ถํ์ํ๊ฒ ์ฅํฉํ์ง๋ง AngularJS์ ๋ฌ๋ฆฌ "ํ์ํ๊ณ ๋งํ์ง ์๊ธฐ" ์์น์ ์คํจํ๊ธฐ ๋๋ฌธ์ AngularJS 1์ ๋ฌธ์๋ณด๋ค ํจ์ฌ ๋ ๋์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ ๋งค์ฐ ์ฌ์ค์ ๋๋ค. Redux๊ฐ ์๋ก ๋์์ ๋ ํ ๊ฐ์ง๋ ๋ฌธ์๊ฐ ๋๋ฌผ์์ง๋ง ๊ธฐ๋ณธ ์ฌํญ์ ์์๋ค๋ ๊ฒ์ ๋๋ค. ๋ง์ ์ฌ๋๋ค์ด "๋๋ฌด ๊ฐ๋จ"ํด์ ์ฑํํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์จ๋ผ์ธ ๋ฆฌ์์ค๋ ์ด์ "๋ด๊ฐ ๊ฐ์ฅ ์ข์ํ๋ ๋ฏธ๋ค์จ์ด"์ "๋ด๊ฐ ๊ฐ์ฅ ์ข์ํ๋ ์์ฉ๊ตฌ ๊ฐ์ ๋๊ตฌ"์ธ "์ค์ ๊ธฐ์ "์ ๋ณด์ฌ์ฃผ๋ ค๊ณ ํฉ๋๋ค. ์ฌ๋๋ค์ ์๋๋ฉ๋๋ค.
"์ ์์๋ก ์ข๋ค"๋ผ๋ ๋ง์ด ์์ต๋๋ค.
@Phoenixmatrix , @Sylphony : ๊ทธ๋ ๋ค๋ฉด ์ ์ฌ์ ์ธ ๋ฌธ์ ๊ฐํธ์ ์ด๋ค ๋ชจ์ต์ผ๊น์?
๊ฐ์ธ์ ์ผ๋ก, "์ด๋ณด์ ์์ "์ด ์๋ค๋ ์์ ์ ์๊ณผ ๊ฒฐํฉํ๊ธฐ ์ํด ๋ ๊ฐ๋ก ๋๋๋๋ค(2๊ฐ์ ๋ค๋ฅธ ์ฌ์ดํธ/๋ฌธ์๊ฐ ์๋๋ผ 2๊ฐ์ ๋ค๋ฅธ ์น์ ).
๊ท์ฝ๊ณ ๋จ์ํ ๊ทธ๋ฆผ์ด ๋ง์ด ์๋ "Redux ์ํคํ ์ฒ"๋ ์ก์ ๊ณผ ๋ฆฌ๋์๋ฅผ ์ค๋ช ํ๊ณ react-redux์ ์๋ง๋ ์ฝํฌ๋ฅผ ์๊ฐํ๊ณ "์คํํฐ ์คํ ์ด"๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ข ๋ฅ์ ์ ํ ๊ตฌ์ฑ์ ์ ํํ๊ณ ์ผ๋ง๋ ์ฌ์ด์ง ๋ณด์ฌ์ค๋๋ค. ๋ช ๊ฐ์ง ajax ์์ฒญ์ ์ํํ๊ณ ํ๋ฉด์ ๋ด์ฉ์ ๋ ๋๋งํ๋ ๊ฐ๋จํ ์ฑ์ ๋ง๋๋ ๊ฒ์ ๋๋ค.
๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ๊ณ ๊ธ ๊ฐ๋ ์ด ํฌํจ๋ "ํ์" ์น์ ์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค. ๊ทธ๋๋ ์๋ง ๋ง์ ๊ฒ์ ์ฐข์ ๊ฒ์ ๋๋ค. ์ค๋ ๋๊ตฐ๊ฐ๊ฐ ๋์๊ฒ ์ฑ์ ์ฌ๋ฌ ์คํ ์ด๋ฅผ ๊ฐ๋ ์น์ ์ด ์๋ค๊ณ ์ง์ ํ์ต๋๋ค. ์๋ฉด ์ข์๋ฐ ๊ทธ ์ฐ์์๊ฐ ์ ๋ง ๊ณ ๊ธ์ค๋ฝ์ต๋๋ค. ๋๋ ์๋ก์ด ์ด๋ฏผ์๊ฐ ๊ทธ๊ฒ์ ๋ณด์ง ์๊ณ ์ฐ์ฐํ ๋ฐ๊ฒฌ ํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
๋ ๋์ ๋ฌธ์๋ ํญ์ ์ข์ ์๊ฐ์ด์ง๋ง ์ด๊ฒ์ด ์ฌ๊ธฐ์ ํต์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. Redux API์ ์์ฉ๊ตฌ์ ์ฅํฉํจ ๋๋ฌธ์ ์ถ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ฑ๋๊ณ ์ฑํ๋๊ณ ์์ต๋๋ค. ๋์ผํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํน์ ์์ค ๋๋ ๋ค๋ฅธ ์์ค์์ ๋ถ๋ช ํ ํ์ํ๊ธฐ ๋๋ฌธ์ Redux ์ปค๋ฎค๋ํฐ๋ฅผ ์กฐ๊ฐํํ๊ณ ์์ต๋๋ค. ์ํ๊ณ์ ์ ๊ทน์ ์ผ๋ก ๊ธฐ์ฌํ๋ ค๊ณ ๋ ธ๋ ฅํ๋ ๋์ผํ ์ ์๋ค์ด "Redux๋ฅผ ์ดํดํ์ง ๋ชปํ๋ค"๋ ์ด์ ๋ก ๊ณต๊ฐ์ ์ผ๋ก ํํ๋๊ณ ํด๊ณ ๋ ๋ ์ค๋ง์ค๋ฝ์ต๋๋ค. ์ปค๋ฎค๋ํฐ๊ฐ React ์ฝ์ด์ ์ผ๋ถ๊ฐ ์๋๋ผ ์ด๋ ์ ๋ "์ถ๋ณต๋ฐ์" ๋ ๊ฐ๋จํ ์ถ์ํ๋ฅผ ๋ง๋ค ์ ์๋ค๋ฉด ๋ชจ๋๊ฐ ์ด๊น๋๋ค. ํ๋์ฝ์ด ์ฌ์ฉ์๋ Redux๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๊ณ ๋ค๋ฅธ ์ฌ๋๋ค์ ๋ ์ฝ๊ณ ๋ ์ฅํฉํ API๋ก ์ถ์ํ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@derekperkins "์ถ๋ณต๋ฐ์" ๋์๊ด์ ๋ํ ํฉ์๋ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์? ๊ทธ ์์ ๋ค์ด๊ฐ ๋ด์ฉ๊ณผ ์์ ํ ์ฌ๋์ ์ด๋ป๊ฒ ๊ฒฐ์ ํฉ๋๊น?
๋๋ ์ด๊ฒ์ ๋ชจ๋ ์ฐฌ์ฑํ์ง๋ง ์ผ๋ถ ์ฌ๋๋ค๋ง ์ฌ์ฉํ๋ ๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค์ด ์ํ๊ณ๋ฅผ ๋์ฑ ๋ถ์ด์ํค๋ ๊ฒ์ ํผํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
๊ด๋ จ xkcd: https://xkcd.com/927/
๋ค, redux์ ํต์ฌ๊ณผ react-redux๋ ๊ฐ๋ฅํ ํ ํฉ์์ ๊ฐ๊น์ต๋๋ค. redux-thunk์ redux-actions์กฐ์ฐจ๋ ๊ฒฝ๊ณ์ ์ ๊ฐ๊น์ต๋๋ค. ๊ทธ ์์ค์์๋ ๋๋ค์์ ์ฌ๋๋ค์ด ํ์๋ก ํ๋ ๋ฐ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋ค.
Redux์์ ์์ฉ๊ตฌ๋ฅผ ์ค์ด๋ ๊ฒ์ "ํ์ํ์ง ์์ต๋๋ค.
์ ์ฅ, ์ฐ๋ฆฌ๋ ๋ง์ (์์ญ ๊ฐ) redux ์ฑ์ ๊ฐ์ง๊ณ ์๊ณ , ๋ค๋ฅธ ์ฑ์ด ๋ค๋ฅธ ์๊ตฌ ์ฌํญ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ณตํต ์์ฉ๊ตฌ ๊ฐ์ ์คํ์ ๊ตฌ์ถํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ๋จ์ผ ์ฑ ๋๋ ๋์ผํ ์๊ตฌ ์ฌํญ์ ๊ฐ์ง ๋ช ๊ฐ์ ์ฑ์ด ์์ผ๋ฉด ์ฝ์ต๋๋ค. ์์ ๊ฒ์กฐ์ฐจ๋ ๊ฝค ๋ค๋ฆ ๋๋ค.
์ฌ๊ธฐ์์ ์์ด๋์ด๋ ๋ชจ๋ ์ฌ๋๋ค์ ์ํ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ํดํท์ ๊ตฌ์ฑํ๋ ๊ฒ์ด ์๋๋๋ค. CRA๋ฅผ ์๋ก ์ฌ์ฉ: Babel, Webpack ๋ฐ ESLint๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์ํ ๋ง์ต๋๋ค. CRA๊ฐ ํ๋ ์ผ์ ์ฌ์ฉ์ ์ธก์์ ๋ฒ๊ฑฐ๋ก์ ์์ด ๋ชจ๋ ์์ ์ ์ํํ ์ ์๋ ๋ ๋จ์ ์ธ ๋จ์ผ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๊ฒ์ด๋ฉฐ, ํ์ต์๋ฅผ ์ํด ๋ ๋์ ํ๊ฒฝ์ ๋ง๋๋ ์ฌ๋ฌ ์ค์ ์ ์๋์ ์ผ๋ก ์ ํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฌ์ฉ์๊ฐ _์ํ๋ ๊ฒฝ์ฐ_ ๊ตฌ์ฑ์ ์ ์ดํ ์ ์์ต๋๋ค.
๋ํ ๋ชจ๋ ๋จ์ผ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํ์ง๋ ์์ต๋๋ค. CRA๋ ๊ณ ๊ธ ์ฝ๋ ๋ถํ , ๋ค์ค ์ง์ ์ , SSR ๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ ๋ค๋ฃจ์ง ์์ต๋๋ค. CRA ๋ฌธ์ _do_๋ ๋ ๋ง์ ๊ตฌ์ฑ ๊ฐ๋ฅ์ฑ์ ์ ๊ณตํ๊ณ ํน์ ์ฌ์ฉ ์ฌ๋ก์ ๋ ์ ์๋ํ ์ ์๋ ๋ค๋ฅธ ๋๊ตฌ ๋ฐ ์ต์ ์ ๊ฐ๋ฆฌํต๋๋ค.
์ข์ ๋ฐฉ๋ฒ์
๋๋ค. ๋นจ๋ฆฌ ์ผ์ด๋์ ์คํํด์ผ ํ๋ ๊ฒ
redux์ ์ด ๊ฐ์ ๊ตฌ์ฑ ๋ ์ด์ด๋ง ์ค์นํ๋ฉด ๋๋์? ์ ๊ฒ
๊ต์ฅํ ๊ฒ์
๋๋ค.
๋ด๊ฐ ๊ฐ์ง ๋ ๋ค๋ฅธ ์์ด๋์ด๋ ๊ฐ๋ฐ์ ๋ชจ๋์์ ์ค์ ํ ์ ์๋ ํ๋๊ทธ์
๋๋ค.
์ฌ์ฉ์๋ฅผ ์ํ ์ ์ง์ ํ์ต ๊ธฐํ๋ฅผ ๊ด์ฐฐํ๊ณ ๋
ธ์ถํฉ๋๋ค. ์
์ด๋ฐ ์์ผ๋ก ์ถ์ํ ๊ณ์ธต์ ๋ํํ ๊ต์ก ๋๊ตฌ ์ญํ ์ ํ ์ ์์ต๋๋ค.
2017๋
3์ 20์ผ ์์์ผ ์คํ 4:14 Mark Erikson [email protected]
์ผ๋ค:
์ฌ๊ธฐ์์ ์์ด๋์ด๋ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ํดํท์ ๊ตฌ์ฑํ๋ ๊ฒ์ด ์๋๋๋ค.
๋ชจ๋ ์ฌ๋๋ค์ ์ํด. CRA๋ฅผ ์๋ก ์ฌ์ฉ: ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ด ๋ง์ด ์์ต๋๋ค.
Babel ๋ฐ Webpack ๋ฐ ESLint. CRA๊ฐ ํ๋ ์ผ์ ๋จ์ผํ ์๊ฒฌ์ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค.
์ฌ์ฉ์ ์ธก์์ ๋ฒ๊ฑฐ๋ก์ ์์ด ๋ชจ๋ ์๋ํ๋๋ก ํ๋ ๋ฐฉ๋ฒ๊ณผ
์๋์ ์ผ๋ก ์ํฉ์ ๊ฐ์ ํ๋ ์ฌ๋ฌ ์ค์ ์ ์ ํํฉ๋๋ค.
ํ์ต์. ๊ทธ๋ฐ ๋ค์ ์ฌ์ฉ์๊ฐ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ ๊ตฌ์ฑ์ ์ ์ดํ ์ ์์ต๋๋ค.๊ทธ๋ค์ ์ํ๋ค .๋ํ ๋ชจ๋ ๋จ์ผ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํ์ง๋ ์์ต๋๋ค. CRA๋ ์๋ํ์ง ์์ต๋๋ค.
๊ณ ๊ธ ์ฝ๋ ๋ถํ , ๋ค์ค ์ง์ ์ , SSR ๋๋ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
์ ๊ฒ. CRA๊ฐ ์๋ ํ๋ก์ธ์๋ ๋ค๋ฅธ ๋๊ตฌ ๋ฐ ์ ๊ณต ํ ์ ์์ต๋๋ค ์ต์ ์ ์ง์ ์
๋ ๋ง์ ๊ตฌ์ฑ ๊ฐ๋ฅ์ฑ๊ณผ ํน์ ์ฌ์ฉ ์ฌ๋ก์์ ๋ ์ ์๋ํฉ๋๋ค.โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธ
https://github.com/reactjs/redux/issues/2295#issuecomment-287914805 ๋๋ ์์๊ฑฐ
์ค๋ ๋
https://github.com/notifications/unsubscribe-auth/AFUmCactFzsw7etmGGP8MFK6kfNaOzTJks5rnvorgaJpZM4MhnVF
.
@sunjay ํด๋ฆญํ์ง ์๊ณ ๋ xkcd ๋งํฌ๊ฐ ๋ฌด์์ธ์ง ์์์ต๋๋ค. :)
๋๋ @markerikson์ ๋์ํฉ๋๋ค. ์ด๊ฒ์ ๋ชจ๋ ์ฌ๋์ ๋ํ ๋ชจ๋ ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๋ ค๋ ์๋๊ฐ ์๋๋๋ค. ํต์ฌ Redux ๊ฐ๋ฐ์๊ฐ "์ด๊ฒ์ด ์์ ์ ์ํํ๋ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค"๋ผ๊ณ ๋งํ๋ ๋ ๋จ์ ์ธ ์ง์ ์ ๋๋ค. ํ์ํ ๊ฒฝ์ฐ ์ฌ์ ์ํ ์ ์๋ ์ ์์ ์ธ ๊ธฐ๋ณธ๊ฐ์ด ์์ง๋ง ๊ธฐ๋ณธ๊ฐ์ด ๊ฐ๋ฐ์์ 80%์ ๋ํด ์๋ํ ๊ฒ์ด๋ผ๊ณ ์ฅ๋ดํฉ๋๋ค.
ํต์ฌ Redux์ ์์ฑ๋๊ฑฐ๋ ์์ฑ๋์ง ์์ ์ ์์ต๋๋ค. ๋๋ ์ฌ์ ํ ํ์ต ๊ณก์ ์ ๊ฐ์ํํ๋ ๊ฒ ์ด์์ ์ํํ๋ Jumpstate์ ๊ฐ์ ๊ณณ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
Redux ํ์ต ๊ณก์ ์ ๊ฐํ๋ฅด์ง๋ง ๊ฐ๋ ์ ์ดํดํ๋ฉด ์ถ์ํ ๊ณ์ธต์ ํ์์ฑ์ด ์ฌ๋ผ์ง๋๋ค.
์ด๋ ์ ๋๋ ๋ง๋ค๊ณ ์๊ฐํ์ง๋ง ํญ์ ์ถ์ํ ๊ณ์ธต์ ์ ๊ฑฐํ๊ณ ์ถ๋ค๋ ์๋ฏธ๋ ์๋๋๋ค. ๊ณผ๊ฑฐ์ C๋ฅผ ์์ฑํ๊ณ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ดํดํ์ง๋ง ๊ฐ๋น์ง ์์ง์ด ์ฒ๋ฆฌ๋๋ Go๋ก ์์ฑํ๋ ๊ฒ์ ํจ์ฌ ์ ํธํฉ๋๋ค. ์ด์ ์ Tensorflow ์์ ์ ๋ฐ๋ฅด๋ฉด ๋ฎ์ ์์ค์ API์ ์์ฑํ๋ ๊ฒ์ด ๋ ์ฑ๋ฅ์ด ์ข์ง๋ง Python keras ์ถ์ํ์ ์ฌ์ฉ ํธ์์ฑ์ ๋ํด์๋ ํ ๋ง์ด ๋ง์ต๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก Redux ๋ Jumpstate(๋๋ ์ด ๋ฌธ์ ์์ ํ์๋ ์ถ์ํ)์ ๊ฒฝ์ฐ ์์ฉ๊ตฌ๊ฐ ๋ฐ๋์ ์์ฑํ๊ธฐ ์ด๋ ค์ด ๊ฒ์ ์๋๋ฉฐ ์์ Redux์ ๋ชจ๋ ์ ์ฐ์ฑ์ด ํ์ํ์ง ์์ ๋๋ถ๋ถ์ ์ฌ์ฉ ์ฌ๋ก์์ ์ฑ๊ฐ์ ์ผ์ ๋๋ค.
๊ทธ๊ฒ์ด ๋์๊ฒ ๋ฌ๋ ค ์๋ค๋ฉด ๋๋ ์ด๊ฒ์๋ณด๊ณ ์ถ์ต๋๋ค :
mapStateToProps
๊ตฌํ ์ ๊ณต).๋ฌผ๋ก ํต์ฌ ์ธ์๋ ๊ณต์ Redux๋ก ๋ธ๋๋ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ํ, ๋๋ ์ด๊ฒ์ ์ฐ์ง ์์ ๊ฒ์
๋๋ค. ํ์ง๋ง ๋น์ ์ ํ ์ ์์ต๋๋ค.
์ ๋ฅผ ์ํด, ๋ช ๋ฌ ์ ์ redux
๋ฐฐ์ธ ๋ ๋ฌธ์๋ฅผ ์ฝ์์ง๋ง ์ ์ดํดํ์ง ๋ชปํ์ต๋๋ค. ๊ทธ๋์ src ์ฝ๋ ๋ฅผ ์ฝ๋ ๋ฐ 2์ผ์ ๋ณด๋ธ ๋ค์ api
์ ๋ํ ๋ชจ๋ ์ค๋ช
์ ๋ฌธ์๊ฐ ๋ช
ํ ํด
๊ทธ๋ฆฌ๊ณ ๋์, "์ํ ๋์์ธ", "๋ฆฌ๋์ ๋ถ๋ฌธ", "๋ฏธ๋ค์จ์ด ๋์์ธ", "๋น๋๊ธฐ ์๋ฃจ์ "......์ ๋ํ ์๊ฐ์ด ๋ค์ ๋ฌ์ ํ๋ก์ ํธ๋ฅผ ๊ฐ๋ฐํ๋ฉด์ ์ฑํฐ๋ ๋ช ํํด์ง๋๋ค.
๋ฐ๋ผ์ src ์ฝ๋๋ฅผ ์ฝ๋ ๊ฒ์ด redux
๋ฅผ ๋ฐฐ์ฐ๋ ๊ฐ์ฅ ์ ํฉํ ๋จ๊ณ ๋ผ๊ณ ์๊ฐํ๊ณ ๊ทธ redux
์ ํ๊ฒฝ์ ๋ณด๋ค ์ํํ๊ฒ ์ดํดํ๊ณ ํ์ํ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋น๋๊ธฐ ์ง์.
redux-thunk, redux-saga
์ ๊ฐ์ ๋ค๋ฅธ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋น๋๊ธฐ ์ง์
๊ทธ๊ฒ์ ์ฌ๋๋ค์ด ๋ ๋์ ๊ฒ์ ์ฐพ๊ธฐ ์ ์ 0.5์ด ๋์ ๊ทธ๊ฒ์ ๋ณด๋ ๊ฒ์ ๋๋ค. ๊ตฌ์ฑ ์์ ๋ด์์ API๋ฅผ ํธ์ถํ ๋ค์ ์ฝ๋ฐฑ/์ฝ์ ํด๊ฒฐ์์ ๋์คํจ์น๋ฅผ โโํธ์ถํ๋ ๊ฒ์ ๋ง์ ์๋ ์์ต๋๋ค. ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ์ฆ์ ์ธ๋ถํํ๊ธฐ๋ฅผ ์ํ ๋ฟ์ ๋๋ค(์ ํฌํจ). ๊ทธ๋ฌ๋ ๋ฏธ๋ค์จ์ด ์์ด๋ async๋ฅผ ์ ์ํํ ์ ์์ต๋๋ค.
@gaearon ์ ์๊ฒฌ์ ์ค์์ด ์ผ๋ง๋ ๊ด๋ฒ์ํ์ง๋ฅผ ๊ฐ์กฐํ๋ค๋ ์ ์์ ์๋ฒฝํฉ๋๋ค. ๋๋ ๊ทธ๊ฐ ์ ์ํ Redux 2.0์ ์ ๋ฐํจ๊ณผ ์ฐ์ํจ, ๊ฐ๋ ฅํจ์ ์ ์ ์ผ๋ก ์ฌ๋ํ๊ณ ๊ฐ์ฌํ์ง๋ง, ๊ทธ ๊ฐ์ ์ฌํญ ์ค ๊ฑฐ์ ๋ชจ๋ ๊ฒ์ด ๋์ ๊ด๋ จ์ด ์์ต๋๋ค!
๋๋ ๊ทธ๊ฒ์ด ์ค์ ๋ก ๋งค๋ ฅ์ ์ด๋ผ๊ณ โโ์๊ฐํฉ๋๋ค.
๋ด ์์ ์ Redux ์ถ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ ๊ฑฐ์ ์์ ํ ๋ฐ๋์ ๋๋ค. ๋๋ ๋จ์ผ ๊ฐ์๊ธฐ ๋์, ์์ ๊ฐ์๊ธฐ ๊ธฐ๋ฅ์ ๋์ ์ฝ๋ ๋ฐ ์ ํ๊ธฐ์ ๋ฒ๋ค๋ก ๋ฌถ๋ ๊ฒ, ๊ฐ์ฒด ํค๋ฅผ ์ํด ๋ฌธ์์ด์ ์์ ํ ์์ ๋ ๊ฒ์์ ์์ฒญ๋ ๊ฐ์น๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค. ๊ทธ๊ฒ์ ๋ด ์์ ์ 90% ์๋ฃจ์ ์ด๋ฉฐ ๋ค๋ฅธ ๋ฌด์๋ณด๋ค ํ๋์์ CRA์ ์ ์ฌํฉ๋๋ค.
ํฅ๋ฏธ๋ก์ด ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ํด๊ฒฐํ๋ ค๊ณ ํ๋ ๋ฌธ์ ๋ ๋ฌด์์ ๋๊น? ์ฌ๋ฌ ๊ฐ์ง ์๋ฃจ์ ๊ณต๊ฐ์ ์ฌ์ฉํ ์ ์๋ ๋ง์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. Dan์ด ๊ทธ๊ฐ ์ค๋ช ํ ๋๋ก Redux 2.0์ ๊ตฌ์ถํ๋ค๋ฉด ๋๋ ๊ทธ ์์ ๋ด ์์ ์ ์ถ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค์ ๊ตฌ์ถํ ๊ฒ์ ๋๋ค!
@jbellsey Redux๋ ์ ์ญ์ ์ผ๋ก ์ฑ์ ์์ ๊ณผ ์ํ๋ฅผ ์ ๊ณตํ๋ ๋ฐ ํ์ ํ์ง๋ง ์ ์๋ ๋ฒ์ ๋ด์์ redux ์คํ ์ด์ ๋ฌดํ ์ธ์คํด์ค๋ฅผ ๊ฐ์ง ์ ์์ง๋ง ๊ฒฐํฉํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๊ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์ฉํฉ๋๋ค. ๋น์ ์ด REDUX์ ๋ด๋ถ์ ๋ํด ์ด์ผ๊ธฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๋ฉด ํํ์ ๋๋ฆด ์ ์์ต๋๋ค ...
์ฐ๋ฆฌ๋ ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํฉ๋๊น?
์ฑ์ ์ ์ญ ์ํ ์ ๋๋ค. R eliable E sthetics D elivered U nified ์ ์ X tensible : ๋ง์ :
์๋ฌด๋ ๊ธ๋ก๋ฒ์ ์ํ์ง ์์ต๋๋ค. ํ์ง๋ง ๋๊ตฌ์๊ฒ๋ ํ๋๋ ํ์ํฉ๋๋ค :tm:
redux๋ฅผ ์ง๊ธ์ฒ๋ผ ๋จ์ํ๊ฒ ์ ์งํ์ญ์์ค. ํจํด์ ๋๋ค. ์๋ฆฌ ์ฑ ์ ํญ์ ์ฝ 100์์ ๋ํ๋ฉ๋๋ค.
@markerikson ์ด๋ฌํ ์๊ฐ์ ์ ๋ฆฌํ๊ธฐ ์ํด ๋ฌธ์/์คํ๋ ๋์ํธ๋ฅผ ์์ํ๋ ๊ฒ์ด ์ข์๊น์? ์ด๋ฏธ ๋ช ๊ฐ์ง ๋๋ผ์ด ์์ด๋์ด๊ฐ ์์๊ณ 48์๊ฐ ๋ฐ์ ์ง๋์ง ์์์ต๋๋ค ๐
์ ๋ฅผ ์ํด, ๋๋ ์ฌ๋๋ค์๊ฒ ์ฝํฌ๋ ์ฌ๊ฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ถ์ฒํ์ง ์์ต๋๋ค. ๋์ JavaScript์์ ์ข ์์ฑ ์ฃผ์ ๊ธฐ์ ์ ๋ฐฐ์ฐ์ญ์์ค.
Redux๋ ์ผ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ทจ๊ธํ๋ฉด ๋ ์ฌ์์ง๋๋ค.
์ ์๊ฒ ์์ด Redux๋ ์ ์๊ฒ ์ ๋ถ์
๋๋ค(๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ HTTP ํธ์ถ์ ํ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํ์ง ์์ ๊ฒ์
๋๋ค). I/O ๋ฐ ๋น๋๊ธฐ ์์
์ ๊ฒฝ์ฐ Redux ์ธ๋ถ์์ ์ํํฉ๋๋ค. ์ด๊ฒ์ Redux ์คํ ์ด๋ฅผ ์์ธก ๊ฐ๋ฅํ๊ฒ ์ ์งํฉ๋๋ค. ์ ํ ์๋ช
์ ํญ์ store.dispatch(actionObject)
์
๋๋ค. ๋์คํจ์น ๊ธฐ๋ฅ์ด ์๊ณ ์์
๋ด๋ถ์ ์จ๊ฒจ์ง ์๋ฏธ๊ฐ ์์ต๋๋ค(์: ์์
์ ๋์คํจ์นํ๋ฉด API ํธ์ถ์ด ์ํ๋์ง ์์).
@tannerlinsley : ๋ค,
์ด ๋ ผ์๋ฅผ ์์ํ๋ ๋์๊ฒ ํ ๊ฐ์ง ๋จ์ ์ : ๋๋ ์ด๋ฏธ ๋ด๊ฐ ์ฝ์ ๋ํ ์์ ๋ฐ ์ฐ๊ธฐ์ ํ์ํ ๋ฌผ๊ฑด์ ํค์ ๊ฐ์ง๊ณ ์๋ค. ๋๋ถ๋ถ์ ์์ฒด์ ์ผ๋ก ๋ถ๊ณผ๋์ง๋ง, ๋ด๊ฐ ์กฐ์ฌํ๊ณ ์ถ์ Redux ๊ด๋ จ ์ฃผ์ ์ค ์ผ๋ถ์ ๋ํด ์์ ํ ์๊ฐ์ด ์ถฉ๋ถํ์ง ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ํ ํด๋ค.
๋๋ ์ด๋ฌํ ๊ฐ๋ฅํ ๋ ธ๋ ฅ์ ์ ๋์ ์ผ๋ก ์ฐธ์ฌํ๊ณ ์ถ์ง๋ง ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฐธ์ฌํ๊ณ ํจ๊ป ์ผํด์ผ ํ ๊ฒ์ ๋๋ค. (๋ชจ๋ OSS ๊ด๋ฆฌ์์ ์ ๋ช ํ ๋ง์ง๋ง ๋ง... :))
Redux๋ ์ผ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ทจ๊ธํ๋ฉด ๋ ์ฌ์์ง๋๋ค.
์ด๊ฒ์ด ๋ด๊ฐ ์ถ์ฒํ๋ ๊ฒ์ ๋๋ค!
reselect
๊ฐ ํ์ํ์ง ์์ต๋๋ค. ๊ณ ๋ คํ๋ค.componentDidMount
ํํฌ๊ฐ ์์ผ๋ฉด ์ด๋ ต์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด๊ฒ์ ๊ณ์ธต ๊ตฌ์กฐ์์ ์๋ก ์ด๋ํ๋ ๊ฒ์ด ํญ์ ์ฌ์ด ๊ฒ์ ์๋๋๋ค.FWIW, ์ ๋ Redux๋ฅผ D3.js (React ์์ด)์ ํจ๊ป ์ฌ์ฉํด ์์ผ๋ฉฐ ๊ฝค ์ ์งํ๋๊ณ ์์ต๋๋ค. ์ด์ ๋ํ ๋ช ๊ฐ์ง ์๊ฐ d3-component ์ ๋์ด๋์ด ์์ต๋๋ค.
React Redux ๋ฐ์ธ๋ฉ์์ ๊ฐ์ฅ ๊ทธ๋ฆฌ์ด ๊ฒ์ connect
์
๋๋ค. @gaearon ์ ์ ๊ฐ์/๋น์ ์์ ๋ด๊ฐ ๊ฐ์ฅ ๊ด์ฌ์ mapStateToProps
๊ตฌํ ์ ๊ณต"์
๋๋ค.
๋ณด๊ธฐ์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ ์ ์์ต๋๋ค. ์ ์ฉ ๊ฐ์๊ธฐ๋ก ์ด ์์ ์ ์ํํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ค์ ์ ํํ ํ์๊ฐ ์์ต๋๋ค. ๊ณ ๋ คํ๋ค.
์, ์ด๊ฒ์ ํธ์ํฐ๊ฐ ์์ ์์ ํ๋ ์ผ์
๋๋ค. ์ ์ด๋ ์ ์๊ฐ์๋ ๊ทธ๋ ๊ฒ ์๊ฐํฉ๋๋ค. ๋ฐ์ดํฐ ๋งต์ ๋ํ ์ผ๋ฐ ID์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ธฐ๋ณธ ํผ๋์ธ timeline
๋ณด๊ธฐ๋ฅผ ํฌํจํ๋ entities
๋ถ๊ธฐ๊ฐ ์์ต๋๋ค. ์ํฐํฐ ๋ธ๋์น์ ๋ํ id ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ์ง๋ง ์ด๋ฏธ ๋ฏธ๋ฆฌ ๊ณ์ฐ๋ ๊ฒ์ ํ์ธํ์ญ์์ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋งค์ฐ ๋์ ์ธ ๋ชฉ๋ก์ ๋ค์ ์ ํํ๋ ๊ฒ์ด ... ๋๋ฌด ์ฑ๋ฅ์ด ์ข์ง ์๊ธฐ ๋๋ฌธ์ ๋ค๊ฐ์ค๋ ๋ฆฌํฉํฐ๋ง์์ ๋ด๊ฐ ์ํ๋ ๊ฒ์ ๋๋ค.) ๋ด๊ฐ ๋ณผ ์์๋ ์ ์ผํ ๋จ์ ์ ๋ฐ์ดํฐ๊ฐ ์ค๋ณต๋๊ณ ๋ทฐ์ ๋ํ ์ ๋ฐ์ดํธ ๋ฐ ์ญ์ ๋ฅผ ์กฐ์ํ๋ ๊ฒ์ ๋๋ค. ์ฝ 2๊ฐ์(๋๋ ๊ทธ ์ด์)๋ฅผ ์์ฃผ ๊ธฐ์ตํด์ผ ํ๋ฏ๋ก ์ฅ๊ธฐ์ ์ผ๋ก ์๋นํ ๋ฒ๊ฑฐ๋กญ์ต๋๋ค.
@stefensuhat ์ค์ค๋ก Redux๋ฅผ ๊ตฌํํ๋ ค๊ณ ํ ๋ Promise ๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์์ ์ ๊ฐ๋ฅํ๊ฒ ํ์ต๋๋ค. https://github.com/iddan/delux ์์ ํ์ธํ ์ ์์ต๋๋ค.
@gaearon ๋ ์ ๋ชฉ๋ก์ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค! ์ฐ๋ฆฌ๋ ๋ด๊ฐ ์ผํ๊ณ ์๋ ์กฐ์ง์์ ๋ชฉ๋ก์ 90%๋ฅผ ๋ฐ๋ฅด๋ redux ์์ฉ๊ตฌ๋ฅผ ์์ ํ๊ณ ์์ต๋๋ค(๋ํ ducks principes๋ฅผ ๋ฐ๋ฆ). ํ์ฌ๋ก์๋ ์ถ์ ์ค๋น๊ฐ ๋์ง ์์ ์ด๊ธฐ ๋ฆด๋ฆฌ์ค์ ๋๋ค.
์ด ์ข์ ์์ด๋์ด์ ๊ธฐ์ฌํ๊ณ ์ถ์ต๋๋ค!
@markerikson @tannerlinsley
์ด๋ฌํ ์์ด๋์ด๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ ์คํ๋ ๋์ํธ๋ฅผ ๋ง๋ ํ ํด๋น ์ ์ฅ์์ Github ์ด์๋ฅผ ์์ฑํ์ฌ ๊ฐ๋ฐ์ ์ถ์ ํ ๊ฒ์ ์ ์ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํด๋น ๋ฌธ์ ๋ชฉ๋ก๊ณผ ํจ๊ป ์ฌ๊ธฐ์ ๋๊ธ์ ๋ฌ์์ผ ํฉ๋๋ค.
์ด๊ฒ์ ํน์ ํญ๋ชฉ์ด redux์ ํจ๊ป ์ ๊ณต๋๋ค๋ ๋ณด์ฅ์ ์์ง๋ง ํน์ ํญ๋ชฉ์ ๊ด์ฌ์ด ์๋ ์ฌ๋๋ค์๊ฒ ํ ๋ก ์ ๋ฐ๋ฅด๊ณ ์ด๋ฅผ ์คํํ๊ธฐ ์ํด ํจ๊ป ์์ ํ ์ ์๋ ๊ธฐํ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ด๋ฌํ ์ ์์ ํ์ค๋ก ๋ง๋๋ ๋ถ๋ด์ ๊ฐ๊ฐ์ ์๋ก์ด ๊ธฐ๋ฅ์ด๋ ์ ๊ทผ ๋ฐฉ์์ ๊ด์ฌ์ด ์๋ ์ฐ๋ฆฌ ๋ชจ๋์๊ฒ ์์ต๋๋ค. Mark๊ฐ ํ ๋ก ์ ์์ํ์ง๋ง ์๋ฌด๋ ๊ทธ๊ฐ ๊ฐ์ ๋ชจ๋ ๊ฒ์ ๊ตฌํํ๊ธฐ๋ฅผ ๊ธฐ๋ํ์ง ์์ ๊ฒ์ ๋๋ค. :)
๋ค, @gaearon ์ ๋ชฉ๋ก์ ์ด์์ ์ด์ง๋ง ์ด๋ฏธ ์ผ๋ถ ์ฌ๋๋ค์ด ์ธ๊ธํ๋ฏ์ด ๊ทธ๊ฒ์ ๋ง์ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ๋๋ฐ๋ก ๋ค๋ฃจ๋ ค๊ณ ํ๋ ์ฌ๋์ ๋๊ตฌ๋ ๋ง๊ฐ์ ๋ฐ์ดํฌ ์ ฐ๋ฉ์ ์ง๋ฉดํ๊ฒ ๋ ๊ฒ์ ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๊ด๊ณ์์ด ์ผ์ด๋๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ง๋ง ๋งจ ์์ ์ ์ฒด ๋ ์ด์ด๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ๋ณด๋ค ์์ ์กฐ๊ฐ์ ํ ๋ฒ์ ๊ณต๊ฒฉํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค (๋ค์ ๋ฏธ๋ฆฌ ๊ตฌ์ฑ๋ ์คํํฐ ์คํ ์ด์ ์๋ฅผ ๋ฐ์ด ๋ฃ์ต๋๋ค ;))
์ฆ, ๋๊ตฐ๊ฐ๊ฐ ์ ์ฒด ๋ชฉ๋ก์ ๊ณต๊ฒฉํ๋ ค๊ณ ํ ๋ Redux ์ธ๋ถ, ์ฌ์ง์ด React ์ธ๋ถ์ ์กด์ฌํ๋ ๋ค๋ฅธ ๋๊ตฌ์ ํ๋ ์์ํฌ๋ ์ผ๋์ ๋์ญ์์ค. React/Redux๋ Vanilla Flux, MobX, VueJS ๋ฐ Angular๋ณด๋ค ์ํ๊ณ์ ๋ํ ํฅ๋ฏธ๋ก์ด ์ด์ ์ด ์์ต๋๋ค. ์ปค๋ฎค๋ํฐ๊ฐ ๋ฌด์์ ํ๋ , ์๋ง๋ ์ด๋ฌํ ์ด์ ์ค ์ผ๋ถ(์ผ๋ถ๋ @gaearon ๋ชฉ๋ก์ ์ผ๋ถ์)์ ๊ณ์ ์ด์ ์ ๋ง์ถ๊ณ , ๋งจ ์์ ๊ตฌ์ถ๋๋ ๋ ์ด์ด๊ฐ ์์ ํ ์ค๋ณต๋์ง ์๋๋ก ํ๊ธฐ๋ฅผ
๋ด๊ฐ ๋ง๋ค๊ณ ์๋ ์: ์๋์ผ๋ก ์์ฑ๋ ๊ฐ์๊ธฐ๋ฅผ ์๋์ผ๋ก ์ ๋ฐ์ดํธํ๋ ํจ์๋ฅผ ๋ง๋ค ์ ์๋ ๋ชจ๋์ ๋ง๋๋ ๊ฒ์ ์ ํน์ ์ผ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ผ๋จ ๊ทธ๋ ๊ฒ ํ๋ฉด MobX๋ฅผ ๋ณต์ ํ๋ฏ๋ก ๊ทธ๋ค์ง ์ ์ฉํ์ง ์์ต๋๋ค.
@Phoenixmatrix ์ ๋ด ๋ง์ redux์ ๊ธฐ๋ณธ ๋ฏธ๋ค์จ์ด๊ฐ ์์ผ๋ฏ๋ก ์ธ๋ถ ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค. ๐
๋๋ Redux์ ํ์ฌ ๊ตฌํ์ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์์ฉ๊ตฌ๋ ์กด์ฌํ์ง๋ง ์ ํ ์์คํ ์ด ์๋ ๊ฒฝ์ฐ์๋ ์ค์ ๋ก ํฐ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.
๋์๊ฒ ํ ๊ฐ์ง ์ค์ํ ๋ฌธ์ ๋ ์ฌ๋๋ค์ด ๋ช ๋ ์ ๋ณด๋ค ํจ์ฌ ๋ ๋ณต์กํ ํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ณ ์๋ค๋ ์ฌ์ค์ ์ดํดํ์ง ๋ชปํ๋ ๊ฒ ๊ฐ๋ค๋ ๊ฒ์ ๋๋ค. ๋๊ท๋ชจ ํ๊ณผ ํจ๊ป ๋ ํฌ๊ณ ๋ ๋ณต์กํ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ตฌ์ถํ๋ ๊ฒฝ์ฐ ์ด๋ ค์์ด ํฌ๊ฒ ์ฆ๊ฐํ๊ณ ์๋ก์ด ํจํด์ด ๋ฑ์ฅํ์ง๋ง ์ฌ๋๋ค์ด ๊ทธ ์ด๋ ค์์ ๊ฑฐ๋ถํ๋ ๊ฒ์ด ์ ๊ฒ๋ ์ ์์ ๋๋ค.
๋๋ ์ฐ๋ฆฌ๊ฐ ์ผ์ ๋ ๋จ์ํ๊ฒ ๋ง๋ค๊ฑฐ๋ ์์ฉ๊ตฌ๋ฅผ ์ค์ด๋ ค๊ณ ํด์๋ ์ ๋๋ค๋ ๋ง์ ํ๋ ๊ฒ์ด ์๋๋ผ ์ฌ๋๋ค์ด Redux๋ฅผ ์ฌ์ฉํ๊ธฐ ์์ํด์๋ ์ ๋๋ฉฐ ์์ถฉ ๊ด๊ณ๋ฅผ ์ดํดํ๊ณ ํฐ ๊ทธ๋ฆผ์ ๋ณด์ง ์๊ณ ๊ด๋ จ๋ ์์ฉ๊ตฌ์ ๋ํด ๋ถํํด์๋ ์ ๋๋ค๊ณ ๋งํ๋ ๊ฒ์ด ์๋๋๋ค.
Redux๊ฐ ๋ง๋ค์ด์ก์ ๋ ๋ง์ ์ฌ๋๋ค(์ ํฌํจ)์ด ๊ทธ๊ฒ์ ๊ตฌ์ถํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ @gaearon ์ ์ต๊ณ ์ ๊ตฌํ์ ์ป์๊ณ ํด๋ง/๋ฐ๋ชจ์์ ์์ฃผ ์ข์ ์์ ์ ํ์ต๋๋ค. ๊ทธ๊ฒ์ ์๊ฐ ์ฌํ๋ฟ๋ง ์๋๋ผ ๋ง์ ์ฌ๋๋ค์๊ฒ ์๋กญ์ง ์๊ณ ์ฆ์ ์์ฐ์ค๋ฌ์์ง๋ ๊ฐ๋ ๋๋ฌธ์ ์ฒ์์ ๋ง์ ๊ด์ฌ์ ๋ฐ์์ต๋๋ค.
์ฌ๋๋ค์ Redux๋ฅผ ๋ฐ์ง์ด๋ ์ ์ฅ๋๊ฐ์ผ๋ก ๋ด ๋๋ค(์ค์ ๋ก๋ ๊ทธ๋ ๊ฒ ์ฝ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค). ๊ทธ๋ฌ๋ ๋๊ตฐ๊ฐ๊ฐ ์ด๋ฌํ ๊ฐ๋ ์ ์ฐ์ํ ๋ฐฉ์์ผ๋ก ํ๋ก ํธ์๋์ ์ด์ํ๋ค๋ ์ฌ์ค์ ์ ์ธํ๊ณ Redux์์ ์ค์ ๋ก ์๋ก์ด ๊ฒ์ ์์ต๋๋ค. Redux์ ๊ทธ ์ํ๊ณ์ ํจํด์ ์ด๋ฏธ ๋ถ์ฐ ์์คํ , ์ด๋ฒคํธ ์์ค ๋ฐฑ์๋ ์ ํ๋ฆฌ์ผ์ด์ , ๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ์ ์ฌ์ฉ๋๊ณ ์์ผ๋ฉฐ ์ด์ ๋ํ ๋ฐฐ๊ฒฝ ์ง์์ด ์๋ ์ฌ๋๋ค์ Redux๋ฅผ ๋งค์ฐ ์ฝ๊ฒ ์ดํดํ ๊ฒ์ ๋๋ค.
๋ถํํ๋ ์ฌ๋๋ค์ ๊ด๋ จ๋ ๋ณด๋ค ์ผ๋ฐ์ ์ธ ํจํด์ ๋ํด ์ ํ ์์ง ๋ชปํ ์ฑ ๋จ๊ณ๋ฅผ ๊ฑด๋๋ฐ๊ณ Redux๋ฅผ ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ์ ๋ ๋ถ์ฐ ์์คํ ์ ๋ํ ์ต์ํ์ ๋ฐฐ๊ฒฝ ์ง์์ ๊ฐ์ถ๊ธฐ ์ํด Redux์์ ์ง์งํ ๊ฒ์ ๊ตฌ์ถํ๊ณ ์ ํ๋ ์ฌ๋์ ์ถ์ฒํฉ๋๋ค. ์ด์ํ๊ฒ ๋ณด์ผ ์ ์์ง๋ง ๊ทธ๋ฐ ์ข ๋ฅ์ ๋ฐฐ๊ฒฝ์ ๊ฐ์ง๊ณ ์์ผ๋ฉด ํ์ฌ์ ์์ผ๋ก ๋ช ๋ ๋์ ๋งค์ฐ ์ค์ํ ์ด์ ์ ์ป์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ๋ ์ ํํ ๋ฌด์์ ๊ตฌ์ถํ๊ณ ์์ต๋๊น?
๊ทธ๋์ ์ฐ๋ฆฌ๋ ๋งค์ฐ ๋ณต์กํ ๊ฒ์ ๋ง๋ค๋ ค๊ณ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ๋ฐ์๋ณด๋ค ์ฒ๋ฆฌํ๊ธฐ ๋ ์ด๋ ค์ด ์ ์ฝ ์กฐ๊ฑด์ ๊ฐ์ง๊ณ ์์ง๋ง ์๋ ๋์ ์ด๋ฌํ ๋ฌธ์ ์ ๋ํด ์ ๋ง๋ก ์ด์ฌํ ์๊ฐํ ์ฌ๋๋ค์ ์ด์ ์ง์์ ์ฌ์ฌ์ฉํ์ง ์๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ๊ฐ๋จํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ์ฌ๋๋ค์ด ์ด๋ฏธ DB ๋ด๋ถ์ ์ํ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์๊ฐํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๊น? ๊ทธ๊ฒ์ ์ฟผ๋ฆฌํ๋ ๋ฐฉ๋ฒ?
๋๋ ์ฐ๋ฆฌ๊ฐ ์ค๋๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ค์ฉํํ๊ณ ํ์ฌ ์ง์์ผ๋ก ์ค์๋ฅผ ํด์๋ ์ ๋๋ค๊ณ ๋งํ๋ ๊ฒ์ด ์๋๋ผ, ์ฐ๋ฆฌ๊ฐ ๊ตฌ์ถํ๊ณ ์๋ ๊ฒ์ด ๋ ์ด์ ๋จ์ํ์ง ์๊ณ ์ถ๊ฐ ์ง์์ด ํ์ํ๋ค๋ ๊ฒ์ ์ดํดํ๊ณ ์ธ์ ํด์ผ ํฉ๋๋ค. Redux๋ ์ด๋ฌํ ์ง์์ ์ป๋ ์ข์ ๋ฐฉ๋ฒ์ผ ์ ์์ผ๋ฉฐ ์ฒ์์๋ ์ค์ฉ์ ์ธ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์์ง๋ง ์์ผ๋ก ๋ช ๋ ๋์ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ด ์ผ๋ง๋ ๋น์ ์ ๋ถํธํ๊ฒ ๋ง๋ค์ง ๊ณผ์ํ๊ฐํ์ง ๋ง์ญ์์ค.
๋ถํํ๋ ์ฌ๋๋ค์ ๊ด๋ จ๋ ๋ณด๋ค ์ผ๋ฐ์ ์ธ ํจํด์ ๋ํด ์ ํ ์์ง ๋ชปํ ์ฑ ๋จ๊ณ๋ฅผ ๊ฑด๋๋ฐ๊ณ Redux๋ฅผ ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํฉ๋๋ค.
์ข๋ ๋์๋ Redux๋ ๋ณธ์ง์ ์ผ๋ก React ์ํ ๊ด๋ฆฌ ์ ์์์ ์น๋ฆฌํ์ต๋๋ค. ์ด๋ฅผ ํตํด ์ํ๊ณ๋ฅผ ํ์ฑํ ์ ์๋ ๋ฅ๋ ฅ์ด ์๊น๋๋ค. ์๋ํ๋ ๋ฌด์ธ๊ฐ๋ฅผ ์ํ๋ ๊ฐ๋ฐ์๋ ํญ์ ์์ ๊ฒ์ด๋ฉฐ, ์ด๊ฒ๋ง ์์ผ๋ฉด ๋๋ ๋ ๊ฐ๋จํ ์์ฉ ํ๋ก๊ทธ๋จ์ด ๋ง์ด ์์ต๋๋ค. ์ฌ๋๋ค์ ๊ณ์ํด์ ๋ค๋ฅธ ์ถ์ํ ๊ณ์ธต์ ์ฌ์ฉํ๊ฑฐ๋ ๊ฐ๋จํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ์ฌ๋ฐ๋ฅธ ์ผ๋ฐ ํจํด์ ์๊ฐ๋ฐ์ ์ ์์ต๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ ๋ ๋ถ์ฐ ์์คํ ์ ๋ํ ์ต์ํ์ ๋ฐฐ๊ฒฝ ์ง์์ ๊ฐ์ถ๊ธฐ ์ํด Redux์์ ์ง์งํ ๊ฒ์ ๊ตฌ์ถํ๊ณ ์ ํ๋ ์ฌ๋์ ์ถ์ฒํฉ๋๋ค. ์ด์ํ๊ฒ ๋ณด์ผ ์ ์์ง๋ง ๊ทธ๋ฐ ์ข ๋ฅ์ ๋ฐฐ๊ฒฝ์ ๊ฐ์ง๊ณ ์์ผ๋ฉด ํ์ฌ์ ์์ผ๋ก ๋ช ๋ ๋์ ๋งค์ฐ ์ค์ํ ์ด์ ์ ์ป์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ด ๋ฌธ์ ์ ํต์ฌ์ ๋๋ค. Redux as is๋ ๊ทธ๊ฒ์ ์ดํดํ๋ ์ฌ๋๋ค์๊ฒ ํ๋ฅญํ๊ฒ ์๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋จ์ํํ๋ ๊ฒ์ด ๋ฐ๋์ ๋์ ๊ฒ์ ์๋๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ดํดํ๋ฉด ๋ ๋์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ๋์์ด ๋์ง๋ง ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ๋ ์ด์ ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ฅผ ์์ฑํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ด ์์ํ๋ ๊ณณ์ด ์๋๋๋ค.
์ฃผ์์ ์ข์ ์๊ฒฌ์ด ๋ ๋ง์ต๋๋ค. ์ฌ๊ธฐ์๋ ์ฐ๋ฆฌ๊ฐ ๋ ํ๊ตฌํ ์ ์๊ณ ๋ ํ๊ตฌํด์ผ ํ๋ ์์ด๋์ด๊ฐ ๋ง์ด ์์ต๋๋ค.
์ ์ฌ์ ์ผ๋ก ์คํ ๊ฐ๋ฅํ ๋ช ๊ฐ์ง ์์ด๋์ด๋ฅผ ์๊ฐํด ๋ผ ์ ์๋์ง ๋ด ์๋ค. ์์ ๊ธฐ๋ณธ ๊ฐ๋ ์ ๋์ ธ์ ์์ํ๊ฒ ์ต๋๋ค.
redux-starter
๊ฐ์ ์ ํจํค์ง๋ฅผ ๋ง๋ญ๋๋ค. ํด๋น ํจํค์ง๋ redux-actions
, redux-thunk
๋ฐ redux-logger
, ๊ทธ๋ฆฌ๊ณ ์๋ง๋ ์ฝ์ ๊ธฐ๋ฐ ๋ฏธ๋ค์จ์ด์ ์์กดํ ์ ์์ต๋๋ค. function createReduxStore({reducers, middleware}) {}
์๊ทธ๋์ฒ๊ฐ ์๋ ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค( ์ด์ @Phoenixmatrix ์ ์ค๋ช
์ ๊ธฐ๋ฐ์ผ๋ก
createReduxStore()
ํจ์๋ applyMiddleware
๋ฐ ๋ฃจํธ ๋ฆฌ๋์์ ๋ํ ํซ ๋ฆฌ๋ก๋ฉ ์ค์ , Redux DevTools ํ์ฅ ๊ตฌ์ฑ์ ์ฒ๋ฆฌํฉ๋๋ค. ๋ฏธ๋ค์จ์ด๊ฐ ์ ๊ณต๋์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ํฌํจ๋ ๋ฏธ๋ค์จ์ด๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. ์ด๊ฒ์ ember-redux
์ ์์ ์๋น์ค ์ค์ ์ฝ๋ ๋๋ ๋ด "Project Mini-Mek" ์ํ ์ฑ ์ ์์ต๋๋ค .
์ด๋ ๊ฒ ํ๋ฉด ์์ํ๋ ๋ฐ ํ์ํ ์ค์ ์ ์์ ์ต์ํ ์ต์ํํ๊ณ ์ ๋นํ ์์ค์ ์ ์ฉํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
๋ค, ์ ๋ ๊ทธ๊ฒ์ ์ข์ํฉ๋๋ค. (๊ธ์์, ์๋ก์ด ์ฌ์ฉ์๋ฅผ ์ํ redux-actions ๋ฐ promise ๊ธฐ๋ฐ ๋ฏธ๋ค์จ์ด๋ ์ข์ํ์ง ์์ง๋ง, ๋๋ ๋น์ ์ด ๊ทธ๊ฒ์ ๋ํด bikeshedding์ ์ฆ๊ธฐ๊ฒ ํ ๊ฒ์ ๋๋ค). ๋ฏธ๋ค์จ์ด ์๋ฝ์ ๊ท์ฐฎ๊ฒํ์ง ์๊ณ createStarterStore(reducer)๋ง ํ๋ฉด ๋ฉ๋๋ค.
CombineReducer๋ฅผ ๋์ฒดํ ์๋ ์์ผ๋ฏ๋ก ๊ฐ๋จํ ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
const store = createStarterStore({
foo,
bar,
baz
});
foo bar baz๋ ๊ฐ์๊ธฐ์ ๋๋ค.
๋๋ํธ. "๋ฃจํธ ๋ฆฌ๋์์ ๋ํ HMR์ ์ค์ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ฅ"์ด ์๋ง๋ ์๋ํ์ง ์์ ๊ฒ์ด๋ผ๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. ์๋ํ๋ฉด ์ฌ์ฉ์๊ฐ ๋ฃจํธ ๋ฆฌ๋์ ํ์ผ์ ๋ํ ๊ฒฝ๋ก๋ฅผ ์ ๋ฌํ๋๋ก ํ์ฉํ๋๋ผ๋ module.hot.accept()
API ๋ฐ require(path)
๋ค์ ๊ฐ์ ธ์ค๊ธฐ ๋จ๊ณ๋ ๋ณ์๊ฐ ์๋ ๋น๋ ์ ์ ์ ์ผ๋ก ๋ถ์ ๊ฐ๋ฅํ ๊ฒฝ๋ก๋ฅผ ์ํฉ๋๋ค. (์ ์๊ฐ์๋... ์ ๊ฐ ํ๋ฆด ์๋ ์์ต๋๋ค.) ์, ๊ธ์์.
ํ์ง๋ง createStarterStore()
๋ ๋ฃจํธ ๋ฆฌ๋์๋ ์ฌ๋ผ์ด์ค ๊ฐ์ฒด๋ฅผ ๋ฐ์๋ค์ผ ์ ์์ต๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ ๋ ๋ถ์ฐ ์์คํ ์ ๋ํ ์ต์ํ์ ๋ฐฐ๊ฒฝ ์ง์์ ๊ฐ์ถ๊ธฐ ์ํด Redux์์ ์ง์งํ ๊ฒ์ ๊ตฌ์ถํ๊ณ ์ ํ๋ ์ฌ๋์ ์ถ์ฒํฉ๋๋ค. ์ด์ํ๊ฒ ๋ณด์ผ ์ ์์ง๋ง ๊ทธ๋ฐ ์ข ๋ฅ์ ๋ฐฐ๊ฒฝ์ ๊ฐ์ง๊ณ ์์ผ๋ฉด ํ์ฌ์ ์์ผ๋ก ๋ช ๋ ๋์ ๋งค์ฐ ์ค์ํ ์ด์ ์ ์ป์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@slorber ๊ทธ ๋ถ๋ถ์ ๋ํด์๋ ๋์ํฉ๋๋ค.
๋ถํํ๋ ์ฌ๋๋ค์ ๊ด๋ จ๋ ๋ณด๋ค ์ผ๋ฐ์ ์ธ ํจํด์ ๋ํด ์ ํ ์์ง ๋ชปํ ์ฑ ๋จ๊ณ๋ฅผ ๊ฑด๋๋ฐ๊ณ Redux๋ฅผ ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ค์ ๋ก๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ์ด๋ค ์ฌ๋๋ค์ Redux์ ๊ด๋ จ๋ ํจํด์ ๋ํด ์๊ณ ์์ผ๋ฉฐ ์ด๊ฒ์ด ๋ฐ๋ก ๊ทธ๋ค์ด Redux๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ์ ํํ ์ด์ ์ ๋๋ค. ๋จ์ํ(๋๋ ์ต์ํ ๋ ๊ฐ๋จํ) ๊ฒ์ ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํ๋ค๊ณ ํด์ ๋ฐ๋์ ์ฌ์ฉ์๊ฐ ๋ ์ด๋ ค์ด ๊ตฌํ์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ์ง๋ ์์ต๋๋ค. ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ ์ ์ฝํ ๋ฟ์ ๋๋ค.
๋ด๊ฐ ์ผํ๋ ๊ณณ์์ ์ฐ๋ฆฌ๋ Redux๋ฅผ 1๋
๋์ ์ฌ์ฉํ๊ณ , ์คํ ์ด์ ์๋ก์ด ๋ฆฌ์์ค๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด ๋์ผํ ์ฝ๋๋ฅผ ๋ณต์ฌ/๋ถ์ฌ๋ฃ๊ธฐ(์ฝ๊ฐ ์์ )ํ์ต๋๋ค. ๊ทธ๋์ ์ด๋ ์์ ์์ ์ฐ๋ฆฌ๋ ๋๊ผ์ต๋๋ค. ์ด ์ค๋ณต๋ ์์ฉ๊ตฌ๋ฅผ ์ถ์ํํ๊ธฐ ์ํด Redux ์์ ๋ ์ด์ด๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค.
์ ์๊ฐ์ ์ด ์์ด๋์ด๋ Redux ์ฌ์ฉ์ ๋จ์ํํ๋ ๊ฒ๋ฟ๋ง ์๋๋ผ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ถ๋ถ์ ๋ํ ์์ฉ๊ตฌ๋ฅผ ์ค์ด๋ ๊ฒ์
๋๋ค(๊ฐ์ ๋ฐฉ์์ผ๋ก react-redux
๋ Redux๋ฅผ React์ ํจ๊ป ์ฌ์ฉํ ๋ ์์ฉ๊ตฌ๋ฅผ ์ค์
๋๋ค).
๋งค์ฐ ํฅ๋ฏธ๋ก์ด ํ ๋ก ์ ๋๋ค. ์ด์ฐฝ๊ธฐ๋ถํฐ redux ์ฌ์ฉ์๋ก์ ๋ ์ผํธ:
๋ด๊ฐ ๊ธฐ์ตํ๋ ๊ฒ์ฒ๋ผ ์ฒ์์๋ redux๋ฅผ ์ฑ์ ๋น๋ํ๊ธฐ ์ํ ํ๋ ์์ํฌ๋ผ๊ธฐ๋ณด๋ค ํ๋กํ ์ฝ์ด๋ ํฉ๋ฆฌ์ ์ธ ๊ท์น์ ์งํฉ์ผ๋ก ์ฌ๊ฒผ์ต๋๋ค. ์ด๋ฌํ ์๊ฒฉํจ์ redux๊ฐ ์๋ก์ด ์ฌ๋๋ค์๊ฒ ์๋์ ์ด๊ณ ์์ ์ ์ถ์ํ๋ฅผ ๋กค๋งํ์ง ์๊ณ ํ์ฅํ๋ ๋ฐ ์ง๋ฃจํ ์ ์๋ ์ด์ ์ค ์ผ๋ถ์ ๋๋ค. ๊ทธ๋ฌ๋ 2015๋ ์ ์ํ ๊ด๋ฆฌ์ ํผ๋์ ๋ซ๊ณ ๋์จ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ๊ทธ๊ฒ์ด ์์๋ ์ด์ ์ด๊ธฐ๋ ํฉ๋๋ค. ๋ฏธ๋๋ฉ๋ฆฌ์ฆ ๋๋ถ์ Apollo์ ๊ฐ์ ๋๋ผ์ด ํ๋ ์์ํฌ๊ฐ ๋ค๋ฅธ ํ๋ก์ ํธ(ํนํ ๊ฐ๋ฐ ๋๊ตฌ)์์ ์ํํ ์์ ์ ํธ์นํ๊ณ ์น์ํ ๋ฐฉ์์ ์ ๊ณตํ ์ ์์์ต๋๋ค. ํ์ํ ๋ ์ํ ๊ด๋ฆฌ์์ "๋ฎ์ ์์ค์ผ๋ก ๋จ์ด๋จ๋ฆฌ๊ธฐ".
"๋ฎ์ ์์ค" ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ redux๋ ํฐ ์ฑ๊ณต์ ๊ฑฐ๋๊ณ ์ฑ์ ๋น๋ํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ด ํ๋ถํ ํ๋ ์์ํฌ๋ก์๋ ์์ง ์ถฉ๋ถํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฃผ์ํด์ผ ํ ํ ๊ฐ์ง๋ redux๊ฐ ๋ฐ์ ํจ์ ๋ฐ๋ผ Apollo์ ๊ฐ์ ํ๋ก์ ํธ์ ์ฐ์ ํ์ค "ํ๋กํ ์ฝ"๋ก์์ ์ญํ ์ ์์์ํค์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค.
์ด๋ฅผ ์ํด ํ์ฌ redux๋ redux-core
์ ๊ฐ์ ํจํค์ง๊ฐ ๋ ์ ์์ผ๋ฉฐ redux
์์ฒด๊ฐ ์ถ์ํ ์์ค์ ๋์ฌ ๊ถ์ฅ๋๋ ์ฑ ๋น๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ๋ฌผ๋ก redux-core๋ฅผ ์ฌ์ฉํ์ฌ ์ด redux
(Apollo ๋๋ saga๋ฅผ ์ฌ์ฉํ๋ ๊ฒ)์ ๋ํ ๋ ๋์ ์์ค์ ๋์์ด ์ผ๋ง๋ ์ง ์์ ์ ์์ต๋๋ค.
์ค๋ช ๊ณผ ๊ฐ์กฐ๋ฅผ ์ํด ๋ค์ ์ธ๊ธ:
์ด ์ค๋ ๋์ ์์
์๋ ๊ธฐ์กด Redux ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ํฌํจ๋์ง ์์ต๋๋ค. :) ๋ฌธ์ ์์ ์ด ์์ ํ ๊ฐ๋ฅํ๊ณ ์ฝ๊ฐ์ ์กฐ์ ์ด ์์ ์ ์์ง๋ง ๊ธฐ์กด redux
ํจํค์ง๋ ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค.
๋ด๊ฐ ๋ฐฉ๊ธ ์ค๋ช
ํ redux-starter
ํจํค์ง ๋๋ Dan์ด ์ค๋ช
ํ "ํ๋ ์์ํฌ" ์ ๊ทผ ๋ฐฉ์๊ณผ ๊ฐ์ ๊ฒ์ redux
์ ์์กดํ๋ ์ ํจํค์ง๊ฐ ๋ ๊ฒ์
๋๋ค.
@markerikson์ด ์ ์ํ ๊ฒ๊ณผ ๊ฐ์ ํจํค์ง๋ฅผ ๋ง๋๋ ๋ฐ ํฌํํฉ๋๋ค. ์ฝ๋๋ฒ ์ด์ค๊ฐ ์์ผ๋ฉด API, ์ฝ๋ ์ค๋ํซ ๋ฐ ๋ณด๋ค ์ฌ์ธต์ ์ธ ์์ด๋์ด์ ๋ํด ๋ ผ์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ํน์ ๊ธฐ๋ฅ์ ๋ํ ๋ฌธ์ ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
Delux๋ฅผ ์คํํฐ(jk)๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
@tannerlinsley ์ Jumpstate(ํ์ฌ๋ ์ ์ง ๊ด๋ฆฌ ์ค ํ๋)๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ ์ฌ์ฉ์๋ก์ ์ ๋ ์ด ์ ์ ๋ํด ๋งค์ฐ ๊ธฐ์ฉ๋๋ค. ๋ด๊ฐ Jumpstate๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ @gaearon ์ ์๋ ๊ฒ์๋ฌผ์ ๋งค์ฐ ๊ฐ๋ตํ๊ฒ ์ค๋ช ๋์ด ์์ต๋๋ค. ์ฆ, ์์ ํ ์๋ฃจ์ ์ด ์๋๋๋ค(์๋ํ ์ ์ด ์์). ์ค๋ ์์นจ์ ์ด๊ฒ ์ธ์ ์ถ๊ฐํ ์ ์๋ ๋ช ๊ฐ์ง ์ฌํญ์ ์๊ฐํ๋ค๊ฐ ์ด ์ค๋ ๋๋ฅผ ๋ฐ๊ฒฌํ๊ณ ์ฌ๋ฌ๋ถ์ด ์ด๋ฏธ ๊ทธ๊ฒ์ ๋ํด ์๊ฐํ๊ณ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค.
์ฅํฉํ ๋งํฌ: ๋๋จํด ๋ณด์ด๋ค์. ์ ๊ฐ ์ฐธ์ฌํ๊ณ ์์ต๋๋ค. ์ ๊ฐ ์ผ๋ง๋งํผ ๊ธฐ์ฌํ ์ ์์์ง๋ ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง(๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค) ๋น์ ์๊ฒ๋ ํ์คํ ์น์ด๋ฆฌ๋๊ฐ ์์ต๋๋ค.
์ ๋ Jumpstate๋ฅผ ์ฌ์ฉํ์ฌ Redux๋ฅผ ์ฌ๋ฌ ๋ฒ ๊ฐ๋ฅด์ณค์ผ๋ฉฐ ํ์ต ๊ณก์ ์ ์๋นํ ๋จ์ถํ๋ค๊ณ ์์ ์๊ฒ ๋งํ ์ ์์ต๋๋ค. HTTP์ ๊ฐ์ Redux์ fetch์ ๊ฐ์ Jumpstate๋ฅผ ์๊ฐํฉ๋๋ค. ์ ๋ Redux๋ฅผ ์ฌ๋ํ๊ณ Redux๋ฅผ ์ฌ์ฉํ์ฌ (์ฐ์ค๊ฝ์ค๋ฌ์ธ ์ ๋๋ก) ๋ณต์กํ ๋ด์ฉ์ ์์ฑํ์ง๋ง, 90%์ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ ๊ฒ์ ๊ฐ๋ฅด์น๊ธฐ์ ์ถฉ๋ถํ๋ค๋ ๊ฒ๋ ์๋๋ค.
๋น์ ์ด ๊ทธ๊ฒ์ ๋ํด ์๊ฐํ ๋ ์ด๊ฒ์ ์ข์ ๊ณณ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ๋ก ํธ์๋ ๊ฐ๋ฐ ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ํ ํต์ฌ ๋ถ๋ง ์ค ํ๋๋ "ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ถ์กฑ"์ ๋๋ค. ๋ฌธ์ ๋ ์ด๊ฒ์ ๋ธ๋ผ์ฐ์ ์์ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ์ ์๋ ๋งค์ฐ ์๋ก์ด ๊ฒ (TM) ์ด๋ผ๋ ๊ฒ์ ๋๋ค. ๋ง์นจ๋ด ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํ๋ค๋ ์๋ ฅ์ด ๋์์ง๊ณ ์์ต๋๋ค. ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ง๊ธ ์๋ ๊ณณ์ ๋๋ค.
Re: ํ์ต ๊ณก์ , ๋ ์ฐฝ์ฑ ๋ฐ ์ถ์ํ:
Ajax๋ ์ฝํฌ(thunk), ์ฌ๊ฐ(saga) ๋๋ ์์ฌ์(Epics)๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๋ ์๋ก์ด ํ์ต์๊ฐ ๋งํ๋ ์์ญ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ค์ง ์ด๋ ค์์ด ์์ด ๋ณด์ด๋ ์์ญ ์ค ํ๋๋ ์ก์ ์ ์์ฑํ๋ ๊ฒ์ ๋๋ค. ์ก์ ์ ์์ฑํ๋ ๊ฒ์ ๋๋ค. ์ก์ ์ ๊ทธ์ ์ค๋๋ Javascript ๊ฐ์ฒด์ผ ๋ฟ์ด๊ณ Flux Standard Actions ์ฌ์์์ ์ ๊ณตํ๋ ๋ช ํ์ฑ์ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ฌํ ์ฌ๊ณ ๋ฐฉ์์ ๋๋ฅผ Flux Standard Ajax Action์ ๊ฐ๋ฐํ์ง ์๋ ์ด์ ์ ๋ํ ์ง๋ฌธ์ผ๋ก ์ด๋์์ต๋๋ค.
์
function fetchPosts(page) {
return {
type: 'FETCH_POSTS_REQUEST',
// Ajax request setup
ajax: {
url: `/api/posts`,
method: 'GET',
data: { page },
// Optional ajax meta attributes
meta: {
// Amount of time to debounce the execution of the request
debounce: 400,
// Amount of times to retry the request on failure
retry: 2,
// Amount of time before timing out
timeout: 10000,
// The action type that cancels the request
cancelType: 'CANCEL_FETCH_POSTS',
// Strategy when multiple FETCH_POSTS_REQUESTs are in flight
resolve: 'LATEST'
}
}
};
}
ajax ์์
์ ๋ฏธ๋ค์จ์ด์ ์ํด ์ฒ๋ฆฌ๋ฉ๋๋ค(์์
์ ajax
ํค์ ๋ฐ์ํจ).
๋๋ ์ด ์ ๊ทผ ๋ฐฉ์์ด ์ ๋์ ์๊ฐ์ผ์ง ์ด์ ๋ฅผ ์๊ฐํ๋ ค๊ณ ๋
ธ๋ ฅํ์ง๋ง ์์ง ๊ฑฐ๋ ์ฐจ๋จ์ ๋ํด ์๊ฐํด ๋ณธ ์ ์ด ์์ต๋๋ค.
๋ด ์ถ์ ์ ๋ช ๊ฐ์ง ์ด์ :
์ผ๋ถ ์ฌ๋๋ค์ด ๊ด์ฌ ๋ถ๋ฆฌ ์ฃผ์ฅ์ ์ฃผ์ฅํ๋ ๊ฒ์ ๋ค์ ์ ์์ง๋ง, ์ด๋ ์ฐ๋ฆฌ์ ajax ์์ฒญ ์์
์ด ์ด๋ฏธ ์ํํ๊ณ ์๋ ์์
์ ๋ํ ์์ฐ์ค๋ฌ์ด ํ์ฅ์ด๋ผ๊ณ ์ฃผ์ฅํ๊ณ ์ถ์ต๋๋ค. ํ์ฌ ๊ทธ๋ค์ 'FETCH_POSTS_REQUEST'
๋ผ๋ ๋งค์ฐ ๋ช
ํํ ์ปจํ
์คํธ๋ก ์์
์ ์ค์ ํ๊ณ ์์ง๋ง ์ปจํ
์คํธ๊ฐ ๋๋ฌด ์ ์ด์ ajax ์์ฒญ ๊ตฌํ์ ์ถ์ํํฉ๋๋ค. ๋ค๋ฅธ ๊ณณ์์ ์๋์ผ๋ก ajax ์์ฒญ์ ์ํํ๋ ๊ฒ ์ธ์๋ ์ ํ์ ์ฌ์ง๊ฐ ๊ฑฐ์ ์์ต๋๋ค.
๋ง์์ ์ค๋ ๋ ๋ค๋ฅธ ๊ฒ์ ์ผ๋ถ ๋ฌธ์์์ ๋ณธ ๋น๋๊ธฐ ์์ ์ฐ๊ฒฐ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฐ ๋ฐฉ์์ผ๋ก ์์ฒญ์ ์ฐ๊ฒฐํ ํ์๊ฐ ์์๊ธฐ ๋๋ฌธ์ ์ด ์ฐ๊ฒฐ์ด ์ผ๋ง๋ ๋๋ฆฌ ์ฌ์ฉ๋์๋์ง๋ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ํ์ง๋ง ๋ด ์ง๊ฐ์ ์ด๊ฒ์ด ๋ด๊ฐ ์ ์ํ๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ ๋๋ค. ์ด ํ ๋ก ์์ ์ธ๊ธ๋ 90% ์ฌ์ฉ ์ฌ๋ก์ ์ํ์ง ์์).
๊ฒฐ๋ก ์ ์ผ๋ก - ์ด์ ๊ฐ์ ์ถ์ํ๋ ์ผ๋ฐ์ ์ธ Redux ์์ฉ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๋ฐ ํ์ํ ํ์ต ๊ณก์ ๊ณผ ์ฝ๋์ ์์ ์ค์ด๋ ๋ฐ ๋์์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ํด ์๊ฐํ๋ ์ฌ๋์ด ์์ต๋๊น? ์๊ฐํ ์ ์๋ ๊ฑฐ๋ ์ฐจ๋จ๊ธฐ๊ฐ ์์ต๋๊น? @markerikson @gaearon
์ ํ ๊ธฐ์ : redux-axios-middleware
์ด ์ค๋ ๋์์ ๋ง์ ์ผ๋ค์ด ์ผ์ด๋๊ณ ์์ต๋๋ค.
Redux ๋ณต์ก์ฑ์ ๋ํ ๋ ผ์์ ๋ํด. ๊ฐ์ธ์ ์ผ๋ก ๋๋ ์ฌ๋๋ค์ด Redux๊ฐ ๋ณต์กํ๊ณ ์ฅํฉํ๋ค๋ ๋ถํ์ ๋์ํ์ง ์์ต๋๋ค. Flux ๋ฐ Elm ์ํคํ ์ฒ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋ ํธ๋ ์ด๋ ์คํ๊ฐ ๋ฐ์ํฉ๋๋ค. Redux ํ ํ์ด์ง ์ ํ์ํ์ง ์์ ์
Redux๋ ์๋ ๊ทธ๋๋ก ์ฐพ์ต๋๋ค. ์ด์ด ์ข๊ฒ๋ ํต์ฌ ํ์ ๊ธฐ๋ฅ์ด ์๋ฒฝํ๋ค๋ ๊ฒ์ ์๊ณ ์์ผ๋ฉฐ ๋ณ๊ฒฝํ ์์ฌ๊ฐ ์์ต๋๋ค. ๊ทธ ์์ ๊ตฌ์ถ๋ ์ถ์ํ๋ ํ๋ฅญํ๊ณ ๊ฐ๊ฐ ๊ณ ์ ํ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ ํ๋ฅญํ๊ณ ์ ์ค๊ณ๋ ์ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ๊ธฐ๋ํ ์ ์๋ ๊ฒ์ ๋๋ค.
๋๋ Redux ์์ฒด์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ด ์๋๋ผ ๊ทธ๊ฒ์ ํ์ตํ๋ ์ ์ง์ ์ด๊ณ ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ ๋ถ์กฑ์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ๋ด
๋๋ค. ์ผ๋ถ ์ธ๊ธํ๋ฏ์ด React ์์ฒด์๋ ๋์ผํ ๋ฌธ์ ๊ฐ ์์๊ณ create-react-app
๊ฐ ํด๊ฒฐ์ฑ
์ด์์ต๋๋ค.
์๋ง๋ ๊ทธ๊ฒ์ ๋ํ ๋ฉ์ง ๋ฆฌ์์ค๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋์ง ์์ ์๋ ์์ต๋๋ค(์: Dan์ egghead ์๋ฆฌ์ฆ ). ํ์ต ๊ณก์ ์์ด ๋ณต์กํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ค๋ ์ฌ๋๋ค์ด ๋ฌธ์ ์ผ ์ ์์ต๋๋ค.
์ด์จ๋ , ์ด๊ฒ์ ์ด ์ค๋ ๋์ ๊ดํ ๊ฒ์ด ์๋๋๋ค.
@markerikson ์ ๋ ๊ฐ์ธ์ ์ผ๋ก ์ด redux-starter
๊ฐ๋ฐ์ ๋์์ ๋๋ฆฌ๊ณ ์์ต๋๋ค.
_์ ๋ ๋ ๋ฉ์ง ์ด๋ฆ์ ์ํฉ๋๋ค_ :stuck_out_tongue:
๋ง์ ์์ ์ ์์ฑํ๋ ๋ฐ ํ์ํ ์์ฉ๊ตฌ๋ ๊ฑฐ์ redux์์ ๋ณผ ์ ์๋ ์ ์ผํ ๋จ์ ์ ๋๋ค.
๋งค์ฐ ๋ฎ์ ์์ค์ด์ง๋ง ํ๋ฅญํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๊ฒ์ด ๋ด๊ฐ MobX๋ณด๋ค Redux ์คํ์ผ ํจ๋ฌ๋ค์์ ์ ํธํ๋ ์ด์ ์ค ํ๋์ง๋ง, ์๋ฅผ ๋ค์ด ์ ์ฉ์ฑ์ ์ดํดํ๊ณ MobX๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๋๋ค. ํ์ง๋ง Redux๋ฅผ ์ดํดํ๊ฒ ๋ ์ง๊ธ์ ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ๋ง์ผ๋ก๋ ํ๋ณตํ ๊ฒ์ ๋๋ค. Redux(๋๋ ์ผ๋ฐ์ ์ผ๋ก Redux ํจํด) ๋๋ฌธ์ ๋ฐ์ดํฐ๋ ํนํ "๋ค์์" ์งํ๋์ง ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฝ๋๊ฐ ์ฒ๋ฆฌ๋๋ ๊ณณ๋ง๋ค ์์ฑํ๊ณ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ดํดํ ์ ์์ต๋๋ค(์๊ฐ์ ๋ค์ฌ ํ์ตํ ๊ฒฝ์ฐ ๋์ค์ ์์ธํ ์ค๋ช ).
๋ฌธ์ ๋ ์ ๊ฐ Redux๋ฅผ ์ฒ์ ๋ฐฐ์ธ ๋ ์ดํดํ๊ธฐ ํ๋ ๋ถ๋ถ์ด ๋ง์์ง๋ง ๊ฐ๋จํ์ต๋๋ค. ์ด๋ ค์ด ์ผ๋ ๊ฐ๋จํ ์๋ ์์ต๋๋ค. ํ์ง๋ง ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ "์, ์ด ์ปจ์ ์ด ๋๋ฌด ๋ ผ๋ฆฌ์ ์ด๋ค! ๋ด๊ฐ ์ง์ ํ ์ ์์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ ๋ค!" ๊ทธ๋์ ๋ด ์ฒซ ๋ฒ์งธ ํ๋ก์ ํธ์์๋ Redux ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ๋์ ๋๋ง์ ์์ Redux ์ ์ฅ์๋ฅผ ๋ง๋ค์์ต๋๋ค.
๊ทธ๋ ๊ฒ ํ๋ฉด Redux์ ๊ฐ๋ ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋์์ ๋ฟ๋ง ์๋๋ผ Javascript ์์ฒด์ ๋ํ ์ดํด๋ ๋ง์ด ๋์์ก์ต๋๋ค! (์ด๊ฒ์ ์ด์ ์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ ์ ๋ํด ๊ฑฐ์ ์๋ฌด๊ฒ๋ ๋ชฐ๋๋ ์ฌ๋์ ๊ด์ ์์ ๋ณธ ๊ฒ์ด๋ฏ๋ก ๋ง์ผ๋ฆฌ์ง๊ฐ ๋ค๋ฅผ ์ ์์ต๋๋ค.) Redux์ ๊ฐ๋ ์ ๋จ์ํจ๊ณผ ๋์์ ๋ฏฟ์ ์ ์์ ์ ๋๋ก ๊ฐ๋ ฅํ๋ค๋ ๋ฉด์์ ์ ๋ง ํ๋ฅญํฉ๋๋ค.
๋ฌธ์ ๋ Redux๊ฐ ๋งค์ฐ ์ธ๊ธฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ "์ ํ"์ด ์ ์ฌ์ฉ์๊ฐ Javascript์์ ์ผ๋ง๋ ์ ์๋ํ๋์ง์ ๋ํด ์ฃผ์๋ฅผ ๋ถ์ฐ์ํฌ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ๊ทธ๋ค์ ์ฌ๊ณ ๋ฐฉ์์ "์ข์์, React, Redux ๋ฑ์ ์ป์์ต๋๋ค. ์ด์ ๋ฉ์ง ํ๋ก๊ทธ๋๋จธ๊ฐ ๋์ด ๋ฉ์ง ์ฑ์ ๋ง๋ค๊ฒ ์ต๋๋ค!"๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ ์๋๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ค์ ๋๊ตฌ๊ฐ ์๋ํ๋ ์ด์ ๋ฅผ ์ดํดํ์ง ๋ชปํ ์ฑ ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํ๊ธฐ ์ํด ๋ฐ์ง์ด๋ ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ค๋ ๋ฐ์๋ง ์ง์คํ ์ ์์ต๋๋ค.
๊ฐ๋
์ด ์ดํด๋๋ฉด Redux(๋๋ Redux์ ์ ์ฌํ ํจํด)๊ฐ ๋ชจ๋ ๋ฐฉ์์ ์์
์ ์ํํ๋๋ก ํ๋ ๊ฒ์ด ๋งค์ฐ ์ฌ์์ง๋๋ค. ๋๋ Angular์ ๊ฐ์ ๋ค๋ฅธ (์ฌ์ ํ ํ๋ฅญํ) ๋๊ตฌ๋ณด๋ค React๋ฅผ ์ข์ํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ด์ ๋ก ๊ทธ๊ฒ์ ์ข์ํฉ๋๋ค. _๊ทธ๋ฅ ์๋ฐ์คํฌ๋ฆฝํธ์
๋๋ค._ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ด๋ ๊ฒ ์๋ํฉ๋๋ค!
์ด๋ค ํจ๋ฌ๋ค์์ ํตํด ํ์ํ ์์ฉ๊ตฌ๋ฅผ ์ค์ผ ์ ์๋ค๋ฉด ์ข๊ฒ ์ง๋ง, Unlimiteddd powaaaaaa์ ๋ํด ์ง๋ถํ๊ธฐ์๋ ์์ ๋๊ฐ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
IMO๋ ์ด ๋ชจ๋ "์ฅํฉํจ์ ์ ์ถฉ์"์ผ ๋ฟ์ ๋๋ค. ์์ธ๋ ์๋ฌด๊ฒ๋์ ์๋น์ค๊ฐ ์๋, ๋น์ ์ด ์ ํ ๋์ ์ค๋์ ์ฌ์ฉํ ์ ์๋๋ก ํฌ์์ ๋๋ค. ๋๋ Redux๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋น๋ํ๋ ๊ฒ์ด ์๋๋ผ ์ด๊ฒ์ด ๋ณธ์ง์ ์ธ ๋ณต์ก์ฑ์ด ์๋๋ผ๋ ์ ์ ์ง์ ํ๊ณ ์ถ๋ค. Elm์ Redux๊ฐ ๋ฌ์ฑํ๋ ๋ชจ๋ ๊ฒ์ ๋ ์ ์ ์์ ๋ผ์ธ๊ณผ ๋ ๊ฐ๋จํ ์ฝ๋๋ก ๊ด๋ฆฌํฉ๋๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ๋ ๊ธฐ๊ณ์ ์ผ๋ก ์์ฉ๊ตฌ๋ฅผ ์์ฑํฉ๋๋ค. Jumpstate ๋ฑ์ ์ถ์ ๋ ์ฝ๊ฒ ๋ง๋ค์ด์ฃผ์ง๋ง ๋ฐํ์์ ํ ์ ์๋ ์ผ์๋ ํ๊ณ๊ฐ ์์ผ๋ฉฐ typescript/flow๋ฅผ ์ฌ์ฉํ๋ฉด jumpstate๊ฐ ๋ณ๋ก ๋์์ด ๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ codegen์ ์ด๋ ต๊ณ ์ด๋ฏธ ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆฐ ๋น๋ ์์คํ ์ ํ ๊ฐ์ง๋ฅผ ๋ ์ถ๊ฐํ๊ณ ์ถ์ดํ๋ ์ฌ๋์ ์๋ฌด๋ ์์ต๋๋ค.
๊ด์ฉ์ ์ธ Redux๋ก ๋ฒ์ญ๋ Elm ์ฝ๋์ ๊ฐ์ ๊ฒ์ ๊ฐ์ง ์ ์๋ค๋ฉด... ์ฌ์ ํ ์ ์ฌ์ฅ์ ๋ฐ๊ฒ ํ์ญ์์ค.
๋ค์์ ๋ด ์์ด๋์ด ์ค ์ผ๋ถ์ ๋๋ค. ์ด์ ์๊ฒฌ์ ๋ฐ๋ณตํ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ก์ .js
export function increase() {}
๊ฐ์๊ธฐ.js
import { increase } from './actions.js';
export default handleActions({
[increase]: (state) => state + 1
}, 0);
ํจ์์๋ ๊ณ ์ ํ ์ฐธ์กฐ๊ฐ ์์ผ๋ฏ๋ก ์ด๋ฅผ ์์ ์ ์๋ณ์๋ก ์ทจ๊ธํ ์ ์์ต๋๋ค. FSA์ ํธํ๋์ง ์์ง๋ง ๋ง์ ์ฝ๋๋ฅผ ์ ์ฅํ๊ณ ์ค์๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
async function a() {
}
async function b() {
}
store.dispatch(a());
store.dispatch(b()); // b() will be dispatched after a() resolves
๊ทธ๋ ๊ฒ ํ๋ฉด ์ก์
์์ฑ์๊ฐ ๋น๋๊ธฐ ํจ์๊ฐ ๋ ์ ์์ง๋ง ์ฐจ๋ก๋ก ๋์คํจ์นํ ์ ์์ต๋๋ค. ๋ง์ ์ํฉ์์ ๋ณผ ์ ์๋ฏ์ด ์ฌ๋๋ค์ ๋ฏธ๋ค์จ์ด ๊ธฐ๋ฐ ์๋ฃจ์
์ ์ฌ์ฉํ ํ์๊ฐ ์์ผ๋ฉฐ ๋ง์ ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ์ ์ฝํ ์ ์์ต๋๋ค.
์ด ๊ฐ๋
์ Delux ์ Promise Factory์์ ๊ตฌํ๋ฉ๋๋ค.
redux === ์์ฉ๊ตฌ
https://github.com/Emilios1995/redux-create-module
ํ์ง๋ง ์ด ๊ธฐ๋ฅ์ด ๋น์ ์ ์๋ช ์ ์์ ํ ๊ตฌํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด ์ค๋ ๋์์ ์งํ ์ค์ธ ๋ ๊ฐ์ง ๋ค๋ฅธ ์์ด๋์ด ์ธํธ๋ฅผ ๊ตฌ๋ณํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
๋๋ redux ์ฝ์ด๊ฐ ๊ทธ ์์ฒด๋ก ํ๋ ์์ํฌ๊ฐ ๋์ด์๋ ์ ๋๋ค๋ ํ๋ ค๋์ง ์ดํดํฉ๋๋ค. ๊ทธ๋ฌ๋ redux ์ฝ์ด์๋ ์๋ก์ด "๋์ฐ๋ฏธ ๊ธฐ๋ฅ"์ ๋ํ ์ฌ์ง์ ์ ๋ก๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
Redux๋ createStore
, applyMiddleware
, combineReducers
, bindActionCreators
, compose
์ ๊ฐ์ด ์๋นํ ์์ API ๋
ธ์ถ ์์ญ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ค ๋๋ถ๋ถ์ ํธ์ ๊ธฐ๋ฅ์
๋๋ค. Redux๊ฐ ์๋ํ๋ ค๋ฉด createStore
์์ผ๋ฉด ๋ฉ๋๋ค. ์ ์ด๋ค ์ค ํ๋๊ฐ ํต์ฌ์ ์ํฉ๋๊น?
applyMiddleware
๋ ์ธํธ์๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๋จ์ํ๋ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ญ๋๋ค. ๊ทธ๋ฌ๋ ๋ ์ค์ํ ๊ฒ์ applyMiddleware
์ด ๋ฏธ๋ค์จ์ด _interface_๋ฅผ redux ์คํ ์ด์ ํจ๊ณผ๋ฅผ ์ถ๊ฐํ๋ ํ์ค ๋ฐฉ์์ผ๋ก ์ง์ํ๋ค๋ ๊ฒ์
๋๋ค. ๋ฏธ๋ค์จ์ด ์ํ๊ณ๊ฐ ๊ฐ๋ฅํ ์ด์ ๋ applyMiddleware
์ธํฐํ์ด์ค๊ฐ ๋น๊ต์ ๋จ์ํ๊ณ ์ฌ์ฉ์๊ฐ ์ฌ๋ฌ ๋ฏธ๋ค์จ์ด๋ฅผ ๋์์ ์คํํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
combineReducers
๋ ํธ๋ฆฌํ ๊ฐ์๊ธฐ ๊ตฌ์ฑ์ ์ ๊ณตํฉ๋๋ค. ๊ฐ์๊ธฐ๋ฅผ ๊ตฌ์ฑํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์๋์ง๋ง ํ์คํ ๋ ์ ์ฉํ ํจํด ์ค ํ๋์
๋๋ค. ๊ทธ๋ฌ๋ redux ์ฝ์ด์ ์กด์ฌํ๋ค๋ ๊ฒ์ ๊ทธ๊ฒ์ด ์ผ๋ฐ์ ์ผ ๋ฟ๋ง ์๋๋ผ _์ ๋น์ฟผํฐ์ค_ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ด๊ฐ ๋ง๋ ๋ชจ๋ ์ค์ํ์ง ์์ Redux ์ฑ์ combineReducers
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฃจํธ ๊ฐ์๊ธฐ๋ฅผ ๋ง๋ญ๋๋ค. ์ด๊ฒ์ ์ด๋ฉด์ combineReducers
๊ฐ Redux์ ํจ๊ป ์ ๊ณต๋๋ ์ ์ผํ ํํ์ ๊ฐ์๊ธฐ ๊ตฌ์ฑ์ด๊ธฐ ๋๋ฌธ์ ๋ง์ ์ฌ์ฉ์๊ฐ ๊ทธ๊ฒ์ด ์กด์ฌํ๋ ์ ์ผํ ํํ์ ๊ฐ์๊ธฐ ๊ตฌ์ฑ์ด๋ผ๊ณ ๋ฏฟ๋ ๊ฒ ๊ฐ์ต๋๋ค.
bindActionCreators
๋ ๋์คํจ์น ์์
๊ณผ ๊ด๋ จ๋ ์ผ๋ถ ์์ฉ๊ตฌ๋ฅผ ์ค์
๋๋ค. ๊ทธ๋ฌ๋ ๋ฐ๋๋ก bindActionCreators
๋ ๋ํ ์์ฉ๊ตฌ์ ๋ํ Redux์ ํํ์ ๊ฐ์ ์ ์ธ ์ฑ
์์ด ์์ต๋๋ค. bindActionCreators
์กด์ฌ๋ง์ผ๋ก๋ ์ก์
ํฌ๋ฆฌ์์ดํฐ์ ํ์ฉ์ ๋
๋ คํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๊ฒ์ ์ก์
์์ฑ์( bindActionCreators
"๋ณด์ฆ")์ ์ ํ์(๋ฌธ์ํ๋์์ง๋ง ๋๋ฑํ ํต์ฌ ๊ธฐ๋ฅ์ด ์์)์ ๋ณด๊ธ๋ฅ ์ ๋น๊ตํ ๋ ํนํ ๋๋๋ฌ์ง๋๋ค. mapStateToProps
๋ ํญ์ "๋ง์ถคํ" ์ ํ๊ธฐ์ด์ง๋ง mapDispatchToProps
๋ ํญ์ ๋ฏธ๋ฆฌ ์์ฑ๋ ์์
์์ฑ์์ ๊ฐ์ฒด ๋งต์ธ react-redux
์ฌ์ฉํ๋ ๋ง์ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ณด์์ต๋๋ค.
์ด๋ค ์ค ์ด๋ ๊ฒ๋ Redux์ ๊ธฐ๋ฅ์ ํ์์ ์ธ ๊ฒ์ ์๋์ง๋ง ๋ชจ๋ ์ฌ์ฉ์ฑ์ ํ์์ ์ ๋๋ค. ์ด๋ฌํ ํจ์ ์ค ์ด๋ ๊ฒ๋ Redux์ ๊ณ ์ ํ ์ ์ฐ์ฑ์ ์ ํํ์ง ์์ง๋ง ๊ณตํต ํจํด์ ํธ์ถ ๊ฐ๋ฅํ ํจ์๋ก ๊ตฌ์ฒดํํ์ฌ ์ ํ์ ๋ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ๊ฐ ๋์ฐ๋ฏธ ํจ์๋ ์ถ๊ฐ ์ง๋ฌธ์ ์ ๊ธฐํฉ๋๋ค.
์ด ๋ชจ๋ ๊ฒ์ ๋ํ ๋๋ต์ด ๋ถ์ ์ ์ผ์ง๋ผ๋, ๋๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ค์ ์ ์ ๋ฅผ ๊ณ ๋ ค์กฐ์ฐจ ํ์ง ์์์ผ๋ก์จ ์ฐ๋ฆฌ ์์ ๊ณผ ์ง์ญ ์ฌํ์ ํด๊ฐ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
@modernserf : ๋จผ์ Redux์ ๋ํ ๊ทํ์ ์๊ฒฌ๊ณผ ์ต๊ทผ ์๊ฐ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ทธ๊ฒ๋ค์ ๋ชจ๋ _๋งค์ฐ_ ๊ฐ์น ์๊ณ ์ ์ตํ๋ฉฐ, ์๋ง๋ ์ด ์ค๋ ๋์ ๋ค๋ฅธ ๋๊ตฌ์๊ฒ๋ ํ๋ ์์ฌ์ผ ํ ๊ฒ์ ๋๋ค. ๊ทธ๋์ ์ฌ๊ธฐ์ ๋งํฌํ๊ฒ ์ต๋๋ค.
๊ด๋ จ๋ ์ญ์ฌ ๋๋ฌธ์ ๋น์ ์ด ๊ทธ๊ฒ๋ค์ ๊ฐ์ ธ์์ผ ํ๋ค๋ ๊ฒ์ ๋งค์ฐ ํฅ๋ฏธ๋กญ์ต๋๋ค(์ ๋ Redux์ Tao, Part 1 - Implementation and Intent . ํนํ redux-thunk
๋ด ๊ฒ์๋ฌผ์ ์ํด ์กฐ์ฌํ๋ ๋ฐ ๋ง์ ์๊ฐ์ ๋ณด๋์ต๋๋ค. react-redux
๋ ๋์ค์ ๋ถ๋ฆฌ๋์์ต๋๋ค .
์ด๋ฌํ ์ ํธ๋ฆฌํฐ๊ฐ ์ค์ ๋ก ํน์ ์ฌ์ฉ ํจํด์ ์ฝ๋ํํ๋ ๊ฒ์ด ๋ง์ต๋๋ค. ์ฆ, ์ด๋ฌํ ์ ํธ๋ฆฌํฐ๋ ์ฌ๋ผ์ด์ค ๊ฐ์๊ธฐ์ ๊ตฌ์ฑ, ๋น๋๊ธฐ ๋์ ๋ฐ ๊ธฐํ ์ค์ ์ง์ค์ ๋์์ ์ํ ๋ฏธ๋ค์จ์ด ํ์ดํ๋ผ์ธ, ๊ตฌ์ฑ ์์(ํนํ ์ฃผ๋ณ์ ํจ์ ์ ๋ฌ ์์ ๊ตฌ์ฑ ์์์). ๋ค์ ์ ์ฌํ๊ฒ, Reselect๊ฐ ํต์ฌ์ ์๋์ง๋ง Dan์ ๋ช ์์ ์ผ๋ก ์์ฑ์ ๊ถ์ฅํ์ต๋๋ค .
์, ๋๊ตฌ๋ "ํ ์" ์์์ง๋ง ์ด๋ฅผ ๊ตฌ์ถํจ์ผ๋ก์จ ์ฌ๋๋ค์ด ํน์ ๋๊ตฌ๋ฅผ ํน์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋๋ก ํ์ต๋๋ค. ๊ทธ๊ฒ์ ๋ํด ํ์คํ ๋์ํฉ๋๋ค.
๋ง์ง๋ง ์ธ ๊ฐ์ง ์ง๋ฌธ์ ๋ํด:
combineReducers
์ผ์ข
์ ์ธ ๋ฒ์งธ ์ธ์๋ฅผ ์ถ๊ฐํ์๋ PR์ ๋ซ์์ง๋ง(๊ทธ๋ฆฌ๊ณ ๊ทธ ์ค _๋ง์_์ด ์์) ๋ง์นจ๋ด #1768์ด ์์ผ๋ก ๋์๊ฐ ์ ์๋๋ก ํ์ฉํ์ต๋๋ค. ๋์. ๊ทธ PR๋ ์ค๋จ๋์์ต๋๋ค.mapState
๋ํ ๊ฐ์ฒด ์๊ธฐ ๊ตฌ๋ฌธ ์ createStructuredSelector
๋์ผํ ์์
์ ์ํํ ์ ์์์๋ ๋ถ๊ตฌํ๊ณ ์ด์ ๋ํ ๋ง์ ์์ฒญ์ ๋ฐ์์ต๋๋ค."Redux์ Tao" ๊ฒ์๋ฌผ์์ ๋ฌธ์ํํ ๊ฒ์ฒ๋ผ ๋ช ์๋ ๋ชฉํ๋ Redux ํต์ฌ API๋ฅผ ๊ฐ๋ฅํ ํ ์ต์ํ ํ๊ณ ๊ทธ ์์ ์ํ๊ณ๋ฅผ ์ฅ๋ คํ๋ ๊ฒ์ด์์ต๋๋ค . ๋ํ, Redux ๊ฐ๋ฐ ์ด๊ธฐ์ Andrew ๋ ํน์ ํ๋ฌ๊ทธ์ธ์ "์ถ๋ณต"ํ๋ ค๋ ์๋์ ๋ํด ๋ค์๊ณผ ๊ฐ์ด ์ธ๊ธํ์ต๋๋ค .
gaearon์ด ํ ๋ฒ ๋งํ๋ฏ์ด(์ด๋๊ฐ... ์๋ง๋ Slack์ธ์ง ๊ธฐ์ต์ด ๋์ง ์์ต๋๋ค) ์ฐ๋ฆฌ๋ Flux ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Koa์ฒ๋ผ ๋๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ๊ฒฐ๊ตญ ์ปค๋ฎค๋ํฐ๊ฐ ๋ ์ฑ์ํด์ง๋ฉด reduxjs GitHub ์กฐ์ง์์ "์ถ๋ณต๋ฐ์" ํ๋ฌ๊ทธ์ธ ๋ฐ ํ์ฅ ๋ชจ์์ ์ ์ง ๊ด๋ฆฌํ ๊ณํ์ ๋๋ค.
์ด์ ์ up-thread์์ ๋๋ ์ผ์ข ์ "์ฌ์ด Redux ์ค์ " ์ถ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ ์ ์ํ์ต๋๋ค. ๊ทธ๋ฐ ๊ฒ ๋๋ ์ ์ด๋ "์ถ๋ณต๋ฐ์" ์ ๋์จ ๋ชฉ๋ก์ด ๋น์ ์ด ์๊ฐํ๋ ๋ผ์ธ์ ๋ฐ๋ผ ์ถฉ๋ถํ ๊น์? (์ค์ ๋ก ์ด ์ค๋ ๋์ ์ฒซ ๋ฒ์งธ ๋๊ธ์์๋ ๊ทธ๋ ๊ฒ ํ์ จ์ต๋๋ค.) ๊ทธ๋ ์ง ์๋ค๋ฉด ์ถ๊ฐ ์ ์์ด๋ ์์ด๋์ด๊ฐ ์์ต๋๊น?
๊ฒฐ๊ตญ ์ปค๋ฎค๋ํฐ๊ฐ ๋ ์ฑ์ํด์ง๋ฉด reduxjs GitHub ์กฐ์ง์์ "์ถ๋ณต๋ฐ์" ํ๋ฌ๊ทธ์ธ ๋ฐ ํ์ฅ ๋ชจ์์ ์ ์ง ๊ด๋ฆฌํ ๊ณํ์ ๋๋ค.
์ด๊ฒ์ ๋ด๊ฐ ํ ์ผ์ด์ง๋ง ์๋ง๋ ํ ๊ฑธ์ ๋ ๋์๊ฐ ๊ฒ์
๋๋ค. ํ์ฌ redux
ํจํค์ง๊ฐ @redux/core
์ ๊ฐ์ ๊ฒ์ด ๋๋ ๋จ์ผ ์ ์ฅ์๋ก ํ๋ก์ ํธ๋ฅผ ์ฌ๊ตฌ์ฑํ ๊ฒ์
๋๋ค. reselect ๋ฐ redux-action๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ repo ๋ฐ ๋ค์์คํ์ด์ค๋ก ๊ฐ์ ธ์ค๊ณ redux
ํจํค์ง ์์ฒด๋ ์ด๋ฌํ ๋ชจ๋ ํจํค์ง๋ฅผ ๋จ์ผ ๋ค์์คํ์ด์ค๋ก ๋ค์ ๋ด๋ณด๋
๋๋ค.
_sort of_๋ redux ์ฝ์ด๋ฅผ ์์ ํ์ง ์๋๋ค๋ ์ ์ฝ ์กฐ๊ฑด์ ์ถฉ์กฑํฉ๋๋ค. ๋ํ ํ์ฅ ๋ฒ์ ์ ์ฝ์ด์ ์๊ฒฉํ ์์ ์งํฉ์ด๋ฏ๋ก ํ์ ํธํ์ด ๊ฐ๋ฅํฉ๋๋ค. ์๋ก์ด ๊ธฐ๋ฅ์ ์์ ํ ์ตํธ์ธ์ด๋ฉฐ ๋น๊ณต๊ฐ ์ํ์ ๋ํ ํน๋ณํ ์ก์ธ์ค ๊ถํ์ด ์์ต๋๋ค. "ํฝ์ฐฝ"์ ๊ดํ ํ -- ์ด๋ฌํ ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฒ์์๋ ์์ผ๋ฉฐ ํธ๋ฆฌ๋ฅผ ํ๋๋ ๊ฒ์ด ์ฝ์ง ์์ ๋ฐฉ์์ผ๋ก ์์ฑ๋์์ต๋๋ค.
๋ํ MapState์ ๋ํ ๊ฐ์ฒด ๋จ์ถ ๊ตฌ๋ฌธ์ ์ถ๊ฐํ๊ธฐ ์ํด React-Redux์ ๋ํ ๊ณต๊ฐ PR์ด ์์ผ๋ฉฐ Reselect์
createStructuredSelector
๋์ผํ ์์ ์ ์ํํ ์ ์์์๋ ๋ถ๊ตฌํ๊ณ ์ด์ ๋ํ ๋ง์ ์์ฒญ์ด ์์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ๋น์ ์๊ฒ ๋ฌด์ธ๊ฐ๋ฅผ ๋งํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ ๊ฐ ์ ์ํ๋ monorepo ๊ตฌ์กฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก Lodash์์ ์ฌ์ฉํ๋ ๊ตฌ์กฐ์
๋๋ค. ์ -- Lodash๋ ๋ณธ๋ณด๊ธฐ๋ก ์ผ๊ธฐ์ ํฅ๋ฏธ๋ก์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค. ์์ฒญ๋ ํจ์ ๋ชจ์์ด ์์ผ๋ฉฐ, ๊ทธ ์ค ๋ง์ ๋ถ๋ถ์ด ์ค์ค๋ก ๊ตฌํํ๊ธฐ๊ฐ ์ฝ์ง ์์ต๋๋ค. lodash์ ๊ฑฐ์ ๋ชจ๋ ๊ธฐ๋ฅ์ "๋ ์ํผ"๋ก ๋ ์ ์ฐํ ์ ์์ต๋๋ค. groupBy
๋ ๊ฒฐ๊ตญ _ํจํด_์
๋๋ค. ๋น์ ์ด ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋งํ๋ ๊ฒ์ ๋๊ตฌ์
๋๊น?
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ lodash ํจ์๋ ์์ฒด _a la carte_ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. import { groupBy } from "lodash"
๋ณด๋ค import groupBy from "group-by"
import { groupBy } from "lodash"
์ ๋ํ _๊ธฐ๋ฅ์ _ ์ด์ ์ ์์ต๋๋ค. ํ์ํ ๊ฒ๋ง ์ค์นํ ์ ์๋๋ฐ ์ ๋๋ฌด ๋จ๋ฆผ์ ์ฒ๋ฆฌํด์ผ ํฉ๋๊น?
๊ทธ๋ฌ๋ Lodash๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝํ์ ๋ ์ํผ๋ ๋๋ ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ทผ๋ณธ์ ์ผ๋ก ๋ค๋ฆ ๋๋ค. ๋ฐฐ์ด๋ก ๋ฌด์ธ๊ฐ๋ฅผ ํ๊ณ ์๊ณ ์์ ์ ๋ฐ๋ณตํ๋ ๊ฒ ๊ฐ์ ๋๋์ด ๋ ๋ค๋ฉด ์๋ง๋ Lodash ํจ์๊ฐ ์ด๋ฅผ ์ํํ ๊ฒ์ ๋๋ค. ๋ ์ํผ๋ฅผ ์ฐพ์ ํ์๋ ์๊ณ , ์๋ฌด๊ฒ๋ ์ค์นํ ํ์๋ ์์ต๋๋ค. ํ์ผ์ ๋ค๋ฅธ ๊ฐ์ ธ์ค๊ธฐ ๋ผ์ธ์ ์ถ๊ฐํ ํ์๋ ์์ ๊ฒ์ ๋๋ค. ์์ฃผ ์์ ๋ง์ฐฐ๋ ์ ๊ฑฐํ์ง๋ง ์ฐ๋ฆฌ์ ํ๋ฃจ๋ ์ด๋ฐ ์๊ฐ๋ค๋ก ๊ฐ๋ ์ฐจ์ ์์ ๋๋ค.
๋ค๋ฅธ ๊ด์ ์์ ๋ด ์์ ์ 2์ผํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ ๊ฒฝ ์ฐ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
CQRS , ์ด๋ฒคํธ ์์ฑ , ๊ทธ๋ฆฌ๊ณ ๊ถ๊ทน์ ์ผ๋ก ์๊ฐํ๋ ๋๋ฉ์ธ ์ฃผ๋ ๋์์ธ ํ๊ต๋ ์ฐ๋ฆฌ์๊ฒ Flux ์ Redux ๋ฅผ ๋ณ์ ์๋ํ ์กฐ์์ ๋๋ค. ์ด๋ฌํ ์ํฅ์ด ๊ฐ๋ ์ธ์ฉ ๋์ง๋ง Redux ์ ๊ทธ ํ์ ๋๊ตฌ๋ ๋๋ถ๋ถ์ API ์ฉ์ด๋ฅผ ๋น์ ์ ํํ๋ Flux ๋ฐ Flux ๊ตฌํ์์ ๊ฐ์ ธ์์ต๋๋ค. ์ด๊ฒ์ ๊ด์ฐฎ์ง๋ง ๊ธฐ์กด ๋ ธ์ถ ๊ฐ๋ฐ์๊ฐ ์ด๋ฌํ ์์ด๋์ด์ ๋ํด ๊ฐ์ง ์ ์์๋ ์์ต์ ์ป์ ์ ์๋ ๊ธฐํ๋ฅผ ๋์น๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฐจ์ด์ ์ ๋ํ ๋ ๊ฐ์ง ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋ด๊ฐ ๋ณธ ๋๋ถ๋ถ์ ์ด๋ฒคํธ ์์ฑ ํ ๋ก ์์ Redux Actions ๋ Events ๋ผ๊ณ ํฉ๋๋ค. Redux ActionCreators ๋ Commands ๋ผ๊ณ ํฉ๋๋ค. ์ด ์ฉ์ด์ ํจ๊ป ๋ฌด๋ฃ๋ก ์ ๊ณต๋๋ ์ถ๊ฐ ๋ช ํ์ฑ๊ณผ ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ฒคํธ ๋ ๊ธฐ๋ก ๊ฐ๋ฅํ๊ณ ์ง๋ ฌํ ๊ฐ๋ฅํ ๋ฐ์ดํฐ์ ๋๋ค. ์ฌ๊ฑด ์ ๊ณผ๊ฑฐ ์์ ์์ ์ผ์ด๋ ์ผ์ ์ค๋ช ํฉ๋๋ค. ์ด๋ฒคํธ ๋ฅผ ์ฌ์ํ ์ ์์ต๋๋ค. ์ด๋ฒคํธ ๋ ๋ น์์ ์ทจ์ํ ์ ์์ต๋๋ค. ๋ช ๋ น ์๋ ๋ช ๋ น์ ์ธ ๋ถ์๊ธฐ๊ฐ ์์ต๋๋ค. ๋ช ๋ น์ ์ด๋ฒคํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
๋๋ ์ํคํ ์ฒ ํจํด์ผ๋ก์ Event Sourcing ์ด ํฅํ 10๋ ๋์ ์ธ๊ธฐ๋ฅผ ์ป์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ฉฐ, Redux ๋ API ๋ฐ ํ ๋ก ์ ๋ ๋์ ์ปค๋ฎค๋ํฐ์ ๋ ๋ฐ์ ํ๊ฒ ์กฐ์ ํจ์ผ๋ก์จ ์ฝ๊ฐ์ ์ ์ฉ์ฑ, ๋ช ํ์ฑ ๋ฐ ์ฌ์ฉ ์ฉ์ด์ฑ์ ์ป์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ์ด ํ ๋ก ์ด ์ด๋ฏธ ์ฃฝ๋๋ก ๋๋ค๊ฒจ ๋ง์๋ค๊ณ ์๊ฐํฉ๋๋ค: https://github.com/reactjs/redux/issues/351
์ ๋ชฐ๋๋ค์ ๊ฐ์ฌํฉ๋๋ค! :+1:
๋น์์ ์ทจํ ์ ์๋ ์กฐ์น๊ฐ ์์๊ธฐ ๋๋ฌธ์ #351์ด ํ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ API ๊ฒฐ์ ๊ณผ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ์ธ์ด๋ฅผ ์ฌ๊ณ ํ๋ ์์ ์ ์๋ค๋ฉด ์ง๊ธ์ด ์์ด๋์ด๋ฅผ ๋ค์ ํ๋ฉดํํ๊ธฐ์ ์ ์ ํ ์๊ธฐ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
๋ ๊ตฌ์ฒด์ ์ผ๋ก ๋งํ ์ ์์ต๋๋ค.
๋ค์์ Event Sourcing ๊ด์ฉ๊ตฌ์์ ์๊ฐ์ ๋ฐ์ API๊ฐ ์ด๋ป๊ฒ ์๊ฒผ๋์ง์ ๋ํ ์ ์๊ฐ์ ๋๋ค.
import { createEventStream, createProjection } from 'redux';
// Initialize the event stream separately from the store. This becomes the one
// true source of truth for your application.
const eventStream = createEventStream({
// Commands are the only thing that we want to couple to the eventStream. The
// set of events which may end up in an eventStream should be easy to predict.
//
// A definition like this supports static analysis inference well for
// consumers that can leverage it.
increment: () => ({ type: 'INCREMENT' }),
decrement: () => ({ type: 'DECREMENT' }),
});
// Multiple stores with disjoint or overlapping data can be used to consume the
// same event stream.
const store = createProjection(eventStream, reducer, init);
const adminStore = createProjection(eventStream, adminReducer, init);
// We don't need a jargon term ("Middleware"), or a dedicated hook to handle
// async anymore. We just register more subscribers to the eventStream.
eventStream.subscribe(myCustomMiddleWare);
eventStream.subscribe(sendEventsToAnalytics);
eventStream.subscribe(logEventsForPlayback);
// Calls to commands can be wrapped with React Providers or container components
// in the same way that Redux currently does. They can also be called directly.
eventStream.increment();
@ajhyndman : ๋๋ ์ ์๊ณผ ํ ๋ก ์ ๊ฐ์ฌํ์ง๋ง, ๊ทธ ์์ ๊ฑฐ ๋ณด๊ด์๋ ์์ ํ ์น ํด์ ธ ์๊ณ ๋ง์ด ํ๊ฐ์ ๋ ๋ฌ์ต๋๋ค(์์ ๋ฅผ ์์ ํ ํผํฉํ๊ธฐ ์ํด). Dan์ CQRS/ES ์ฉ์ด๊ฐ ์๋ Flux ์ฉ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์ผ๋ฉฐ ํต์ฌ API ๋๋ Redux ๊ฐ๋ ์ ์ฌ์ฉ๋๋ ์ฉ์ด๋ฅผ ๋ณ๊ฒฝํ ๊ณํ์ ์์ต๋๋ค.
(๋ํ, ์ด๋ฅผ ์ ์ฆํ ํต๊ณ๋ ์์ง๋ง ์ ์ด๋ JS ์ปค๋ฎค๋ํฐ ๋ด์์๋ CQRS/ES ์ฉ์ด๋ณด๋ค Redux์ "์ก์ " ๋ฐ "์ก์ ์์ฑ์" ์ฌ์ฉ์ ์ต์ํ ์ฌ๋๋ค์ด ๋ ๋ง์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. )
๋๋ ํ์คํ ์ด ๋ํ๊ฐ ์ ์ ์์๋ค๋ ์ธ์์ ๋ฐ์๊ณ , ๊ทธ๊ฒ์ ๋ค์ ์ด์ง ์์ผ๋ ค๋ ๊ฐํ ์ด๋ง์ด ์์ต๋๋ค. ๐ ์ฌ๊ธฐ์ ๋๋ฌด ์ธ๊ฒ ๋๋ฅด์ง๋ ์๊ฒ ์ต๋๋ค. (๋ ๋์ ์ ์ ์ด ์๋ค๋ฉด ๋ค๋ฅธ ๊ณณ์์ ์ด ๋ํ๋ฅผ ์ฝ๊ฑฐ๋ ๊ณ์ํ๊ณ ์ถ์ต๋๋ค.)
๋ฌผ๋ก , ํ๊ณ ํ ์์๊ฐ ์๊ณ ์ ์ฒด API ํ๋ฉด๊ณผ ์ฉ์ด๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ํ ์์ ์์ ๋น์ฉ์ด ๋ง์ด ๋ ๋ค๋ ๊ฒ๋ ๋ง์ต๋๋ค.
๋๋ ์ฌ์ ํ Event Sourcing ๊ณผ Redux ์ปค๋ฎค๋ํฐ๊ฐ ์๋ก์๊ฒ์ ๋ฐฐ์ธ ๊ธฐํ๊ฐ ์๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค.
- ํ์ต ๋ฐ ์ฌ์ฉ ํ๋ก์ธ์ค๋ฅผ ๋จ์ํํ์ง๋ง ์ค์ ๋ก Redux๋ฅผ ์จ๊ธฐ์ง ์๊ณ (๊ทธ๋ฆฌ๊ณ "๊ธฐ๋ณธ" Redux๋ก์ ๋ง์ด๊ทธ๋ ์ด์ /ํ์ต ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํ ์ ์๋) ๊ฐ๋ฅํ ์ถ์ํ๋ฅผ ๋ง๋ค ์ ์์ต๋๊น?
์ฉ์ด๋ฅผ ์ฐจ์ฉํ๊ฑฐ๋ API๋ฅผ ๋ณ๊ฒฝํ์ง ์์๋ ์ฐ๋ฆฌ๊ฐ ์ฐพ์ ์ ์๋ ์น๋ฆฌ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ ์ฅ์๋ฅผ "currentState๊ฐ ์ถ๊ฐ ์ ์ฉ ๋ชฉ๋ก(๋๋ ์คํธ๋ฆผ)์ "์์ํ ๊ธฐ๋ฅ"(์ด๊ฒ์ ํ์๋๊ฑฐ๋ ์ถ์ ๋)์ธ ์ํ ์ปจํ ์ด๋๋ก ์ค๋ช ํ์ฌ ์ฌ๋๋ค์ Redux ์ ์๊ฐํ๋ ๋ฐ ์ฑ๊ณตํ์ต๋๋ค. ํ๋".
๋ฏธ๋๋ฅผ ๋ด๋ค๋ณด๋ฉด redux์ ๊ฐ์ ์๋ฒ ์ธํ๋ผ๋ฅผ ๊ตฌํํ๊ณ ์ถ์ํํ๋ ๊ฒ์ด ์์ ํ ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํฉ๋๋ค( Apache Samza ๋ฐ LinkedIn ์์ง๋์ด๋ง ํ์ ๋ค๋ฅธ ์์ ์ฐธ์กฐ). ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ์ด๋งํ๋ค๋ฉด ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํด ์ ์ฌํ ์ถ์ํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ ๊ฐ๋ฅํด์ผ ํฉ๋๋ค! ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ๋ฌ์ฑํ ์ ์๋ค๋ฉด ์ ๋ํ์ ์๊ตฌ Redux ์ ์ฅ์๊ฐ ์๋๊ฐ?
JavaScript์ ์ธํ๋ผ ์ปค๋ฎค๋ํฐ๊ฐ ํจ๊ป ๊ฒฐํฉํ ์ ์๊ฑฐ๋ ์ฝ๊ฒ ๋งคํํ ์ ์๋ ๋ชจ๋ ๊ฐ๋ ์ ์ด๋ฌํ ๊ธฐํ๊ฐ ๋ ๋นจ๋ฆฌ ๋ช ํํด์ง๊ณ ์ถ์ํ๊ฐ ๋ ๋ง์ด ํํ๋ ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๋ค.
์ ๋ ์ด๋ฌํ ์์ด๋์ด ์ค ์ผ๋ถ์ ๋ํด ์ฝ๊ฐ ํฅ๋ถํ๊ณ ์๋ ๊ฒ ๊ฐ์์! ๋คํ๋ผ๋ ๋จ์ด๋ฅผ ์ฉ์ํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
์ฐธ๊ณ : ์์์ ์ ์ํ ํ๋ฉด์ ๊ตฌํํ๋ ์ด๋ฒคํธ ์คํธ๋ฆผ๊ณผ ๊ฐ์ Redux์ฉ ๋ํผ API๋ฅผ ๋ง๋๋ ๊ฒ์ด ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ต๋๋ค!
@ajhyndman ๋๋ ๋ํผ๊ฐ ๋น์ ์ ์์ด๋์ด์ ํจ๊ป ๊ฐ๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค ๐
๋น์ ์ด ์ธ๊ธํ samza ๋ฐ ๋งํฌ๋์ธ ์์ง๋์ด๋ง ์์ ๊ณผ ๊ด๋ จํ์ฌ ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋ฉ์ง ๊ฐ์ฐ์ ์ฝ์ง ์์๊ฑฐ๋ ์์ฒญํ์ง ์์๋ค๋ฉด Apache Samza ๋ก
๊ทธ ๋น๋์ค๋ ๊ต์ฅํ๋ค! redux
repo์ README์ ์๋ ๊ฐ์ฌ ๋ชฉ๋ก์ ๋ ๋ฒ์งธ ํญ๋ชฉ์ด๊ธฐ๋ ํฉ๋๋ค.
์๋ ๋ชจ๋๋ค!
์ด ์ค๋ ๋์ ์กด์ฌ๋ฅผ ์ธ์ํ์ง ๋ชปํ ์ฑ ๋๋ @markerikson ์ ์๋ ์ง๋ฌธ์ ๋ํ ์ง์ ์ ์ธ ๋ต๋ณ์ด๊ณ @gaearon ์ ๋ชฉ๋ก ์์ ๋๋ถ๋ถ์ ๊ฒ์ ์ ๊ฑฐํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ๋ฐํ์ต๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด๋ฆ์ Kea์ ๋๋ค .
redux, redux-saga ๋ฐ reselect์ ๋ํ ์ถ์ํ์ ๋๋ค. ๊ทธ๊ฒ๋ค์ ํจ๊ป ์ฐ๊ฒฐํ๋ ์ ์ฐฉ์ ๋ฅผ ์ ์ธํ๊ณ Kea๋ ์๋ก์ด ๊ฒ์ ์์ฑํ๋ ์ฒํ์ง ์์ผ๋ฉฐ ํ์์ ๋ฐ๋ผ ์์ redux ์ก์ ์์ฑ๊ธฐ ๋ฐ ๊ฐ์๊ธฐ, ์์ redux-saga ์ฌ๊ฐ ๋ฐ ์์ ์ฌ์ ํ ์ ํ๊ธฐ๋ฅผ ๋ ธ์ถ ํฉ๋๋ค. ์๋ก์ด ๊ฐ๋ ์ ๋ฐ๋ช ํ์ง ์์ต๋๋ค.
Kea๋ ๋ค์ํ ์๋ ๋ชจ๋๋ฅผ ์ง์ํฉ๋๋ค. ๋ ๋ฆฝ ์คํํ์ผ๋ก ์ฌ์ฉํ ์ ์๊ณ , React ๊ตฌ์ฑ ์์์ ์ฐ๊ฒฐํ๊ฑฐ๋, React ๊ตฌ์ฑ ์์ ์์ ์ธ๋ผ์ธ ์ฒ๋ฆฌํ๊ฑฐ๋, ์ ํ๊ธฐ์ ๋ํ ์ ๋ ฅ์ด React ๊ตฌ์ฑ ์์์ props์ ์์กดํ๋ React ๊ตฌ์ฑ ์์์ ๋์ ์ผ๋ก ์ฐ๊ฒฐํ ์๋ ์์ต๋๋ค.
์ ๋ ๊ฐ์ธ์ ์ผ๋ก ๋ ๊ฐ์ ํฐ ์์ฉ ํ๋ก๊ทธ๋จ๊ณผ ํจ๊ป ์ฌ์ฉํฉ๋๋ค. ํ๋ ๋ ๊ฐ์ธ ๋ ์จ์ฉ ๋ง์ผํ๋ ์ด์ค ์ด๊ณ ํ๋๋ ํ๋์ ๊ฑฐ๋ํ ์ฐจ๋ ์ถ์ ์ํํธ์จ์ด์ ๋๋ค. ๊ฒ๋ค๊ฐ ๋๋ ๊ทธ๊ฒ์ผ๋ก ์์ ์ ์ฑ์ ๋ง๋ ์ฌ๋๋ค์ ์๊ณ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ฐ๋ฆฌ์๊ฒ ๋งค์ฐ ์ ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ทธ๊ฒ์ ์ ๋ฆฌํ๊ณ ๋ฌธ์๋ฅผ ์์ฑํ๋ ๋ฐ ์๋นํ ์๊ฐ์ ๋ณด๋์ต๋๋ค.
์ ์๊ฒ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ redux ์์ฒด์ ํต์ฌ์ ์ถฉ์คํ๋ฉด์ ํญ์ ์์ฉ๊ตฌ๋ฅผ ํฌ๊ฒ ์ค์์ต๋๋ค.
์ด์จ๋ ์ถฉ๋ถํ ์ด์ผ๊ธฐ๊ฐ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ช ๊ฐ์ง ์ฝ๋๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ ๋ด๊ฐ "์ธ๋ผ์ธ ์ผ์(inline kea)"๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ ํ ์์
๋๋ค. ์ฌ๊ธฐ์ ๋ก์ง์ด ์ปดํฌ๋ํธ์ ์ง์ ์ฐ๊ฒฐ๋ฉ๋๋ค. ์ด ๋ชจ๋๋ ๋ง ์์ํ๊ฑฐ๋ React์ setState
์์ต๋๋ค.
import React, { Component } from 'react'
import PropTypes from 'prop-types'
import { kea } from 'kea'
@kea({
actions: () => ({
increment: (amount) => ({ amount }),
decrement: (amount) => ({ amount })
}),
reducers: ({ actions }) => ({
counter: [0, PropTypes.number, {
[actions.increment]: (state, payload) => state + payload.amount,
[actions.decrement]: (state, payload) => state - payload.amount
}]
}),
selectors: ({ selectors }) => ({
doubleCounter: [
() => [selectors.counter],
(counter) => counter * 2,
PropTypes.number
]
})
})
export default class Counter extends Component {
render () {
const { counter, doubleCounter } = this.props
const { increment, decrement } = this.actions
return (
<div className='kea-counter'>
Count: {counter}<br />
Doublecount: {doubleCounter}<br />
<button onClick={() => increment(1)}>Increment</button>
<button onClick={() => decrement(1)}>Decrement</button>
</div>
)
}
}
์ฑ์ด ์ฑ์ฅํ๊ณ ๋ ๋ง์ ์ฅ์์์ increment
๋ฐ decrement
์์
๋๋ counter
์ํ์ ์ก์ธ์คํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ๋ถํ ํ ์ ์์ต๋๋ค.
// counter-logic.js
import PropTypes from 'prop-types'
import { kea } from 'kea'
export default kea({
actions: () => ({
increment: (amount) => ({ amount }),
decrement: (amount) => ({ amount })
}),
reducers: ({ actions }) => ({
counter: [0, PropTypes.number, {
[actions.increment]: (state, payload) => state + payload.amount,
[actions.decrement]: (state, payload) => state - payload.amount
}]
}),
selectors: ({ selectors }) => ({
doubleCounter: [
() => [selectors.counter],
(counter) => counter * 2,
PropTypes.number
]
})
})
// index.js
import React, { Component } from 'react'
import { connect } from 'kea'
import counterLogic from './counter-logic'
@connect({
actions: [
counterLogic, [
'increment',
'decrement'
]
],
props: [
counterLogic, [
'counter',
'doubleCounter'
]
]
})
export default class Counter extends Component {
render () {
const { counter, doubleCounter } = this.props
const { increment, decrement } = this.actions
return (
<div className='kea-counter'>
Count: {counter}<br />
Doublecount: {doubleCounter}<br />
<button onClick={() => increment(1)}>Increment</button>
<button onClick={() => decrement(1)}>Decrement</button>
</div>
)
}
}
๊ทธ๊ฒ์ ์๋ ํ๊ณ ๋ฌธ์ ๋ฅผ ์ฝ๊ณ redux-saga๋ฅผ ํตํ ๋ถ์์ฉ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๊ธฐํ ๊ธฐ๋ฅ์ ๋ํด ์์ธํ ์์๋ณด์ธ์.
Kea์ ๋ํ ํผ๋๋ฐฑ์ "๋ ๋ง์ ์ฌ๋๋ค์ด Redux ์ธ๊ณ๋ฅผ ๋ ๋์ ๊ณณ์ผ๋ก ๋ง๋ค๊ธฐ ์ํด KeaJS๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค! ๐" ๋ผ๋ ๋ฌธ์ ๋ฅผ ์ธ์ฉํ์ฌ ์ง๊ธ๊น์ง ์๋์ ์ผ๋ก ๊ธ์ ์ ์ด์์ต๋๋ค.
์๊ฐ์ ๋ด์ฃผ์๊ณ ์ฌ๊ธฐ๊น์ง ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! :)
์ข์ ๋ณด์ธ๋ค! 'increment'
๋ง๋ฒ์ ๋์ด ์ ๋ง ๋ง์์ ๋ค์ง ์์ต๋๋ค.
์ด ํ ๋ก ์ด ๋ค๋ฅธ ๊ณณ์ผ๋ก ์งํ๋์์ต๋๊น? Kea๋ ์ผ๋ฐ์ ์ผ๋ก ์ธ์ ๋๋ ๊ฐ์ฅ ์ ํํ ๊ฒฐ๊ณผ์ ๋๊น?
@lucfranken : ์๋์, ํ ๋ก ์ด
Redux๋ณด๋ค ๋์ ์์ค์ ์ถ์ํ๋ฅผ ์ฐพ๊ณ ์๋ค๋ฉด Kea๊ฐ ์๋ง๋ ์ข์ ์ ํ์ผ ๊ฒ์ ๋๋ค. ์คํ ์ด ์ค์ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํ๋ "Redux ์คํํฐ ํฉ"์ ์ฐพ๊ณ ์๋ค๋ฉด ๋ช ๊ฐ์ง๋ฅผ ์ดํด๋ด์ผ ํ ์๋ ์์ต๋๋ค. ๋๋ ์ผ์์์ ๊ทธ๋ฐ ๊ฒ์ ๋ณธ ์ ์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง, ์ฐ๋ฆฌ๋ ์ง๊ธ ๊ทธ๋ฐ ๊ณต์์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค.
์ฌ๊ธฐ ๋ง์ ๋ด ๋ชจ์๋ฅผ ๋์ก์ต๋๋ค. ์ด๊ฒ์ด ๋ด๊ฐ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋๋ค: https://github.com/HenrikJoreteg/redux-bundler
์ ๋ ๊ฐ์ธ์ ์ผ๋ก ์ด๊ฒ์ด ์์ฉ๊ตฌ์ ํฐ ๋จ์ํ์ ๊ฐ์๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ด๊ฐ ์ต๊ทผ์ ๋ง๋ ๋ชจ๋ ๊ฒ์ ๊ทธ๋ ๊ฒ ์ง๊ณ ์์ต๋๋ค.
๋์์ด ๋ ๊ฒ ๊ฐ์์ :
https://github.com/anish000kumar/redux-box
์๋ ํ์ธ์, ์ ํฌ ํ์ฌ์์๋ ๋คํธ์ํฌ ๊ณ์ธต์ ๊ด๋ฆฌํ๊ณ Redux์์ ๋ง์ ์์ฉ๊ตฌ๋ฅผ ์ ๊ฑฐํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์คํ ์์ค๋ก ์ ๊ณตํ์ต๋๋ค. ์ฐ๋ฆฌ์๊ฒ ์ฑ๊ณต์ ์ธ ๊ฒ์ผ๋ก ์ ์ฆ๋์์ง๋ง ์ง์ ์ฌ์ฉํด๋ณด์ญ์์ค: https://github.com/Brigad/redux-rest-easy/ (์ค๊ฐ ๊ธฐ์ฌ: https://engineering.brigad.co/introducing-redux-rest-easy -6e9a91af4f59)
redux ์์ฉ๊ตฌ๋ฅผ ์ค์ด๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ค๋ ๋์ ๋งค์ฐ ๋ค๋ฆ์ ๊ดด์ฌ๋ก, ์ผ๋ง ์ ์ ๋๋ "๋ณด์ผ๋ฌ ํ๋ ์ดํธ"๊ฐ ์ฌ๋๋ค์๊ฒ ์๋ฏธํ๋ ๋ฐ์ ๋ํด Twitter์์ ํผ๋๋ฐฑ์ ์์ฒญํ์ต๋๋ค.
๋คํฌ๋ก ์ค๋ ๋์ ๊ทํ!
์ด ์ค๋ ๋์ ์ฒซ ๋ฒ์งธ ์ฃผ์์ ํธ์งํ ๊ฒฐ๊ณผ ์ฌ๊ธฐ์์ ๋ ผ์๋ ์์ด๋์ด๊ฐ Redux-Starter-Kit ํจํค์ง ๋ก ๋ฐ๋์์ต๋๋ค. ์ฌ์ฉํด ๋ณด๊ณ Redux ์ฌ์ฉ์ ๋จ์ํํ๋ ๋ฐ ์ผ๋ง๋ ๋์์ด ๋๋์ง ํ์ธํ์ธ์!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๊ทธ๊ฒ์ด ๋์๊ฒ ๋ฌ๋ ค ์๋ค๋ฉด ๋๋ ์ด๊ฒ์๋ณด๊ณ ์ถ์ต๋๋ค :
mapStateToProps
๊ตฌํ ์ ๊ณต).๋ฌผ๋ก ํต์ฌ ์ธ์๋ ๊ณต์ Redux๋ก ๋ธ๋๋ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ํ, ๋๋ ์ด๊ฒ์ ์ฐ์ง ์์ ๊ฒ์ ๋๋ค. ํ์ง๋ง ๋น์ ์ ํ ์ ์์ต๋๋ค.