Redux ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ํ๋ก์ฐํ๊ณ ์์ง๋ง ์์ง ์์ธํ ๋ค๋ฃจ์ง ์์๊ฑฐ๋ ๊ธฐ๋ณธ์ ์ธ ์ธก๋ฉด์ ๋ํด ํผ๋์ค๋ฌ์ํ๋ค๋ฉด Egghead๊ฐ ๋ด Redux ์์ํ๊ธฐ ์๋ฆฌ์ฆ๋ฅผ ์ถํํ๋ค๋ ์ฌ์ค์ ์๊ฒ ๋์ด ๊ธฐ์ ๊ฒ์ ๋๋ค.
๋ฌธ์์ "๊ธฐ๋ณธ" ๋ถ๋ถ๊ณผ ๋์ผํ ์ฃผ์ ๋ฅผ ๋ค๋ฃจ์ง๋ง ์กฐ๊ธ ๋ ๊น์ด ํ๊ณ ๋ค์ด Redux ๊ธฐ๋ณธ ์ฌํญ์ _์ ๋ง__ ์ดํดํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ด๋ฒ์๋ ๊ตฌ๋ ์ ์ ์ฉ Redux on Egghead์ ๋ํด ๋ ๋ง์ ์ฝํ ์ธ ๋ฅผ ๋ง๋ค ๊ณํ์ ๋๋ค. ๊ทธ๊ฒ์ ๋ ๊ณ ๊ธ ์ฃผ์ ๋ฅผ ๋ค๋ฃฐ ๊ฒ์ ๋๋ค. ํน์ ์ ์ ์ฌํญ์ด ์์ผ๋ฉด ์ด ์ค๋ ๋์์ ์๋ ค์ฃผ์ธ์!
:+1:
:+1:
์๋ฆฌ์ฆ์ ์ฒ์ 16๊ฐ ์ํผ์๋๋ฅผ ๋ฐฉ๊ธ ๋ณด์๊ณ ๋ด๊ฐ ์ผํ๋ ํ์ฌ์์ ๋ด๋ถ ๊ต์ก์ ์ฌ์ฉํ ์ ์๋ ํ๋ฅญํ ๋ฆฌ์์ค๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ํ ํธ๋ฆฌ์ ๋ํด ์ผ๋ฐ ๊ฐ์ฒด์ deep-freeze ๋ง ์ฌ์ฉํ๊ณ immutable-js ์ ๊ฐ์
์ด์ ๋ํ ๊ทํ์ ์๊ฐ์ ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ฏน์ค์ Immutable์ ๋์ง๋ฉด Redux์ Immutable API๋ฅผ ๊ตฌ๋ณํ๋ ๋ฒ์ ๋ฐฐ์์ผ ํ๊ฑฐ๋ Immutable์ด ํ์ํ๋ค๊ณ ๊ฐ์ ํ๋ ๋ฑ ์ด๋ณด์๋ฅผ ํผ๋์ค๋ฝ๊ฒ ํ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ช ๊ฐ์ง ๊ณ ๊ธ ๋ ์จ์ ์ํ ์ข์ ์์ด๋์ด์ ๋๋ค!
๋ฏน์ค์ Immutable์ ๋์ง๋ฉด Redux์ Immutable API๋ฅผ ๊ตฌ๋ณํ๋ ๋ฒ์ ๋ฐฐ์์ผ ํ๊ฑฐ๋ Immutable์ด ํ์ํ๋ค๊ณ ๊ฐ์ ํ๋ ๋ฑ ์ด๋ณด์๋ฅผ ํผ๋์ค๋ฝ๊ฒ ํ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ช ๊ฐ์ง ๊ณ ๊ธ ๋ ์จ์ ์ํ ์ข์ ์์ด๋์ด์ ๋๋ค!
์๊ฒ ์ต๋๋ค. ์ด ๊ฒฐ์ ์ ๋ํ ๊ทํ์ ์๊ฐ์ ์๋ ๊ฒ์ด ์ข์ต๋๋ค :-).
@smashercosmo๊ฐ ๋งํ ๊ฒ:+1:
๋จ์ ํ ์คํธ. TDD.
@catland๊ฐ ๋งํ ๊ฒ:+1:
์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๊ด๋ฒ์ํ ๋ฌธ์์ ๊ฐ๊ฒฐํ ํํ ๋ฆฌ์ผ์ ํตํด ์ฐ์ํ js ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํ ์ ์๋ ๋น์ ์ ๊ธฐ์ ์ ๊น์ ์ธ์์ ๋ฐ์์ต๋๋ค.
๋ชจ๋ ๋น๋์ค๋ฅผ ๋ณธ ํ ์ฐํธ์ผ๋ก ๋ณด๋ผ ํน์ ๋น๋์ค์ ๋ํ ๋ง์ ํผ๋๋ฐฑ์ ๋ฐ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฒฐ๋ก ์ ์ด๊ฒ์ด Redux์ ๋ํ ์๊ฐ ๊ทธ ์ด์์ด๋ผ๋ ๊ฒ์ ๋๋ค. ์ฝ๋ ์ฌ๋ก ๋ฐ ๊ตฌ์ฑ ์์ ์ํคํ ์ฒ ๋ฑ์ ๋ค๋ฃน๋๋ค. ์ ๋ง ๋๋จํ๊ณ ๋งค์ฐ ๊ต์ก์ ์ ๋๋ค. ๊ทธ๋๋ ๋์์์ ์ธ ๊ทธ๋ฃน์ผ๋ก ๋๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. Redux basic, redux ๋นํ์ธ๋ ์คํ ๋ฆฌ, redux with react.
ํฅํ ๋น๋์ค์์๋ ํน์ ๊ฐ๋ ์ ๋ํ ๋ฐ์์ ์ค์ด๊ณ ๋น๋๊ธฐ ์์ ๋ฐ ํ ์คํธ์ ๋ํด ๋ ๋ง์ด ๋ณด๊ณ ์ถ์ต๋๋ค.
๋๋๋๋ก ์ํ์ต๋๋ค. ๊ณ์ํ์ญ์์ค! :)
๋น๋์ค 21์์ TodoApp ๊ตฌ์ฑ ์์๋ ๋ ์ด์ ํด๋์ค์ผ ํ์๊ฐ ์์ผ๋ฉฐ ํจ์์ผ ์ ์์ต๋๋ค. ์ด๋ป๊ฒ ์ด๋ฌํ ๊นจ๋ฌ์์ ์ป์๋์ง ์ค๋ช ํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ์ ์ด๊ฒ์ด ๊ธฐ๋ฅ์ ๊ตฌ์ฑ ์์์ ์ ํฉํ ํ๋ณด์ด๋ฉฐ ์ด๊ฒ์ด ์ด๋ค ์ด์ ์ ์ ๊ณตํฉ๋๊น?
์ด๊ฑฐ ์ ๋ง ์ข๋ค.
@smashercosmo ๋ชฉ๋ก์ ํญ๋ชฉ 3๋ ์๊ณ ์ถ์ต๋๋ค.
@wpannell์ด ๋งํ ๊ฒ! ๋จ์ ํ ์คํธ/TDD!
๊ณ ๊ธ ๋ฌธ์์์ ๋ค๋ฃจ๋ ์ฃผ์ ์ ๋ํ ๋น๋์ค๋ ๋ณด๊ณ ์ถ์ต๋๋ค.
๋จ์ ํ
์คํธ์ ๊ด๋ จํ์ฌ ๊ตฌ์ฒด์ ์ผ๋ก ๋ฌด์์ ๊ด์ฌ์ด ์์ต๋๊น?
5, 11, 12๊ณผ์์๋ ๊ฐ์๊ธฐ๋ฅผ ๋จ์ ํ
์คํธํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ด๋์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
...๊ทธ๊ฑด ์ข์ ์ง๋ฌธ์ด์ผ. ๋ชจ์นด ํ ์คํธ๋ฅผ ํ๋ฉด ๊ณผ์ ์ด ๋ง์ด ๋ฌ๋ผ์ง๋์?
์ค๋ง. ๊ทธ๋ฌ๋ ๋๋ ๊ทธ๊ฒ์ด ์ผ๋ จ์ ๊ณ ๊ธ ์์ ์ ์ํ ์ข์ ์ฃผ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋จ์ ํ ์คํ ๋ฆฌ๋์, ์ก์ ์์ฑ๊ธฐ, ์ปดํฌ๋ํธ ๋ฑ
์ฒซ์งธ, ํ๋ฅญํ ๋น๋์ค. ์ด๋ฏธ redux๋ฅผ ์ดํดํ์ง๋ง ์์พํ์ต๋๋ค.
๋ ๊ณ ๊ธ ๋น๋์ค๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ ๋น๋๊ธฐ ์์
/๋ฏธ๋ค์จ์ด๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
๋จ์ ํ
์คํธ์ ์ค์ ๋ก ์ ์ฉ ๋ฒ์๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํ์ง ๋ง์ญ์์ค. ๊ฐ์๊ธฐ ๊ธฐ๋ฅ์ ํธ์ถํ๊ณ ์ด์ ๋ํด ์ฃผ์ฅํ ์ ์์ต๋๊น?
์, ๋ชจ์นด ํ
์คํธ์์ expect
๋ํํ๋ ๊ฒ ์ธ์๋ ๋ณ ๋ค๋ฅธ ๊ฒ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. :์์ง์๊ฐ๋ฝ:
๊ณ ๋ง๊ฒ๋ ๋ชจ๋ ๊ฒ์ด ๋๋ฌด ๊ฐ๋จํฉ๋๋ค!
๊ฐ์ฒด ID ํด์์ ๋ถ๋ณ์ฑ(์: [post._id]: {...post}
).
API ์ํฐํฐ ๋ฐฐ์ด์ ๊ฐ์ ธ์์ ID ํด์๋ฅผ ์์ฑํ๊ธฐ ์ํด reduce
ํจ์์ ๋๋ฌด ๋ง์ด ์์กดํ๊ณ ์์ต๋๋ค. normalizr ์ด ์ด ์ค ์ผ๋ถ๋ฅผ ์ฒ๋ฆฌํ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง A ์ง์ ์์ B ์ง์ ์ผ๋ก ์๋ดํ๋ EggheadIO ๋น๋์ค์ ์ ์ฌํ ๋น๋์ค๋ฅผ ์ํฉ๋๋ค. ์ด๋ Redux ๊ธฐ๋ฐ์๋ง ์๋ ๊ฒ์ด ์๋๋ผ ์ฝํ ์์ต๋๋ค.
@raquelxmoss
๋น๋์ค 21์์ TodoApp ๊ตฌ์ฑ ์์๋ ๋ ์ด์ ํด๋์ค์ผ ํ์๊ฐ ์์ผ๋ฉฐ ํจ์์ผ ์ ์์ต๋๋ค. ์ด๋ป๊ฒ ์ด๋ฌํ ๊นจ๋ฌ์์ ์ป์๋์ง ์ค๋ช ํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ์ ์ด๊ฒ์ด ๊ธฐ๋ฅ์ ๊ตฌ์ฑ ์์์ ์ ํฉํ ํ๋ณด์ด๋ฉฐ ์ด๊ฒ์ด ์ด๋ค ์ด์ ์ ์ ๊ณตํฉ๋๊น?
๊ทธ๊ฒ์ ์ค์ ๋ก ๋ด ์ชฝ์์ ์ฝ๊ฐ์ ์กฐ์กํ ์์
๊ณํ์ด์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ฒ์๋ถํฐ ๊ธฐ๋ฅ์ ๊ตฌ์ฑ ์์๋ก ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ ๋๋ฌด ๋ฆ๊ฒ๊น์ง ๊นจ๋ซ์ง ๋ชปํ์ต๋๋ค. ํด๋์ค๋ณด๋ค ํจ์๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ ๋จ์ํ๋ฏ๋ก ๊ฐ๋ฅํ๋ฉด ์ธ์ ๋ ์ง ์ด ์์
์ ์ํํ์ญ์์ค. ๊ธฐ๋ณธ์ ์ผ๋ก componentDidMount
๋๋ ์ํ์ ๊ฐ์ ์๋ช
์ฃผ๊ธฐ ํํฌ๊ฐ ํ์ํ์ง ์์ ๊ฒฝ์ฐ ๊ธฐ๋ฅ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋์์ด ๋๋๋ก ์ด๋ฌํ ์ฝ๋ ์กฐ๊ฐ์ ์ค์ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ก ๋ถํ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ตํ์ ์ฐพ์ ์ ์์ต๋๋ค. ๋ชจ๋ ๊ฒ์ด ์๋ ํ ์๋ง ์๋ํ ๊ฒ์ด์ง๋ง ํด๋ ์ด๋ฆ ์ง์ ๊ท์น(๊ตฌ์ฑ ์์/์ปจํ ์ด๋/์ ์ฅ์/๋ฆฌ๋์ ๋ฑ), ์ด๋ค ์ข ๋ฅ์ ํ์ผ์ด ์ด๋ค ํด๋์ ๋ค์ด๊ฐ๋์ง ๋ฑ์ ๋ํ ๊ถ์ฅ ๊ท์น์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
๋ํ ๊ณ ๊ธ ๊ฐ์๊ธฐ ๊ตฌ์ฑ์ ์ํฉ๋๋ค.
๋ณต์กํ ๊ตฌ์ฑ ์์ ์ฌ์ฌ์ฉ(๋ฆฌ๋์ ๋๋ ์ฌ๋ฌ ๋ฆฌ๋์, ์ผ๋ จ์ ์์ , ์์ ์์ฑ์, ์ผ๋ถ ์๋ฒ ์ธก API์ ์ก์ธ์ค, redux ํ์๊ณผ ๊ฐ์ ์ฌ๋ฌ React ๊ตฌ์ฑ ์์๋ก ๊ตฌ์ฑ๋์ง๋ง ๋ ์ค์ ์ฑ์ ๊ณ ์ ํจ). ์ฌ๊ธฐ์๋ ๋ชจ๋์ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ ๊ตฌ์ฑ๋ ํฌํจ๋ฉ๋๋ค.
์ ์ฒด๋ฅผ ๋ณด์๋ค, ์์ฃผ ์ข์! ES6/7 ๊ตฌ๋ฌธ( Object.assign
-like), React 0.14 ํจ์ ๊ตฌ์ฑ ์์์ ์ฌ์ฉ ๋ฐ ๋ถ๋ณ์ ๊ฒ์ ํผํ๋ ๊ฒ์ ๊ฐ์ฌํ์ต๋๋ค.
๊ถ์ฅ๋๋ ์ฝ๋ ์ํคํ ์ฒ๋ฅผ ์ค๋ช ํ๋ ๋น๋์ค์ผ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ES6/7 ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋๋ก ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํ์๊ฒ ์ต๋๊น? (๊ทธ ๋ฐฉํฅ์ผ๋ก PR์ ํ์ํฉ๋๊น?)
๋จ์ ํ ์คํธ, API ๋ฏธ๋ค์จ์ด ์์ฑ, Redux๋ก OAuth/์ผ๋ถ ์ ํ์ ์ฌ์ฉ์ ์ธ์ฆ ์ํ, redux์์ Immutable ์ฌ์ฉ(์ค์ ๋ฐฉ๋ฒ, ๋ชจ๋ฒ ์ฌ๋ก ๋ฑ)
์ด ์๋ฆฌ์ฆ๋ ๋จ์ผ ์์ ์ํ์ธ Redux ๋ฐ ๊ด๋ จ ์ฒ ํ์ ๋ํ ํ๋ฅญํ ์๊ฐ ์ญํ ์ ํฉ๋๋ค. ๋๋ ๋น์ ์ด ์ธ์ง ๊ณผ๋ถํ๋ฅผ ์ ๋ฐํ๋ ๊ฒ์ ํผํ๋ฉด์ ํต์ฌ ์์น์ ๊ท๋ฅผ ๊ธฐ์ธ์ด๋ ์ผ์ ์ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค. ์์ ํ ํ๊ฒฝ๋ ์ฝ๊ฒ ๋ณต์ ํ ์ ์์ผ๋ฏ๋ก ์ค์ต ๋ถ๋ถ์ ๋์ฑ ์ฝ๊ฒ ์ ๊ทผํ ์ ์์ต๋๋ค.
@gaearon ์์ ์์์์ ์ก์
์ ์ฒ์๋ถํฐ ํ์ค์ ์ธ { type: string, payload: Object }
๋ก ๊ตฌ์ฑํ๋ ๊ฒ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์๋์? ํ์ด๋ก๋๊ฐ ์์
๊ฐ์ฒด ์์ฒด์ ๋ฐฐ์น๋๋ ์นด์ดํฐ ๋ชฉ๋ก ์์ ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค. { type: string, index: number }
. ์ด๊ฒ์ ๋์๊ฒ ์ํฐ ํจํด์ฒ๋ผ ๋ณด์
๋๋ค.
์์ ๋น๋์ค์ ์์ ์ ์ฒ์๋ถํฐ ํ์ค { type: string, payload: Object }์ผ๋ก ๊ตฌ์ฑํ๋ ๊ฒ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น? ํ์ด๋ก๋๊ฐ ์์ ๊ฐ์ฒด ์์ฒด์ ๋ฐฐ์น๋๋ ์นด์ดํฐ ๋ชฉ๋ก ์์ ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค. { ์ ํ: ๋ฌธ์์ด, ์์ธ: ์ซ์ }. ์ด๊ฒ์ ๋์๊ฒ ์ํฐ ํจํด์ฒ๋ผ ๋ณด์ ๋๋ค.
์ด๋ค ์์ผ๋ก๋ ์ํฐ ํจํด์ด ์๋๋๋ค. ์ผ๋ฐ์ ์ธ ์ก์ ์ค๋ธ์ ํธ์ ๋๋ค. FSA ๋ ๊ด์ฐฎ์ง๋ง _์ปจ๋ฒค์ _์ ๋๋ค. Redux ์์ฒด์ ์ด๋ค ๊ฒ๋ ์ด ๊ท์น์ ์ด์ ์ ์์กดํ์ง ์์ผ๋ฏ๋ก ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์ํํ๊ณ ์ถ์ง ์์ต๋๋ค.
์ฌ๋๋ค์ ์๋ Flux ๋ฌธ์์์ payload
, source
์ ๋ํด ์จ๊ฐ ๋ง๋ฒ ๊ฐ์ ๊ฒ์ ์๊ฐํ๊ณค ํ์ต๋๋ค. ๊ทธ๊ฒ๋ค์ด ์กด์ฌํ๋ ์ด์ ๋ฅผ ์ดํดํ์ง ๋ชปํ๊ณ ๊ทธ๊ฒ๋ค์ด ํ์ํ์ง ์ฌ๋ถ๋ฅผ ์ ์คํ๊ฒ ํ๊ฐํ์ง ์๊ณ ๋งน๋ชฉ์ ์ผ๋ก ๋ณต์ฌํ์ต๋๋ค. ๋์ค์ ๊ทธ๋ค์ Flux๊ฐ ๋ณต์กํ๊ณ ์ฅํฉํ๋ค๊ณ ๋ถํํ์ง๋ง ์ค์ ๋ก ๋ง์ ๊ฒฝ์ฐ ์ฅํฉํ(ํ์๋ ์๋) ๋ถ๋ถ ์์ฒด๋ฅผ ๋ณต์ฌํ์ต๋๋ค.
์ด ์์ ์์๋ Redux์ ํ์ ๋ถ๋ถ๋ง ๊ฐ๋ฅด์นฉ๋๋ค. ๋ด๊ฐ ์์๋ฅผ ์๊ฐํ์ง ์๋ ๋ฐฉ๋ฒ์ ์ฃผ๋ชฉํ์ธ์. ์ฌ๋๋ค์ด ์์์ ๋๋ฌด ๋ง์ด ์ง์คํ๊ณ ์ค์ํ์ง ์๋ค๋ ์ฌ์ค์ ๋์น๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฒ์๋ถํฐ ํํ ๋ฆฌ์ผ ๋น๋์ค์ ๋ฃ๋ ๊ฒ๋ณด๋ค ๋ฌธ์์ด์ ๋ช ๊ฐ์ง ์คํ๋ฅผ ๋ง๋ ํ์ ์์์ ์ด์ ์ ์ดํดํ ๊ฐ๋ฅ์ฑ์ด ๋ ํฝ๋๋ค. FSA์ ๊ฐ์ ๋ค๋ฅธ ์ปจ๋ฒค์ ๋ ๋ง์ฐฌ๊ฐ์ง๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํธ๋ฆฌํ๋ค๊ณ ์๊ฐ๋๋ฉด ๊ผญ ์ฌ์ฉํ์ธ์. ํ์ง๋ง ์์ ์์ ์๊ตฌํ์ง ์๋ ๊ฒฝ์ฐ์๋ ์ค๊ตํ์ง ์๊ฒ ์ต๋๋ค.
@gaearon ์ข์ต๋๋ค . ๋จ์ํ ๋น์ ํ ์ ๊ทผ ๋ฐฉ์์ ์ต์ํด์ง ์ฌ๋๋ค์ด ๊ท์น์ ์ ์ฉํ์ง ์์์ผ๋ก์จ ๋ ํฐ ์ฑ์ ๊ด๋ฆฌํ ์ ์๊ฒ ๋ง๋ค์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@sompylasar
๋๋ ์์ ๊ฐ ๋น๋์ค ํํ ๋ฆฌ์ผ๋ณด๋ค ๊ท์น์ ๋ ์ ๋ณด์ฌ์ค๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ "์ฌ๊ธฐ์ ์ด๋ฌํ ์์น์ ์ค์ฌ์ผ๋ก ์ผ๋ถ ์ฝ๋๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค"๋ผ๋ ๋ ๋จ์ ์ธ ์์ญ์ด ์์ผ๋ฉฐ ๋น๋์ค๋ ์ด๋ฌํ ์์น ์์ฒด์ ๋ํ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ด ๋ค๋ฅธ ์์์ ๋ค๋ฅธ ๊ท์น์ ๋ณผ ์ ์๋ ์ด์ ์ด๋ฉฐ ํ๋ก์ ํธ๋ฅผ ์์ํ๊ธฐ ์ ์ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋ง๋ณด๊ธฐ ์ํด ๋ค๋ฅธ ์๋ฅผ ์ดํด๋ด ๋๋ค.
๋ํ FSA๋ฅผ ๋ฐ๋ฅด์ง ์๋ ๊ฒ์ ๋ํด ๊ตฌ์กฐํ๋์ง ์์ ๊ฒ์ ์ ํ ์์ต๋๋ค. { type: 'STUFF', id: 1 }
๋ ๋ณธ์ง์ ์ผ๋ก { type: 'STUFF', payload: { id: 1 } }
๋ณด๋ค ๋์์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ทจํฅ๊ณผ (๋๋ก๋) ๋๊ตฌ ๊ท์น์ ๋ฌธ์ ์ผ ๋ฟ์
๋๋ค. ์์
๊ฐ์ฒด๋ฅผ payload
์ ๊ฒ ์ ์งํ๋ค๊ณ ํด์ ์์
ํ๊ธฐ๊ฐ ๋ ์ด๋ ค์์ง๋ ๊ฒ์ ์๋๋๋ค.
๊ณง ์๊ทธํค๋์ ๋ํ ๋ช ๊ฐ์ง redux ๋จ์ ํ ์คํธ ๊ฐ์๊ฐ ๋์ฌ ์์ ์ ๋๋ค ๐
Dan์ด ์ฒซ ๋ฒ์งธ ํฌ๋์ ํ ์ ์๋๋ก ํ๋์ Redux ์์ ์ ๋ณด๋ฅํ์ต๋๋ค. ๊ธฐ๋ค๋ฆด๋งํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
"Idiomatic Redux๋ก ์ ํ๋ฆฌ์ผ์ด์ ๋น๋"๋ ํ๋ฅญํ ๊ณ ๊ธ ๊ณผ์ ์ด ๋ ๊ฒ์ ๋๋ค ๐
@joelhooks ๋ ๋ค ๋๋์ต๋๋ค!
jsbin์ ์ฌ์ฉํ๋ ๋์ webpack๊ณผ ํซ ๋ฆฌ๋ก๋ฉ์ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ์ค์ ํ๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ต๋๋ค. ์ด๊ฒ์ ํ์ค ์ธ๊ณ๋ก ๊ฐ์ ธ ๊ฐ๋ผ. ๋๋ ๊ทธ๊ฒ์ด redux์๋ง ๊ตญํ๋์ง ์๋๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๊ทธ๊ฒ์ด ์ ๋ง์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ณ ๋น์ ์ด ์ด๊ฒ์ ๊ฐ๋ฅด์น ์ ์์์ ๋๋ค :)
@kevinrenskers์ด ๋น๋์ค ์๋ฆฌ์ฆ ์๋์ง๋ง, ๋น์ ์ด ๋ญ๊ฐ๋ฅผ ํด๋ถ ๊ฐ์ ๋๋ ๊ฒฝ์ฐ ๊ฐ ์์ต๋๋ค ๋ช ๊ฐ์ง ์ฐธ์กฐ ํ ์์๋ ์ ๋ง ์ข์ ์ boilerplates๊ฐ!
Dan์ ์์ ์ Webpack ๊ตฌ์ฑ์ ๋ํ ํ๋ก์ ํธ ๊ตฌ์กฐ๋ฅผ ์์ฒญํ์ ๋ถ๋ค์ ๋๋ค.
https://github.com/urbanvikingr/todo๋ฅผ ํ์ธ
๋๋ ๋น๋์ค์์ Dan์ ์ฝ๋์ ์ผ์นํ๋๋ก Redux๋ฅผ React ๋ฌธ์๋ก ์ ๋ฐ์ดํธํ๊ธฐ๋ก ์ฝ์ํ์ต๋๋ค. ๊ทธ๊ฒ์ ๋ค์ 2์ฃผ ์์ ์๋ฃ๋ ๊ฒ์ ๋๋ค - ๋์ Holiday ํ๋ก์ ํธ :) - ๊ณ์ ์ง์ผ๋ด ์ฃผ์ญ์์ค.
Egghead.io ๋น๋์ค์ ๋ํ ๋์ ์์๋ฆฌ์คํธ:
Jasmine์ ์ฌ์ฉํ ์ก์
/๋ฆฌ๋์ ํ
์คํธ
๋ฏธ๋ค์จ์ด์ ๋ํ ์ฌ์ธต ๋ถ์(thunk/promise)
์คํฌ๋ฆฐ์บ์คํธ๋ Redux์ ๋ํ ๋งค์ฐ ์ ์ฉํ ์๊ฐ์ ๋๋ค. ๋ด๊ฐ ๋ฃ๊ณ ์ถ์ ๊ฒ์ ๋ผ์ฐํ ๋ฐ ์๋ฒ ์ธก ๋ ๋๋ง์ ์ํํ๋ Redux ๋ฐฉ์์ ๋๋ค.
@grigio ๋ผ์ฐํ ์ ๋ํ https://github.com/rackt/redux/issues/1145 ํ ๋ก ์ ๊ด์ฌ์ด ์์ ์ ์์ต๋๋ค.
@urbanvikingr ๊ฐ์ฌํฉ๋๋ค, ๊ตฌ๋ ํ์ต๋๋ค. ํฌํ๊ฐ ์ข ๋ฃ๋ ๊ฒ ๊ฐ์ง๋ง #1168์ ํฌํํ์ ๊ฒ์ ๋๋ค.
์์ ์ ์ค์ ๋ก ๊ฝค ์ข์๋ฐ "๊ฐ๊ฒ"๋ผ๊ณ ํ๋ฉด "ํ์ฐฎ์ ์ผ"์ฒ๋ผ ๋ค๋ฆฐ๋ค๋ ์ ์ด ์ฃผ์๋ฅผ ์ฐ๋งํ๊ฒ ํฉ๋๋ค.
์ฌ๊ธฐ ์๋ ๋ชจ๋ ์ฌ๋๋ค์ ๊ทธ๊ฒ์ ๋์น์ฑ๊ณ ์ฃผ์๋ฅผ ๋ถ์ฐ์์ผฐ์ต๋๋ค. ๊ทธ๋ค์ ๊ทธ๊ฒ์ ์ ๊ธฐํ๊ธฐ์๋ ๋๋ฌด ์ ์น์ ์ผ๋ก ์ณ์ต๋๋ค. ๊ทธ๋์ ์, ๋๋ _๊ทธ_ ์ฌ๋์ด ๋๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋์ด ํ์ง ์์ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด :)
๋๋ ๊ฒฐ๊ตญ ์์ด๋ฅผ ๋ ์ํ๊ฒ ๋ ๊ฒ์ด๋ค. ํ์ฌ๋ก์๋ ์ด๊ฒ์ด ๋ด๊ฐ ํ ์ ์๋ ์ต์ ์ ๋๋ค ;-)
@gaearon Redux์ ๋ํ ์ค๋ช ์ ์ ๋ง ์ ํ์ จ์ต๋๋ค. ๊ทํ์ ๊ทํ์ ์คํ ์์ค ์ฑ๊ณผ์ ๊ฒฝ์๋ฅผ ํํฉ๋๋ค.
๋๋ผ์ด ์์ ์ธํธ. ํนํ "์์ค ์ฝ๊ธฐ" ๋ฐฉ์์ผ๋ก ์ฒ์๋ถํฐ ๊ฐ ํต์ฌ Redux ๊ธฐ๋ฅ์ ๋ค์ ๊ตฌํํ๋ ๋ฐฉ์์ด ๋ง์์ ๋ค์์ต๋๋ค. ํํ ๋ฆฌ์ผ๊ณผ ๋ชจ๋ ๋ฌธ์๊ฐ Redux์ ๋ํด ์ผ๋ง๋ ๋ช ํํ์ง ๊ฐ๋ํ ๋ค๋ฅธ ์ฌ๋์ ๋ ๋ฒ์งธ๋ก ์๊ฐํฉ๋๋ค. ์ง๊ธ๊น์ง 2๋ ๊ฐ์ ํ๋ก ํธ์๋ ๋ฐ์ ์ ๋ฐ๋ผ์ก๋ ์ฌ๋์ผ๋ก์ ๊ฐ๋ ์ ๋ด ๋ง์์ ๊ฐ์ธ๊ธฐ๊ฐ ์ด๋ ค์ ์ง๋ง ๋ฌธ์๋ ๊ทธ๋ ๊ฒ ํ๋ ๋ฐ ๋๋ผ์ธ ์ ๋๋ก ๋์์ด ๋์์ต๋๋ค. ๊ณ์ ํด ์ฃผ์ธ์. ๊ฐ์ฌํฉ๋๋ค!
(๋ํ @jugimaster์ ๋ง์ ๋ฃ์ง ๋ง์ญ์์ค. ๋ชจ๋ ์ฌ๋์ด ๋น์ ์ ์ต์์ ์ฃผ์๋ฅผ ์ฐ๋งํ๊ฒ ํ๊ณ "๋๋ฌด ์ ์น์ ์ผ๋ก ์ฌ๋ฐ๋ฅด
@ianstormtailor
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ๊ทธ๊ฒ์ ์
์ผํธ๊ฐ ์๋๋๋ค :)
๋๋ "์ ๊ฒฝ์ฐ์ง" ์์์ง๋ง, ํ์คํ ์ฃผ์๊ฐ ์ฐ๋งํด์ก์ต๋๋ค!
ํ์ง๋ง ํํธ์ผ๋ก๋ 6๊ฐ ๊ตญ์ด๋ฅผ ๊ณต๋ถํ ์ฌ๋์ผ๋ก์ ํญ์ ์ธ์ด๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๋งํ๋ ๊ฒ์ _ํด์์ต๋๋ค_. ๊ทธ๋ฐ ์ ์์ ๋๊ตฐ๊ฐ๊ฐ ๋ด ์ค์๋ฅผ ์ง์ ํด์ค์ ๊ฐ์ธ์ ์ผ๋ก ๊ณ ๋ง๊ฒ ์๊ฐํฉ๋๋ค.
์๋ ํ์ธ์ @gaearon ๋
๋น์ ์ ์ฝ์ค๋ฅผ ์ ๋์ ์ผ๋ก ์ข์ํ์ต๋๋ค. ์ ํ์ด! ๋งค์ฐ ๋์์ด ๋์์ต๋๋ค.
์ต๊ทผ Egghead ๊ณผ์ ์ ์ธ ๊ฐ์ง Redux ํ
์คํธ ๋น๋์ค ์์
์ ์ถ๊ฐํ์ต๋๋ค.
https://egghead.io/series/react-testing-cookbook
๋ด ํฌ๋ง์ ๊ทธ๋ค์ด ๋น์ ์ด ํ ๋ชจ๋ ๋๋ผ์ด ์ผ์ ๋ํด ์นญ์ฐฌ์ ํด์ฃผ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค!
ํ์คํ ์ฝ์ค!
Redux ์ง์๋ฟ๋ง ์๋๋ผ ํ๋์ ๊ดํ ์ง์์ ์ ๋ฐ์ ์ผ๋ก ํฅ์์ํต๋๋ค! ๊ณ์ ์ข์ ์ผ๋ง ํ์ธ์ :+1: :tada:
์ด๋ด, ๋ฐฉ๊ธ ๋น๋์ค์ ์ฝ๋์ ๋ํ ๋งํฌ/์ฐธ์กฐ๊ฐ ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. ์ด์ฉ๋ฉด ๋ช ๋ฐฑํ๊ณ ์๋ง๋ ์ถฉ๋ถํ ๊ฐ๋จํ ์ฌ์ฉ์๋ ๋น๋์ค๋ฅผ ๋ณต์ฌํ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ง์ ์ฌ๋๋ค์ด ๋์์์ ์ ํํ ์ฝ๋๊ฐ ์๋ ์ ์ฅ์๋ฅผ ํตํด ์ด์ ์ ์ป์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ์ ๋ ๊น์?
๋ชจ๋ ๊ฐ์์ ๋ํ ์ฝ๋ ์ค๋ํซ์ Egghead ๊ตฌ๋
์์๊ฒ ์ ๊ณต๋ฉ๋๋ค. :-)
๋น๋์ค๋ ๋ฌด๋ฃ์ง๋ง ํ๋ซํผ์ ๋์ ๋ฒ์ด์ผ ๋ ๋ง์ ์ฝ์ค์ ํฌ์ํ๊ณ , ๊ฐ์ฌ์๊ฒ ์ฅ๋น๋ฅผ ๋ณด๋ด๊ณ , ๋น๋์ค๋ฅผ ํธ์คํ
ํ๊ณ , ์น ์ฌ์ดํธ๋ฅผ ๊ฐ์ ํ๋ ๋ฑ์ ์์
์ ์ํํ ์ ์์ต๋๋ค.
์ฆ, ์ฝ์ค์ ๊ฑฐ์ ์ผ์นํ๋ examples/todos
ํด๋๊ฐ ์์ต๋๋ค.
... ์ข์, ๊ทธ๋ผ ๋ด๊ฐ ๋์น๊ฑฐ์ผ? ๋งํฌ๋ฅผ ์ฐพ๋ ์ค...
@gaearon์ด ์ฌ๊ณผํ๊ณ ๋ฐฉ๊ธ ๋น๋์ค๋ฅผ ๋ค์ ๋ฐฉ๋ฌธํ์ต๋๋ค. ์ฝ๋๋ ๋ฐ๋ก ๊ฑฐ๊ธฐ์ ์์ต๋๋ค :)... ๋์์์ ๋ณด๊ณ , ๋ฉค๋ฒ์ญ์ ๊ตฌ๋งคํ๊ณ , ๋ค๋ฅธ ์ฌ๋์ ๋ณด๊ณ ... ์ค์ ๋ก ๋ก๊ทธ์ธํ redux ๋์์์ผ๋ก ๋์๊ฐ์ต๋๋ค. ๊ฑด๋ฐฐ.
๊ทธ๋ฐ๋ฐ ์ผ๋ถ ์ฌ๋๋ค์ ์ฑ์ ํ๊ฐ ์ ํํ์ง ์๋ค๊ณ ๋ถํํ์ต๋๋ค.
์์ ์ ์ํด PR์ ๋ณด๋ด์ฃผ์ญ์์ค: https://github.com/eggheadio/egghead-redux-transcripts
@gaearon redux๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๊ณ egghead์์ redux vids๋ฅผ ์ฐพ์์ต๋๋ค. ๋น๋์ค๋ ๋ด๊ฐ redux๋ฅผ ๋ฐฐ์ฐ๊ธฐ ์์ํ๋ ๋ฐ ์ ๋ง ๋์์ด ๋์์ต๋๋ค. ์์ผ๋ก ๋ ๋ง์ ์ค์ ์ฌ๋ก๋ฅผ ๋ณด๋ ๊ฒ์ด ์ข์ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ ์์ผ๋ก redux ๋น๋์ค ๊ต์ก์ ๋ํ ์ ์ ์์ ๊ณ ๊ธ ๊ตฌ์ฑ, ๋ฆฌํฉํ ๋ง์ ๋ํ ์ฌ์ธต ๋ถ์ ๋ฐ ํ์คํ reselect๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ธ์ ๋ฆฌํฉํ ๋งํด์ผ ํ๋์ง์ ๋ํ ์ง๊ด์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐ๋ผ์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ redux์ ๋งค์ฐ ๋ฐ์ ํ๊ฒ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฏ๋ก ๋ฆฌํฉํ ๋ง ์๊ธฐ์ ํ ๊ฐ์ง ์ผ์ ์ํ๋ ํจ์๋ฅผ ์๋ณํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ช ๊ฐ์ง ํ์ ์ป๋ ๊ฒ์ด ์ ๋ง ์ ์ฉํ ๊ฒ์ ๋๋ค.
๋ด๊ฐ ๋ง๋ค๊ณ ์๋ ์ฑ์๋ ์ฌ๋ฌ ๊ฐ์ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ปฌ๋ ์ ์ด ์์ผ๋ฉฐ ํ ์ด๋ธ์ ๋ฃ๊ณ ๋ฐ์ดํฐ ์ ๋ ฌ ๋ฐ ํ์ด์ง ๋งค๊น๊ณผ ๊ฐ์ ์์ ์ ์ํํด์ผ ํฉ๋๋ค. ์ ํ๊ธฐ๋ฅผ ์ฌ์ฉํ ๋์ ๋ง๋ค๊ธฐ ์์ ์ ์ฌ์ฉํ ๋๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐ ์ด๋ ค์์ด ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ํ ์ด๋ธ์์ ์ผ๋ถ ์ํ๋ฅผ "์์" ์ ์ฅํ๋๋ก ํ๊ธฐ ๋๋ฌธ์ ํ์ฌ USERS_SORT_TABLE ์์ ๊ณผ SORT_TABLE ์์ ์ด ์์ต๋๋ค. ์ฌ์ฉ์ ์ ์ฅ์๋ณ๋ก ์ ๋ ฌ๋๋ ํ ์ผ ์ ์ฅ์์ ๋ํ SORT_TABLE ์์ ์ ์ํ์ง ์์๊ธฐ ๋๋ฌธ์ ์ด ์์ ์ ์ํํ์ต๋๋ค.
๋ด ์๋ฃจ์ ์ด DRY๊ฐ ์๋๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ฌ๋ฐ๋ฅด๊ฒ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ํ์ฌ๋ก์๋ ํ ์ด๋ธ์ ์ฑ์ฐ๊ณ ์ ํ๋ ๋ชจ๋ ์์ ์ ๋ํด "SOMETHING"_SORT_TABLE ์์ ์ ์์ฑํด์ผ ํฉ๋๋ค. ์ด๋ ์๋ชป๋ ๊ฒ์ผ๋ก ์๊ณ ์์ง๋ง ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ ๋ค๋ฅธ ๋ถ์์ฉ์ ์ก์ ์ ์ด๋ฆ์ ์ ๋์ฌ๋ก ๋ถ์ฌ ๋ค๋ฅธ ์ ์ฅ์๋ฅผ ๋ถ๋ฆฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ด ์ก์ ์ด๋ฆ์ด ๊ฑฐ๋ํด์ง๊ณ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์ณ์ ์ ์์ต๋๋ค.
๋ค์์ ๋ช ๊ฐ์ง ์์ ์ฝ๋์ ๋๋ค.
/* actions.js */
// ...
export const USER_MOVE_COLUMN = 'USER_MOVE_COLUMN'
export function userMoveColumn (columnIndex, moveToIndex) {
return {
type: USER_MOVE_COLUMN,
columnIndex,
moveToIndex
}
}
export const DATA_TABLE_MOVE_COLUMN = 'DATA_TABLE_MOVE_COLUMN'
// ...
/* reducers.js */
// ...
export default function user (state=userInitialState, action) {
switch (action.type) {
// ...
case USER_MOVE_COLUMN:
return dataTable(state, assign(
action,
{type: DATA_TABLE_MOVE_COLUMN}
))
// ...
default:
return state
}
}
// ...
export default function dataTable (
state=dataTableInitialState,
action,
key='dataTable')
{
switch (action.type) {
// ...
case DATA_TABLE_MOVE_COLUMN:
return {
...state,
[key]: {
...state[key],
columns: move(
state[key].columns, action.columnIndex, action.moveToIndex
)
}
}
// ...
default:
return state
}
}
๋ฐ๋ผ์ ํ ์ด๋ธ๊ณผ "๋ชจ๋ธ" ์ ์ฅ์ ์ฌ์ด์ ์กด์ฌํด์๋ ์ ๋๋ ์ข ์์ฑ์ ์์ฑํ์์ ์ ์ ์์ต๋๋ค(๋ชจ๋ธ ์ ์ฅ์๋ ๊ฐ์ฒด ๋ฐฐ์ด์ ๋ํด ์ปฌ๋ ์ ํค๋ฅผ ์ฌ์ฉํด์ผ ํจ). ๊ทธ๋ฆฌ๊ณ dataTable์ "๋ถ๋ชจ" ๋ฆฌ๋์์ ์ํ๋ฅผ ์กฐ์ํ๋๋ฐ, ๊ทธ๋ ๊ฒ ํด์๋ ์ ๋ฉ๋๋ค. ๊ฑฐ๊ธฐ์์ ์ ํ๊ธฐ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๋ ์๊ฐ์ด ๋ค์์ง๋ง ์ด ๊ธ์ ์์ฑํ ๋น์์๋ UI์ ํ์๋๋ ๋ด์ฉ์ ๋ณ๊ฒฝํ๊ธฐ ์ํด ํฐ ์ ์ฅ์๋ฅผ ๋ณต์ ํ๋ ๊ฒ์ ํผํ๋ ค๊ณ ํ์ต๋๋ค.
๊ทธ๋์ ํ์ฌ ์ ๋ ์ด๋ฌํ ๋ฌธ์ ์ค ์ผ๋ถ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ฌ์ ํ๊ณผ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฆฌํฉํ ๋ง ๊ธฐ์ ์ ๋ฐฐ์ฐ๊ธฐ ์ํด ๊ณ ๊ตฐ๋ถํฌํ๊ณ ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ Redux ๊ณผ์ ์ ๋๋ฅผ ์ํํ๊ฒ ๋ง๋ค๊ธฐ์ ์ถฉ๋ถํ์ต๋๋ค. ์ด์ ์ ๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๊ณ ์ถ์ต๋๋ค. :)
๋๋ฌด ์ฅํฉํ์ง ์๊ณ ๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ช ํํ๊ณ ์ ์งํ ํผ๋๋ฐฑ์ ์ ๊ณตํ๋ ค๊ณ ๋ ธ๋ ฅํฉ๋๋ค.
์ ๋ฅผ ๋์์ค ์ ์๋ ๋ชจ๋ ์ข
๋ฅ์ ์ํผ์ ์ํด ์ ๋ ์ด๋ฏธ ๋ค๋ฅธ Dan์ ๋๊ธ์์ /examples/real-world/reducers
๋ฅผ ์ฐพ์์ผ๋ฉฐ ํ์ฌ ์์์ ์ค๋ช
ํ ๋ฌธ์ ์ค ์ผ๋ถ๋ฅผ ์ฌ์์
ํ๊ณ ์์ต๋๋ค. ๋ด๊ฐ ํด๊ฒฐ์ฑ
์ ์ฐพ์์ ๋ ๋์์ ์ฃผ๋๋ผ ์๊ฐ์ ๋ญ๋นํ์ง ์์์ผ๋ฉด ํฉ๋๋ค.
๊ฒฝ๊ณ ๊ฐ์ฌํฉ๋๋ค :)
๋ด ํ๋ก์ ํธ์ redux-devtools๋ฅผ ํตํฉํ๋ ๊ฒ์ ์ ์๊ฒ ํฐ ๊ณ ํต์ด์์ต๋๋ค. ๋๋ ๊ฑฐ๊ธฐ์ ๋ฌด์์ด ์๊ณ ์ด๋ป๊ฒ/์ธ์ ์ฌ์ฉํ๋์ง ์ค๋ช ํ๋ ์๊ทธํค๋ ์๋ฆฌ์ฆ๋ฅผ ๋์ด ํ๊ฐํ์ ๊ฒ์ ๋๋ค. ๋๋ ๋น์ ์ด ์ธ์ ๋ฌด์์ ์ฌ์ฉํด์ผํ๋์ง ์ค๋ช ํ๋ PR์ ์ฝ์์ง๋ง .. ๋๋ฌด ๋ง์ ๊ฒ๋ค์ด ๋๋ฌด ๋ง์์ ํผ๋์ค๋ฌ์ํ์ต๋๋ค. hmr, transform 3, redux hot reloader๋ react hot reloader ๋ฑ๋ฑ..
์์์ ์ค๋ช ํ ๋ช ๊ฐ์ง ๋ฌธ์ ๋ก ์ด๋ ค์์ ๊ฒช๊ณ ์๋ ๋ค๋ฅธ ์ฌ๋์ ์ํด Redux์ ๋ชจ๋ ์์ฉ๊ตฌ๋ ๋ฌผ๋ก ๋ค์์คํ์ด์ค ์์ ์ ๋๋ถ๋ถ ์ ๊ฑฐํ ์ ์๋ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์์ต๋๋ค. ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐ
@granteagon ์ด ์ปคํ์ ๋ฆฌ๋์์์ ์ก์ ํฌ๋ฆฌ์์ดํฐ๋ก
์ก์ /๋ฆฌ๋์ ์์ฑ ์์ ๋ํผ ๋๋ ์ถ์ํ๋ฅผ ์์ฑํ๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ํญ์ ์ง์ ์ ์ผ๋ก ํจ๊ป ๊ฒฐํฉ๋ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ๋ถ๋ช ํ, ๋ด ์ฑ์์ ์ง๊ธ๊น์ง ๋ด ์์ ์ _๋๋ถ๋ถ์_์๋ ์ ํํ ํ๋์ ์ฒ๋ฆฌ ๋ ผ๋ฆฌ ๋ฉ์ด๋ฆฌ๊ฐ ์์ง๋ง ํธ๋ฆฌ์ ์ฌ๋ฌ ๋ถ๋ถ์ ์ ๋ฐ์ดํธํด์ผ ํ๋ ๊ณณ์ด ๋ช ๊ตฐ๋ฐ ์์์ต๋๋ค.
@gaearon @markerikson ์ก์ ํฌ๋ฆฌ์์ดํฐ์ ๋ฆฌ๋์๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์๊ฐ์ 90%๋ ๊ด์ฐฎ๊ฑฐ๋ ์ฌ์ง์ด ์ํ๋ ๊ฒ์ ๋๋ค. ๋๋จธ์ง 10%๋ ์ฌ์ ํ ์์ผ๋ก ์ฝ๋ฉํ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ง์ํด์ฃผ์ ๋ถ๋ถ์ ์๊ฐํด๋ณด๊ณ ํฅํ ๋ฐ์ ์ ์ํด ๊ณ ๋ คํ๊ฒ ์ต๋๋ค.
@granteagon @gaearon
reduxr๊ณผ ์ ์ฌํ ๋ก์ปฌ ์ถ์ํ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ์ถ๊ฐ๋ ๊ฒฐํฉ์ด ์๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ์ก์ ๊ณผ ๋ฆฌ๋์ ๊ฐ์ 1:1 ๋งคํ์ ๊ฐ์ ํ๋ ๊ฒ์ ์์ต๋๋ค. ๋์ผํ ์์ ์ ์์ ํ๋ ๋ ๊ฐ์ ๋ค๋ฅธ ์ฌ๋ผ์ด์ค์ ๋ ๊ฐ์ ๋ฆฌ๋์๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
const counterReducersA = {
// this counter increments by 1 each time
increment: (state, action) => state + 1
}
const counterReducersB = {
// this counter increments by 2 each time
increment: (state, action) => state + 2
}
const counterA = reduxr(counterReducersA, 0);
const counterB = reduxr(counterReducersB, 0);
const rootReducer = combineReducers({
counterA: counterA.reducer,
counterB: counterB.reducer
});
store.dispatch(counterA.action.increment()); // increments both counters
๋ฌผ๋ก , ๊ฐ์ ์ด๋ฆ์ "๋ฆฌ๋์" ๊ธฐ๋ฅ์ด ๋ ๊ฐ ์ด์ ์๋ ๊ฒฝ์ฐ(์ฆ, ๋์ผํ ์์
์ ์๋ต), ์์์ ์ผ๋ก ๋ ๋ค ์์
ํ์ด๋ก๋๊ฐ ํน์ ๋ชจ์์ "์์"ํด์ผ ํฉ๋๋ค. ์ด๋ ์์ ํ ์ ์ฌํฉ๋๋ค. ๋ฐ๋๋ผ redux์ ๋ ๊ฐ์ ๊ฐ์๊ธฐ๊ฐ ๋ชจ๋ ๋์ผํ type
์์๋ฅผ ์ฒ๋ฆฌํ๋๋ก ํ๋ ค๋ฉด --- ๋ ๋ค ๋์ผํ ๋์ ๋ชจ์์ ๊ธฐ๋ํด์ผ ํฉ๋๋ค.
@gaearon ์ปคํ๋ง์ด ๋ฌด์จ ๋ง์ธ์ง ์ ๊ฐ ์๋ชป ์ดํด
์ฝํฌ ๊ตฌํ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ ์ ๋ฏธ๋ค์จ์ด๊ฐ ์๋ ๋น๋๊ธฐ ํ๋ฆ์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด ๋์์ด ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ค์ ๊ด๋ จ์ด ์์ง๋ง ๋ฌธ์๊ฐ ๋ฏธ์น ๋ฏ์ด ๋์์ด ๋๋ ๋์ ๋น๋๊ธฐ ํ๋ฆ ํ์ด์ง์ ์ด ์ค๋ช ์ ๋์ด์ผ ์๊ฐํด๋ณด๋ฉด ์ ๋ง ์ ๋ฅผ ํผ๋์ค๋ฝ๊ฒ ๋ง๋ค์์ต๋๋ค. "๋ฏธ๋ค์จ์ด๊ฐ ์์ผ๋ฉด Redux ์ ์ฅ์๋ ๋๊ธฐ ๋ฐ์ดํฐ ํ๋ฆ๋ง ์ง์ํฉ๋๋ค."
@battaile : ๊ทธ๊ฒ ์ฌ์ค์ด๊ธฐ ๋๋ฌธ์
๋๋ค :) ๋ฏธ๋ค์จ์ด๊ฐ ์์ผ๋ฉด ๋น๋๊ธฐ store.dispatch
๋ฅผ ํธ์ถํ ๋๋ง๋ค ์์
์ ๊ฐ์๊ธฐ ๊ธฐ๋ฅ์ผ๋ก ๋ฐ๋ก ์ด๋ํ๊ณ Go๋ฅผ ์ ๋ฌํ์ง ์๊ณ $200๋ฅผ ์์งํ์ง ์์ผ๋ฉฐ AJAX ํธ์ถ์ ์ํด ๋์ค์ ์ค์งํ์ง ์์ต๋๋ค.
์คํ ์ด ์ธํธ์๋ dispatch
์ ๊ฐ์ ๊ธฐ๋ฅ์ ์์ ์ ๋ฒ์ ์ผ๋ก ๋ง๋ฌด๋ฆฌํ ์ ์์ผ๋ฏ๋ก applyMiddleware
๋ ์ค์ ์์ ์ dispatch
๊ธฐ๋ฅ์ ๋๋ฌํ๊ธฐ ์ ์ "๋ฏธ๋ค์จ์ด ํ์ดํ๋ผ์ธ"์ ์ถ์ํ๋ฅผ ์ ๊ณตํฉ๋๋ค. . ์ด๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ค Redux ํ๋ฆ _๋ด๋ถ์์_ ์ํ๋ ๋น๋๊ธฐ ์์
์ ์ํํ ์ ์๋ ํ์ ์ ์ ๊ณตํฉ๋๋ค.
๋ฐ๋ผ์ ๋ฏธ๋ค์จ์ด ์์ด๋ ์ฌ์ ํ ์์ ํ ๋น๋๊ธฐ ์์ ์ ์ํํ ์ ์์ต๋๋ค. ๋ชจ๋ ๊ฒ์ด ์ค์ ๋ก Redux์ ๊ด๋ จ๋ ๊ฒ๊ณผ ์์ ํ ๋ณ๊ฐ๋ก ๋ฐ์ํด์ผ ํฉ๋๋ค.
๊ทธ๊ฒ์ด ์ฌ์ค์ด๊ธฐ ๋๋ฌธ์ ๋๋ค :)
๋๋ ๊ทธ๊ฒ์ด ๊ฑฐ์ง์ด๋ผ๊ณ ๋งํ์ง ์์๋ค, ๋๋ ๊ทธ๊ฒ์ด ๋๋ฅผ ๊ถค๋์์ ๋ฒ์ด๋ฌ๋ค๊ณ ๋งํ๋ค :)
๋๋ ๋จ์ง ๋ค์๊ณผ ๊ฐ์ ์ผ์ ํ๊ณ ์ถ์์ต๋๋ค.
const mapDispatchToProps = (dispatch) => ({
onclick(searchTerm) {
dispatch(actions.requestOrders(searchTerm));
return fetch('http://localhost:49984/Order/Search?search=' + searchTerm)
.then(response => response.json()).then(response => {
dispatch(actions.receiveOrders(searchTerm, response));
})
.catch((err) => {
dispatch(actions.receiveOrdersError('An error occurred during search: ' + err.message));
});
},
});
๋๋ ์ด๊ฒ์ด ์ฝ๊ฒ ์ถ์ ํด์ง ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๊ฐ๋ ์ ์ผ๋ก๋ ๋ณด๋ ๊ฒ์ด ์ ์ฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋๋ฉด ์ ์ด๋ ๋ด ๊ฒฝ์ฐ์๋ ๊ทธ๋ฌ๋ค.
"๋ฏธ๋ค์จ์ด ์์ด Redux ์คํ ์ด๋ ๋๊ธฐ์ ๋ฐ์ดํฐ ํ๋ฆ๋ง ์ง์ํ๋ค"๋ ๋ฐ ๋์ํฉ๋๋ค. ์คํด์ ์์ง๊ฐ ์์ต๋๋ค.
๊ธฐ์ ์ ์ผ๋ก "๋ด๋ถ"์ "์ธ๋ถ"๋ฅผ ๊ตฌ๋ถํ๊ณ ์ถ๋ค๋ฉด ๊ทธ ๋ง์ด ์ฌ์ค์ผ ์ ์์ง๋ง ๋น๋๊ธฐ๋ฅผ ์ํํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ๋ฏธ๋ค์จ์ด๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด๋ผ๊ณ ์ฌ๋๋ค์ด ๋ฏฟ๊ฒ ํ๋ ๊ฒฝ์ฐ, ์๋ง๋ ์ฐ๋ฆฌ๋ ์ด๋ฅผ ๋ค์ ๋งํ๊ฑฐ๋ ์์ธํ ์ค๋ช ํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ.
์, ์ฐจ์ด์ ์ ๋น๋๊ธฐ ๋์์ด ๊ธฐ์ ์ ์ผ๋ก dispatch
"๋ด๋ถ"๋ณด๋ค๋ ๊ตฌ์ฑ ์์ ์์ค์์ ๋ ๋ง์ด ๋ฐ์ํ๋ค๋ ๊ฒ์
๋๋ค. ์ฌ์ํ ์ฐจ์ด์ง๋ง ์ ํจํ ๊ฒ์
๋๋ค.
๋๋ ๊ทธ ์ง์ ์ด ๊ธฐ์ ์ ์ผ๋ก ์ณ์ง ์๋ค๊ณ ์ฃผ์ฅํ๋ ์ฌ๋์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@markerikson ๋ด๋ถ์ ์ธ๋ถ์ ๊ตฌ๋ถ์ด ์ค์ํ ๊ตฌ์ฒด์ ์ธ ์๊ฐ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
ํ ๊ฐ์ง ์๋ ๋น๋๊ธฐ ๋ฏธ๋ค์จ์ด๊ฐ ๋์คํจ์น๋ ์ฝํฌ(๋๋ ์ฝ์ ๋ฑ)๋ฅผ ๋ณผ ์ ์๊ธฐ _before_ ์ฒด์ธ์ ๋ฏธ๋ค์จ์ด๋ฅผ ์ํ๋ ๊ฒฝ์ฐ์ผ ์ ์์ต๋๋ค. ๊ทธ ๋ฏธ๋ค์จ์ด๊ฐ _๋ฌด์์_ ํ ๊ฒ์ธ์ง _๋ฌด์์__ ํ์ ํ ์ ์์ง๋ง, ๊ทธ๋ฐ ๊ฒ์ ์ํ๋ ๊ฒ์ด ์คํ ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์... ๊ตฌ์ฒด์ ์ผ๋ก "๊ตฌ์ฒด์ ์ธ" ์์ ๋ํด์๋ ํ์คํ์ง ์์ต๋๋ค. ์ ๋ฐ์ ์ผ๋ก "outside"์ "insie"์ ๊ตฌ๋ถ์ dispatch
๋ฅผ ์ฒ์์ผ๋ก ํธ์ถํ๊ธฐ _์ _ ๋๋ _ํ_์ ๋ฐ์ํ๋์ง์ ๋ฌธ์ ์
๋๋ค. "outside" ๋ฐ "before"์ธ ๊ฒฝ์ฐ ๋ชจ๋ ๋น๋๊ธฐ์ฑ๊ณผ ๋
ผ๋ฆฌ๊ฐ React, Angular ๋๋ ๋ค๋ฅธ ๋ฌด์์ด๋ ๊ด๊ณ์์ด ๋ทฐ ๋ ์ด์ด์ ๋ ๋ง์ด ์ฐ๊ฒฐ๋ฉ๋๋ค. "๋ด๋ถ" ๋ฐ "์ดํ"์ธ ๊ฒฝ์ฐ ๋น๋๊ธฐ์ฑ๊ณผ ๋
ผ๋ฆฌ๋ ์ ์ฅ์ ์์ค์ ์์ผ๋ฉฐ ๋ณด๊ธฐ ๊ณ์ธต์ ์ฐ๊ฒฐ๋์ง _์์ต๋๋ค_.
์ด๊ฒ์ ์ค์ ๋ก ์ค๋ ์ผ์ฐ Reddit ํ ๋ก ์์ ๋ง๋ค๋ ค๊ณ ํ๋ ์์ ์ ๋๋ค: https://www.reddit.com/r/reactjs/comments/4spbip/has_anyone_inserted_a_controllerpresenter_layer/ .
"์ด๋ค ์์ ์ ๋ฐ์กํ๊ณ ์ธ์ ๋ฐ์กํฉ๋๊น?"์ ๋ํ ์ง๋ฌธ์ ๋๋ค. ๋๋จธ์ง ์ ๋ฐ์ "์ด๋ฌํ ์์ ์ ๋ํ ์๋ต์ผ๋ก ๋ด ์ํ๋ฅผ ์ด๋ป๊ฒ ์ ๋ฐ์ดํธํฉ๋๊น?"์ธ ๋น์ฆ๋์ค ๋ ผ๋ฆฌ์ ํต์ฌ ๋ถ๋ถ์ ๋๋ค. ์ก์ ๊ด๋ฆฌ๊ฐ ์ฝํฌ(thunks)์ ๋ฌด์ฉ๋ด(sagas) ๋ฑ์ ์๋ ๊ฒฝ์ฐ ํด๋น ์ฝ๋๊ฐ React ๊ตฌ์ฑ ์์, Angular ์ปจํธ๋กค๋ฌ, jQuery ํด๋ฆญ ํธ๋ค๋ฌ, Vue ๊ตฌ์ฑ ์์ ์ธ์คํด์ค ๋๋ ๋ค๋ฅธ ๊ฒ์ ์ํด ์์๋์๋์ง ์ฌ๋ถ๋ ์ค์ ๋ก ์ค์ํ์ง ์์ต๋๋ค. ํต์ฌ ๋ก์ง์ UI ๋ ์ด์ด ์ธ๋ถ์ ์์ผ๋ฉฐ UI ๋ ์ด์ด๋ ์ค์ ๋ก ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์คํ ์ด ๋ฐ์ผ๋ก ๊ฐ์ ธ์ ํ์ํ๊ณ ์ฌ์ฉ์ ์ ๋ ฅ์ ์ฑ ๋ก์ง ํจ์ ํธ์ถ๋ก ๋ฐ๊พธ๋ ์ญํ ์ ํฉ๋๋ค.
๊ทธ๋ฐ ์๋ฏธ์์ "๋ด๋ถ" ๋ "์ธ๋ถ"์ ์ง๋ฌธ์ด ์ค์ํ๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ์๋ํ๋ฉด ๋ ผ๋ฆฌ๊ฐ ์ฑ ์์ค์ ์๋์ง UI ์์ค์ ์๋์ง๋ฅผ ๊ฐ๋ ์ ์ผ๋ก ๊ตฌ๋ถํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
@markerikson ์ด ์ง๋ฌธ์ ๋ํด ํจ๊ป
์ฐธ๊ณ : ํธ์๋ฅผ ์ํด thunk
๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ๋ก redux-thunk์ด๋ redux-promise์ด๋ ๊ฐ์ ๋น๋๊ธฐ์ ๋ํ ์์์ ๋ฏธ๋ค์จ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ํ๋
๋๋ค.
UI ๋ ์ด์ด๋ ์ฌ์ฉ์ ์ํธ ์์ฉ์ ํธ๋ค๋ฌ์ ์ฐ๊ฒฐํฉ๋๋ค. ๋๊ตฐ๊ฐ ๋ฒํผ์ ํด๋ฆญํ๋ฉด UI๊ฐ _some_ ํธ๋ค๋ฌ๋ฅผ ํธ์ถํ๋๋ก ์กฐ์๋ฉ๋๋ค. ์ข ์ข ๊ตฌ์ฑ ์์๋ ์ด๋ฌํ ํธ๋ค๋ฌ๋ฅผ props๋ก ์์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ฐ์ธ๋ฉ๋ ์์ ์์ฑ์์ผ ์ ์์ต๋๋ค. UI๋ ํธ๋ค๋ฌ๋ฅผ ํธ์ถํ ๋ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ์์ง ๋ชปํฉ๋๋ค. --- ๊ทธ๋ฅ ํธ์ถํฉ๋๋ค.
"ํธ๋ค๋ฌ"๊ฐ (๋ฏธ๋ค์จ์ด์ ์ํด ์ฒ๋ฆฌ๋ ) ํจ์๋ฅผ ๋์คํจ์นํ๋์ง ๋๋ ๋น๋๊ธฐ ํธ์ถ์ ์คํํ๊ณ _then_์ด ์ผ๋ฐ ์์ ์ ๋์คํจ์นํ๋์ง ์ฌ๋ถ๋ UI ๋ ์ด์ด์ ์ฐจ์ด๊ฐ ์์ต๋๋ค. --- UI๋ ์์ ํ ๋ถ๊ฐ์ง๋ก ์ ์ ๋๋ค. _๊ฐ๋ฅ_ ๋ถ๊ฐ์ง๋ก ์ ์ผ ์ ์์)
์ฝํฌ๋ฅผ ์ฌ์ฉํ๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด "์ฑ"์ ๋ง์ ๋ถ๋ถ์ด ์ด๋ฌํ "์ฒ๋ฆฌ๊ธฐ"์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ react/redux ์ฑ์์ ์ด๋ฌํ "ํธ๋ค๋ฌ"๋ ์ข
์ข
์ผ์ข
์ ์ก์
์์ฑ์์
๋๋ค. ๋ชจ๋ ๋น๋๊ธฐ ํญ๋ชฉ์ ์ฝํฌ๋ก ์์ฑํ๊ณ ๋ฐ์กํ ์ ์์ต๋๋ค. ๋๋ ๋ชจ๋ ๋น๋๊ธฐ ํญ๋ชฉ์ dispatch
์ธ์๋ก ํ์ฉํ๋ ํจ์๋ก ์์ฑํ ์ ์์ต๋๋ค. ๊ตฌ์ฑ ์์์ ๊ด์ ์์ ๋ณผ ๋ someHandler(dispatch)
OR dispatch(someHandler())
๋๋ ์์์์ ์์๋ ๋ฐ์ธ๋ฉ๋ ์์
์์ฑ์์ ๊ฒฝ์ฐ ๋ ๊ฒฝ์ฐ ๋ชจ๋ someHandler()
์
๋๋ค. UI ๋ ์ด์ด์ ์ด ์ฐจ์ด๋ฅผ ์์ ํ ๊ฐ๋ฆฌ๋ bindActionCreators
๋ฒ์ ์ ๋น๋ํ ์ ์์ต๋๋ค.
redux-thunk๋ฅผ ์ฌ์ฉํ์ฌ ์ก์
์ ์์๋ก ์์ฑ๋ react/redux ์ ํ๋ฆฌ์ผ์ด์
์ ์ ๊ณตํ๋ฉด UI ๊ณ์ธต์ _๊ทผ๋ณธ์ ์ผ๋ก_ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ redux-thunk๋ฅผ ์์ ํ ๊ต์ฒดํ๊ณ ๋น ๋ฏธ๋ค์จ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. (์ฐธ๊ณ : getState
์ ์ฃผ์
ํ๋ ์์น/๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช
ํ๊ณ ์์ง๋ง ์ฌ๊ธฐ์์๋ ์ฌ์ํ ์ธ๋ถ ์ฌํญ์ด๋ผ๊ณ _๋ฏฟ์ต๋๋ค_).
๋ฐ๋ผ์ '๋ด๋ถ'์ '์ธ๋ถ'์ ๊ตฌ๋ถ์ด '์ฑ ์์ค' ๋๋ 'UI ์์ค'์ด๋ผ๋ ์ฌ์ค์ ๋ฐ์๋ค์ด๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
ํ ๋ก ์ ๊ฐ์ฌ๋๋ฆฌ๋ฉฐ ๋ถ์ ์ ์ธ ์๊ฒฌ์ด ๋์ค์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ด ์ฝ์ค๋ ํ๋ฅญํฉ๋๋ค. ์ฌ๋๋ค์ด ์ฝ์ค์ ๋ํ ์ปค๋ฎค๋ํฐ ๋ ธํธ ๋ฆฌํฌ์งํ ๋ฆฌ๋ก ์๊ฒฌ์ ๋ณด๋ผ ์ ์๋๋ก ์ด๊ฒ์ ๋ซ์ต๋๋ค: https://github.com/tayiorbeii/egghead.io_redux_course_notes
๊ทธ๋ฆฌ๊ณ ๋์ด ๋ญ์น ๋ค์ ์๋ฆฌ์ฆ๋ ๊ผญ ํ์ธํด๋ณด์ธ์! https://egghead.io/courses/building-react-applications-with-idiomatic-redux
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@markerikson ์ด ์ง๋ฌธ์ ๋ํด ํจ๊ป
์ฐธ๊ณ : ํธ์๋ฅผ ์ํด
thunk
๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ๋ก redux-thunk์ด๋ redux-promise์ด๋ ๊ฐ์ ๋น๋๊ธฐ์ ๋ํ ์์์ ๋ฏธ๋ค์จ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ํ๋ ๋๋ค.UI ๋ ์ด์ด๋ ์ฌ์ฉ์ ์ํธ ์์ฉ์ ํธ๋ค๋ฌ์ ์ฐ๊ฒฐํฉ๋๋ค. ๋๊ตฐ๊ฐ ๋ฒํผ์ ํด๋ฆญํ๋ฉด UI๊ฐ _some_ ํธ๋ค๋ฌ๋ฅผ ํธ์ถํ๋๋ก ์กฐ์๋ฉ๋๋ค. ์ข ์ข ๊ตฌ์ฑ ์์๋ ์ด๋ฌํ ํธ๋ค๋ฌ๋ฅผ props๋ก ์์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ฐ์ธ๋ฉ๋ ์์ ์์ฑ์์ผ ์ ์์ต๋๋ค. UI๋ ํธ๋ค๋ฌ๋ฅผ ํธ์ถํ ๋ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ์์ง ๋ชปํฉ๋๋ค. --- ๊ทธ๋ฅ ํธ์ถํฉ๋๋ค.
"ํธ๋ค๋ฌ"๊ฐ (๋ฏธ๋ค์จ์ด์ ์ํด ์ฒ๋ฆฌ๋ ) ํจ์๋ฅผ ๋์คํจ์นํ๋์ง ๋๋ ๋น๋๊ธฐ ํธ์ถ์ ์คํํ๊ณ _then_์ด ์ผ๋ฐ ์์ ์ ๋์คํจ์นํ๋์ง ์ฌ๋ถ๋ UI ๋ ์ด์ด์ ์ฐจ์ด๊ฐ ์์ต๋๋ค. --- UI๋ ์์ ํ ๋ถ๊ฐ์ง๋ก ์ ์ ๋๋ค. _๊ฐ๋ฅ_ ๋ถ๊ฐ์ง๋ก ์ ์ผ ์ ์์)
์ฝํฌ๋ฅผ ์ฌ์ฉํ๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด "์ฑ"์ ๋ง์ ๋ถ๋ถ์ด ์ด๋ฌํ "์ฒ๋ฆฌ๊ธฐ"์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ react/redux ์ฑ์์ ์ด๋ฌํ "ํธ๋ค๋ฌ"๋ ์ข ์ข ์ผ์ข ์ ์ก์ ์์ฑ์์ ๋๋ค. ๋ชจ๋ ๋น๋๊ธฐ ํญ๋ชฉ์ ์ฝํฌ๋ก ์์ฑํ๊ณ ๋ฐ์กํ ์ ์์ต๋๋ค. ๋๋ ๋ชจ๋ ๋น๋๊ธฐ ํญ๋ชฉ์
dispatch
์ธ์๋ก ํ์ฉํ๋ ํจ์๋ก ์์ฑํ ์ ์์ต๋๋ค. ๊ตฌ์ฑ ์์์ ๊ด์ ์์ ๋ณผ ๋someHandler(dispatch)
ORdispatch(someHandler())
๋๋ ์์์์ ์์๋ ๋ฐ์ธ๋ฉ๋ ์์ ์์ฑ์์ ๊ฒฝ์ฐ ๋ ๊ฒฝ์ฐ ๋ชจ๋someHandler()
์ ๋๋ค. UI ๋ ์ด์ด์ ์ด ์ฐจ์ด๋ฅผ ์์ ํ ๊ฐ๋ฆฌ๋bindActionCreators
๋ฒ์ ์ ๋น๋ํ ์ ์์ต๋๋ค.redux-thunk๋ฅผ ์ฌ์ฉํ์ฌ ์ก์ ์ ์์๋ก ์์ฑ๋ react/redux ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ณตํ๋ฉด UI ๊ณ์ธต์ _๊ทผ๋ณธ์ ์ผ๋ก_ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ redux-thunk๋ฅผ ์์ ํ ๊ต์ฒดํ๊ณ ๋น ๋ฏธ๋ค์จ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. (์ฐธ๊ณ :
getState
์ ์ฃผ์ ํ๋ ์์น/๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํ๊ณ ์์ง๋ง ์ฌ๊ธฐ์์๋ ์ฌ์ํ ์ธ๋ถ ์ฌํญ์ด๋ผ๊ณ _๋ฏฟ์ต๋๋ค_).๋ฐ๋ผ์ '๋ด๋ถ'์ '์ธ๋ถ'์ ๊ตฌ๋ถ์ด '์ฑ ์์ค' ๋๋ 'UI ์์ค'์ด๋ผ๋ ์ฌ์ค์ ๋ฐ์๋ค์ด๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
ํ ๋ก ์ ๊ฐ์ฌ๋๋ฆฌ๋ฉฐ ๋ถ์ ์ ์ธ ์๊ฒฌ์ด ๋์ค์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.