๋๋ ์ด๊ฒ์ด ๋ชจ๋ redux์ ๊ธฐ๋ณธ ์์น์ด๋ฉฐ ์ง๊ธ๊น์ง ๊ฝค ์ ์๋ ค์ง ๋ชจ๋ ๋๋ผ์ด ์ด์ ๊ณผ ํจ๊ป ์ ๊ณต๋๋ค๋ ๊ฒ์ ์ดํดํฉ๋๋ค.
๊ทธ๋ฌ๋ redux๊ฐ ๋ถ์กฑํ ๊ณณ ์ค ํ๋๋์ด ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ ์ ๋จ์ ์ ๊ณต๊ฐ์ ์ผ๋ก ์ค๋ช ํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์ฌ๋๋ค์ด ๋ถ์ ์ ์ธ ์ด์ ๋ก ๋ถ๋๋ฌ์ํ์ง ์๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ข์ ์ ํ ์ผ ๊ฒ์ ๋๋ค.
redux๋ฟ๋ง ์๋๋ผ Om , datomic ๊ณผ ๊ฐ์ ๋ค๋ฅธ ๊ฒ๋ค์๋ ์ ์ฉ๋๊ธฐ ๋๋ฌธ์ ๊ถ๊ธ ํฉ๋๋ค .
๊ทธ๋ฌ๋ ๋ด๊ฐ ํ ๋ชจ๋ ๊ฒ์์ ๋ํด ๋จ์ผ ๋ถ๋ณ ์ ์ฅ์์ ๋ํด ๋นํ์ ์ธ ์ฌ๋๋ค์ ์ฐพ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ์ด๊ฒ์ ์์ด์ง๋ง ์ค์ ์ํคํ ์ฒ๋ณด๋ค redux์ ์ฅํฉํจ์ ๋ ๋ง์ ๋ฌธ์ ๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ด๊ฐ ์๊ฐํ ์์๋ ์ ์ผํ ๊ฒ์ ์ํ์ ๋ณต์ฌ๋ณธ์ ๊ณ์ ์ ์ฅํ๋ ๋ฐ ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ๊ฑฐ๋ redux๋ก ๋น ๋ฅด๊ฒ ํ๋กํ ํ์ ์ ๋ง๋๋ ๊ฒ์ด ์กฐ๊ธ ๋ ์ด๋ ต๋ค๋ ๊ฒ์ ๋๋ค.
์ฌ๋ฌ๋ถ์ ์๋ง๋ ์ ๋ณด๋ค ๋ ๋ง์ ์๊ฐ์ ํ์ จ์ ๊ฒ์ ๋๋ค. ์ ๋ฅผ ์ํด ์ด๊ฒ์ ์ค๋ช ํด์ฃผ์ค ์ ์๋์?
์ข์ ์ง๋ฌธ์ ๋๋ค. ๋ด์ผ ํฌ๊ด์ ์ธ ๋ต๋ณ์ ์์ฑํ๋ ค๊ณ ๋ ธ๋ ฅํ์ง๋ง ๋จผ์ ์ผ๋ถ ์ฌ์ฉ์์ ์๊ฒฌ์ ๋ฃ๊ณ ์ถ์ต๋๋ค. ๋์ค์์ด ํ ๋ก ์ ๊ณต์ ๋ฌธ์ ํ์ด์ง๋ก ์์ฝํ๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋จ์ ์ ๋ชฐ๋๊ธฐ ๋๋ฌธ์ ์ฒ์์๋ ์ด๊ฒ์ํ์ง ์์์ต๋๋ค.
๋๋จํ ๊ฐ์ฌํฉ๋๋ค! ๋๋ ์ด๊ฒ์ ๋ํด ์ ๋ง๋ก ๋ฃ๊ณ ์ถ์๋ค.
๊ทธ๊ฑด ๊ทธ๋ ๊ณ ,์ด ํ ๋ก ์ ๊ธฐ์ฌํ๊ณ ์ถ์ ๋ชจ๋ ์ฌ๋๋ค์ด Redux๋ก ๋ฌด์์ ๊ตฌ์ถํ๋์ง์ ๋ํ ์์ด๋์ด๋ฅผ ์ ๊ณตํ์ฌ ํ๋ก์ ํธ์ ๋ฒ์๋ฅผ ๋ ์ฝ๊ฒ ์ดํดํ๋๋ก ๊ถ์ฅํฉ๋๋ค.
OM ๋ฐ redux ๋ฐ ๊ธฐํ ๋จ์ผ ์ํ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ์ ์ด๋ ค์ด ์ง๋ฌธ b / c ํ๋ก์ ํธ๋ ๋จ์ ์ ์ ๊ทน์ ์ผ๋ก ์ํํฉ๋๋ค. ๋ถ๋ณ์ฑ ์ ์ฝ์ด์๊ณ ์ ์ด ๋ ์ก์ธ์ค ์ ์ด๊ฐ ๋จ์ผ ์ํ ์์์ ๋ํ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ window
์ฒจ๋ถํ๋ ๊ฒ๊ณผ ์ ํ ๋ค๋ฅด์ง ์์ต๋๋ค (๊ทธ ๋จ์ ์ ์ ์๋ ค์ ธ ์์).
Redux ์ ๊ทผ ๋ฐฉ์๊ณผ ๊ด๋ จํ์ฌ ์ฐ๋ฆฌ์๊ฒ ๊ฐ์ฅ ํฐ ๋จ์ ์ ๋จ์ผ ์ํ ์์๊ฐ ์ผ์ข ์ ์ ๋ถ ๋๋ ์๋ฌด๊ฒ๋ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ฌ์ด ์๋ถ ๊ณต๊ธ, ์ค๋ ์ท, ์๊ฐ ์ฌํ ๋ฑ์ ์ด์ ์ ์ค์ํ ๊ตญ๊ฐ ์ํ์ด _no_์์ ๋๋ง ํจ๊ณผ๊ฐ ์์ต๋๋ค. React์ ๋งฅ๋ฝ์์ ์ด๊ฒ์ Store์ ๊ตฌ์ฑ ์์์ ์ ์ ํ๊ฒ ์ํ๋ ์ํ๋ฅผ ์ ์ฅํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค. ๋ชจ๋ ๊ฒ์ Redux์ ๋ฃ๊ณ ์ถ๋ค๋ฉด ์ข ์ข ๋ถ๋ด์ค๋ฝ๊ณ โโ์ฅํฉํ๊ฒ ๋๋๊ณ ์ฑ๊ฐ์ ์์ค์ ๊ฐ์ ์ ์ธ ์์ค์ ์ถ๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ฌํ ๋จ์ ์ค ์ด๋ ๊ฒ๋ ์ฐ๋ฆฌ์๊ฒ ํน๋ณํ ๊ธ์ง๋์ง ์์์ต๋๋ค. :)
๊ทธ๋์ ์ ๋ ๊ฒ์ ์ํ๋ฅผ ๋ชจ๋ธ๋งํ๊ธฐ ์ํด Redux์ ์ด๋ฌํ ์คํ์ผ์ ์ํคํ ์ฒ์ ์ฃผ๋ชฉํ์ต๋๋ค. ์ ๋ Civ ์คํ์ผ์ ์๋ฎฌ๋ ์ด์ ๋ ์ธ๊ณ๋ฅผ ๋ง๋ค๊ณ ์์ ํ ๊ธฐ๋ก ๋ ๋ณด๋ ๊ฒ์ ๊ธฐ๋ก์ ๋ธ๋ผ์ฐ์ ์ปจํ ์คํธ์์๋ณด๋ค ๊ฐ๋จํ๊ฒ ๋ง๋๋ ๋ฐ ๊ด์ฌ์ด ์์ต๋๋ค. ์ด๋ ์๋ง๋ ์ผ๋ถ ์ฌ๋๋ค์๊ฒ๋ ์ด๋ก์ ์ธ ์ฌ์ฉ ์ฌ๋ก ์ผ ๊ฒ์ ๋๋ค.ํ์ง๋ง ๋๊ตฌ๋ ์ ๊ฐ ๊ทธ๋ง๋๊ธฐ๋ฅผ ์ํ ๊ฒ ๊ฐ์ง๋ ์์ต๋๋ค.
๊ทธ๋ฐ ๋งฅ๋ฝ์์ ์ ๋ ํ์คํ ๋ฆฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ํฌ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๊ณ , ์ผ๋ถ๋ฅผ ์๋ฒ ๋ ๋์คํฌ๋ก ์ด๋ํ์ฌ ์ ์ฅํ๊ณ , ํน์ ์ธ๊ทธ๋จผํธ๋ฅผ ๋ณต์ํ๋ ๋ฑ์ ๋ ธ๋ ฅ์ ๊ด์ฌ์ด ์์ต๋๋ค.
๋ด๊ฐ ๊ณ ์ ํ ๊ฒ์ ์๋ก์ด ์ฌ์ฉ์๋ก์ Redux์ ๊ทน๋จ์ ์ธ (imho) ์ฝ๋ฉ ์คํ์ผ ๋ณํ์ ๋์์ ๊ฐ๋ ์ ๋ณํ๋ฅผ ๊ทน๋ณตํ๋ ค๋ ๊ฒ์ ๋๋ค. ํ ๋ฌ์ด ์ง๋ ์ง๊ธ๋ ์กฐ๊ธ ๋ฒ ์ฐจ๊ณ ๊น์ด ๋ค์ด ๊ฐ๋ ค๊ณ ์๋ํ ํ ๋ณ๊ฒฝ๋ฉ๋๋ค. ๊ฐ๋ ์ ์ดํดํ๊ธฐ ์ํด https://github.com/ngrx/store๋ฅผ ์ดํด๋ณด๊ณ ์์ง๋ง ๋ ์น์ํ ์คํ์ผ / ๊ตฌ๋ฌธ๊ณผ ๋๋จธ์ง ํ๋ ์ ์ํฌ๊ฐ ์์ / ์ ๊ณต๋ ๋ ๋ง์ด ์์ต๋๋ค.
๋๋ ์ด๋ค ์ฌ๋๋ค์๊ฒ๋ ํ๋ ์ ์ํฌ๊ฐ ๋ฒํ๋ชฉ์ด๋ผ๋ ๊ฒ์ ์ดํดํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ ์ค ์ผ๋ถ๋ ๊ทธ๊ฒ๋ค์ด ํ์ํฉ๋๋ค. ์ ์ฉํ ๊ฐ๋ ฅํ ์๊ฒฌ์ ๊ฐ์ง ์์์๋งํผ ๊ฒ์์ ์ต์์์์๋ ์ฌ๋์ ๊ฑฐ์ ์์ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ํ๋ ์ ์ํฌ๋ ์ด๋ ์์์ ๋๋ฌ ๊ฑฐ๋ฆฌ๋ ๊ฒ๋ณด๋ค ๋ซ์ต๋๋ค. ๊ทธ๋์ ๊ทธ๊ฒ์ ๊ฐ๋ ์ ์๋ก์ด ์ค๊ฐ ์์ค์ ์ค๋ ํ๋ก๊ทธ๋๋จธ ๋์๊ฒ์ ํฌ์ธํธ์ ๋๋ค :)
๊ธฐ๋ณธ์ ์ผ๋ก Redux์ ๊ทํ์ ๋น๋์ค๋ ์์ ์๋ฐ ์คํฌ๋ฆฝํธ๋ก ์ํํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋ฅด์ณ ์ฃผ์์ง๋ง ๊ฒฝํ์ด ์ ์ ํ๋ก๊ทธ๋๋จธ์ด๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ ์ง์นจ์์ด ์ ํ์ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ์์ง ๋ชปํ๋ฏ๋ก ์์ฑ ๋ ์๋ฅผ ๋ณผ ๋๊น์ง ๊ทธ๋ฅ ๋ค์๊ณผ ๊ฐ์ด ์ ์์ต๋๋ค.
๋น์ ์ ์๋ชป์ ์๋์ง๋ง ์ฌ์ ํ ํด๊ฒฐ์ ๋๊ณ ์ถ์ ๋ฌธ์ ์ ๋๋ค. :)
์ด ์์ ์์ ์ฌ์ ํ ๊ฐ์ฅ ํฐ ์ง๋ฌธ์ ํจ์, ์ธ์คํด์ค ๋๋ ์ฝ์๊ณผ ๊ฐ์ ์ง๋ ฌํ ํ ์์๋ ํญ๋ชฉ์ด ์ด๋๋ก ๊ฐ์ผ ํ๋๊ฐํ๋ ๊ฒ์ ๋๋ค. ์ง๋๋ฐค Reactiflux์์ ์ด๊ฒ์ ๋ํด ๊ถ๊ธํดํ๊ณ ์ข์ ๋ฐ์์ ์ป์ง ๋ชปํ์ต๋๋ค. ๋ํ ๋๊ตฐ๊ฐ๊ฐ http://stackoverflow.com/questions/35325195/should-i-store-function-references-in-redux-store ๊ฒ์ํ๋ ๊ฒ์ ๋ณด์์ต๋๋ค.
์ฌ๋ฌ ์์ ์ ๋ํ ์ฌ์ฉ ์ฌ๋ก (๋ด๊ฐ ์๊ฐํ ์์๋ ๊ฐ์ฅ ์ข์ ์ ์ ๋ช ์ฌํ์ญ์์ค) :
์ฌ๋ฌ ํ์ ์ฑ์ ํจ๊ป ๊ฒฐํฉํ๋ ์ฑ์ ๋๋ค. My Yahoo ๋๋ ๋ค๋ฅธ ์ฌ์ฉ์ ์ ์ ๊ฐ๋ฅํ ํ ํ์ด์ง ์ ํ๊ณผ ๊ฐ์ ๊ฒ์ ์๊ฐํด๋ณด์ญ์์ค. ๊ฐ ์์ ฏ์ ๋ ์ฌ์ด์ ๊ฒน์น์ง ์๊ณ ์์ฒด ์ํ๋ฅผ ์ ์งํด์ผํฉ๋๋ค. ์ ํ ํ์ ๊ฐ ์์ ฏ์ ํ ๋น ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฏ๋ก ๋ค๋ฅธ ์ฌ๋์ ์ฝ๋๊ฐ ํ๊ฒฝ์ ๋ฏธ์น๋ ์ํฅ์ ๋ชจ๋ฅผ ์ ์์ต๋๋ค.
๋ชจ์ด๋ฉด Redux์์ ๋ช ๊ฐ์ง ๊ท์น์ ์๋ฐํ๊ณ React์ ์ปจํ ์คํธ์ ๊ฐ์ ํญ๋ชฉ์ ํด๋น ์ ์ฅ์๋ฅผ ์ ํํ๋ ๋ฐ์ฃผ์ํจ์ผ๋ก์จ์ด๋ฅผ ๋ฌ์ฑ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ๋ฌ ์ํ ์์๋ฅผ ์ฒ๋ฆฌํ๋ ํ๋ ์ ์ํฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ์ฌ์ธ ์ ์์ต๋๋ค.
@gaearon ์ฐ๋ฆฌ๋ ๊ฑฐ๋ ํ๋ซํผ์ ๊ตฌ์ถํ๊ณ ์์ต๋๋ค. ๋๋ ์ด๋ฏธ ํ ์์ ์ด ์ฐ๋ฆฌ์๊ฒ ์ ํฉํ์ง ์์ ์ด์ ๋ฅผ ํ ๋ฒ ์ค๋ช ํ์ต๋๋ค (์ํธ ํํ ๋ฅด๋ถ๋ฅดํฌ์์ React.js ๋ฐ์ ์ดํ). ์์ธํ ๋ด์ฉ์ ๋ค์ ์ค๋ช ํ๊ฒ ์ต๋๋ค (๋ฏธ๋์ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์?).ํ์ง๋ง ์ ์์ด ์ค๋ ฅ ๋๋ฌธ์ ๋์์ด ํ์ํ ๊ฒ์ ๋๋ค. :) ํธ์ํฐ์์ ์ง์ ๊ฒํ ํ๊ธฐ ์ํด ์ฌ๊ธฐ์์๋ ๋ค๋ฅธ ์ฌ๋์ด๋ ๊ทํ์๊ฒ ๋ณด๋ด๋ ๊ด์ฐฎ์ต๋๊น? ์๋ฃ ๋ ๋ ๋ฉ์์ง? ์ ํํ ๋ ์ง๋ฅผ ์ ํ ์๋ ์์ง๋ง ์กฐ๋ง๊ฐ์ด ๊ฒ์๋ฌผ์ ์์ฑํ๋ ค๊ณ ํฉ๋๋ค (์ด๋ฒ ๋ฌ ๋ง์ผ ๊ฐ๋ฅ์ฑ์ด ๊ฐ์ฅ ๋์).
๊ทธ๋ฆฌ๊ณ ์, @timdorr๊ฐ ๋งํ ๊ฒ์ฒ๋ผ ๋ฌธ์์ ์ผ๋ถ ๊ท์น์ ์๋ฐํ์ฌ ์ฌ๋ฌ ์์ ์์ Redux๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค (๊ทธ ๋น์ฉ์ผ๋ก ๋ค์ํ ์์ ์ ๋ฐ์ดํฐ๊ฐ ํ์ํ ๊ฒฝ์ฐ react-redux
๋ฅผ ํธ์ํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋จ์ผ ๋งค์ฅ์ ๊ฒฝ์ฐ)
Redux๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋น ํ ๋จ์ผ ํ๋ก์ ์ ์ด์๋ ์ด๋ฒคํธ ์์ฑ์ ๋๋ค.
๋ถ์ฐ ์์คํ ์๋ ์ผ๋ฐ์ ์ผ๋ก ํ๋์ ์ด๋ฒคํธ ๋ก๊ทธ (์ : Kafka)์์ด ๋ก๊ทธ๋ฅผ ์๋ก ๋ค๋ฅธ ์๋ฒ์์ ํธ์คํ ๋๋ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค / ์คํ ์ด (์ผ๋ฐ์ ์ผ๋ก DB ๋ณต์ ๋ณธ์ด ์ค์ ๋ก ๊ฐ์๊ธฐ)๋ก ํ๋ก์ ์ / ์ถ์ ํ ์์๋ ์ฌ๋ฌ ์๋น์๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ถ์ฐ ๋ ์ธ๊ณ์์๋๋ก๋ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋ถ์ฐ๋ฉ๋๋ค. ๋ฐ๋ฉด Redux์์๋ ๋ชจ๋ ๋ก์ปฌ ์ํ๋ฅผ ๊ฐ์ง ์๋ฐฑ ๊ฐ์ ์์ ฏ์ด ์๊ณ ์ด ๋ชจ๋ ๊ฒ์ด ๋จ์ผ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ฉฐ ๋ชจ๋ ์ํ ๋ณ๊ฒฝ์๋ ๋ถ๋ณ์ผ๋ก ์ธํด ์ฝ๊ฐ์ ์ค๋ฒ ํค๋๊ฐ ์์ต๋๋ค. ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ด ์ค๋ฒ ํค๋๋ ํฐ ๋ฌธ์ ๊ฐ ์๋์ง๋ง ํ ์คํธ ์ ๋ ฅ์ ์ข์ง ์์ ์ํ ๋ชจ์์ผ๋ก ๋ง์ดํธํ๊ณ ๋๋ฆฐ ๋ชจ๋ฐ์ผ ์ฅ์น์์ ๋น ๋ฅด๊ฒ ์ ๋ ฅ ํ ๋ ํญ์ ์ฑ๋ฅ์ด ์ถฉ๋ถํ์ง๋ ์์ต๋๋ค.
๋ด ๊ฒฝํ์ ๊ทธ ์ํ๋ฅผ ๋งจ ์์์ ๋ ๋๋งํ๋ ๊ฒ์ ํธ๋ฆฌํ์ง ์๊ณ ํญ์ ์ฑ๋ฅ์ด ์ถฉ๋ถํ์ง๋ ์์ต๋๋ค (์ ์ด๋ ๊ฐ์ฅ ๋น ๋ฅธ VDom ๊ตฌํ์ด ์๋ React์์๋). Redux๋ connect
๋ก์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ง ์ฐ๊ฒฐ ์๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๋ณ๋ชฉ ํ์์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ํด๊ฒฐ์ฑ
์ด
๋ํ ImmutableJS์ ๊ฐ์ ์๊ตฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ํฐ ๋ชฉ๋ก์ ์์ ์์ธ์ ํญ๋ชฉ์ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ผ๋ถ ์์ ์์ ํญ์ ์ต์์ ์ฑ๋ฅ์ ์ ๊ณตํ์ง๋ ์์ต๋๋ค ( ์ฌ๊ธฐ์์ ํฐ ๋ชฉ๋ก์ ๋ ๋๋ง ํ ๊ฒฝํ ์ฐธ์กฐ).
Redux๋ ํธ๋ฆฌํ๊ณ ๋๋ถ๋ถ์ ์ฌ์ฉ ์ฌ๋ก์ ์ ํฉํ๊ธฐ ๋๋ฌธ์ ์ด๋ฒคํธ ๋ก๊ทธ์ ํ๋ก์ ์ ์ ๋ชจ๋ ํฌํจํ์ง๋ง redux ์ธ๋ถ์์ ์ด๋ฒคํธ ๋ก๊ทธ๋ฅผ ์ ์งํ๊ณ 2 ๊ฐ ์ด์์ redux ์ ์ฅ์์ ํฌ์ ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ชจ๋ redux ์ ์ฅ์๋ฅผ ๋ค๋ฅธ ํค์์ ์ปจํ ์คํธ์ ๋ฐ์ํ๊ณ ์ฐ๊ฒฐํ ์ ์ฅ์๋ฅผ ์ง์ ํ์ฌ ์ค๋ฒ ํค๋๋ฅผ ์ค์ ๋๋ค. ์ด๊ฒ์ ์ ๋์ ์ผ๋ก ๊ฐ๋ฅํ์ง๋ง, ์ด์ ์ ์ฅ์์ ์ด๋ฒคํธ ๋ก๊ทธ๋ฅผ ๋ช ํํ๊ฒ ๊ตฌ๋ถํด์ผํ๋ฏ๋ก api์ devtools๋ฅผ ๊ตฌํํ๊ธฐ๊ฐ ๋ ์ด๋ ค์์ง๋๋ค.
@jquense ์๋ ๋์ํฉ๋๋ค.
์ฌ์ด ์๋ถ ๊ณต๊ธ, ์ค๋ ์ท, ์๊ฐ ์ฌํ ๋ฑ์ ์ด์ ์ ์ค์ํ ๊ตญ๊ฐ๊ฐ ์ฌ๋ ๋ค๋ฅธ ์ฅ์๊ฐ์๋ ๊ฒฝ์ฐ์๋ง ์๋ํฉ๋๋ค. React์ ๋งฅ๋ฝ์์ ์ด๊ฒ์ Store์ ๊ตฌ์ฑ ์์์ ์ ์ ํ๊ฒ ์ํ๋ ์ํ๋ฅผ ์ ์ฅํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค. ๋ชจ๋ ๊ฒ์ Redux์ ๋ฃ๊ณ ์ถ๋ค๋ฉด ์ข ์ข ๋ถ๋ด์ค๋ฝ๊ณ โโ์ฅํฉํ๊ฒ ๋๋๊ณ ์ฑ๊ฐ์ ์์ค์ ๊ฐ์ ์ ์ธ ์์ค์ ์ถ๊ฐํฉ๋๋ค.
๋ชจ๋ ์ํ๋ฅผ Redux ์ ์ฅ์์ ๋ง์ดํธํ๋ ค๋ฉด ๋ ๋ง์ ์์ฉ๊ตฌ๊ฐ ํ์ํฉ๋๋ค. Elm ์ํคํ ์ฒ๋ ์๋ง๋์ด ๋ฌธ์ ๋ฅผ๋ณด๋ค ์ฐ์ํ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ์ง๋ง ๋ง์ ์์ฉ๊ตฌ๊ฐ ํ์ํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ชจ๋ ์ํ๋ฅผ ์ ์ดํ๋ โโ๊ฒ๋ ๊ฐ๋ฅํ๊ฑฐ๋ ์ํ ํ ์ ์์ต๋๋ค. ๋๋๋ก ์ฐ๋ฆฌ๋ ์ ์ธ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ด๋ ค์ด ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์ผ๋ถ ์ํ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก redux ์ ์ฅ์์ ๋ง์ดํธํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
๋ด๊ฐ ๋ฐฉ๊ธ ๋ณธ์ด ์ง๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
UI ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ๊ณผ UI ์ํ๊ฐ ๊ตฌ์ฑ ์์์ ์ํด์ผํ๋์ง ์๋๋ฉด ์คํ ์ด๋ก ์ด๋ํด์ผํ๋์ง์ ๋ํด ๋ด๊ฐ ๋ณธ ํผ๋์ ๋ฐํฅํฉ๋๋ค. # 1287์์ด ์ง๋ฌธ์ ๋ํ ์ข์ ๋๋ต์ ์ ๊ณตํ์ง๋ง ์ฒ์์๋ ๊ทธ๋ ๊ฒ ๋ช ํํ์ง ์์ผ๋ฉฐ ๋ ผ์์ ์ฌ์ง๊ฐ ์์ต๋๋ค.
๋ํ ๋ชจ๋ ๊ตฌ์ฑ ์์๊ฐ ์์ํ๊ณ ์์ฒด ์ํ์์ ๋ฐ์ธ๊ถ์ด์๋ https://github.com/ericelliott/react-pure-component-starter ์ ๊ฐ์ ๊ฒ์ ๊ตฌํํ๋ ค๋ ๊ฒฝ์ฐ ๋ฐฉํด๊ฐ ๋ ์ ์์ต๋๋ค. .
์ฌ๋ฌ ์ธ์ ์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํด์ผ ํ ๋ redux์ ๋จ์ผ ์ํ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ด๋ ค์ ์ต๋๋ค. ๋์ผํ ๋ชจ์์ ๊ฐ์ง ์์์ ์์ ๋ถ๊ธฐ๊ฐ ์๊ณ ๊ฐ๊ฐ ๊ณ ์ ํ ์๋ณ์๊ฐ ์ฌ๋ฌ ๊ฐ ์์ต๋๋ค (๋ฐ์ดํฐ์ ์ถ์ฒ์ ๋ฐ๋ผ ๋ค๋ฅธ ํค๋ฅผ ์ฌ์ฉํฉ๋๋ค). ๊ฐ์๊ธฐ ๊ธฐ๋ฅ๊ณผ ์ฌ ์ ํ ๊ธฐ๋ฅ์ ๋จ์์ฑ์ ์ด๋ฌํ ์๊ตฌ ์ฌํญ์ ์ง๋ฉดํ์ ๋ ๋น ๋ฅด๊ฒ ์ฌ๋ผ์ก์ต๋๋ค. ํน์ ๋ถ๊ธฐ๋ฅผ ๋์์ผ๋กํ๋ ์ฌ์ฉ์ ์ง์ getter / setter๋ฅผ ์์ฑํด์ผํ๋ ๊ฒฝ์ฐ ๋จ์ํ๊ณ ๊ตฌ์ฑ ๊ฐ๋ฅํ ํ๊ฒฝ์์ ์ง๋์น๊ฒ ๋ณต์กํ๊ณ ํํํ๋ค๊ณ ๋๊ผ์ต๋๋ค. ์ฌ๋ฌ ์์ ์ด ์ด๋ฌํ ์๊ตฌ ์ฌํญ์ ํด๊ฒฐํ๋ ๊ฐ์ฅ ์ข์ ์ต์ ์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ธ์ (๋๋ ๋ค๋ฅธ ๋์ผํ ๋ชจ์์ ๋ฐ์ดํฐ)์ ๋จ์ผ ์ํ ํธ๋ฆฌ๋ก ๊ด๋ฆฌํ๋ ๋ฐ ๋ํ ์ผ๋ถ ๋๊ตฌ๋ ์ข์ ๊ฒ์ ๋๋ค.
๊ฐ์๊ธฐ ๊ฐ์ ์ํ ํค ์ถฉ๋ ํ๋ฅ ์ด ์ฆ๊ฐํ์ต๋๋ค.
๋ฐ์ดํฐ ๋ณํ ๋ฐ ์ ์ธ์ ๋ฐ์ดํฐ๊ฐ ์ฌ์ฉ๋๋ ์ฝ๋์๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ๋ค (์ฝ๋๋ฅผ ์์ฑํ ๋ ๋ณ์ ์ ์ธ์ ์ฌ์ฉํ๋ ์์น ๊ทผ์ฒ์ ๋ฐฐ์นํ๋ ค๊ณ ํฉ๋๋ค)
ํน์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์๊ฐํ๊ฒ ์ต๋๋ค. ๋ชจ๋ UI ๊ตฌ์ฑ ์์๊ฐ ์์ ํ ์๋ํ๊ณ ๋ค์ํ ๊ตฌ์ฑ ์์์ ๋ํ ๋ก์ปฌ ์ํ๋ฅผ ๊ฐ์ง ๋ฐฉ๋ฒ์ด์๋ virtual-dom๊ณผ ํจ๊ป Redux๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์ฆ, ๊ฐ์ฅ ์ด๋ ค์ด ๋ถ๋ถ์ ์ ๋๋ฉ์ด์ ์ํ๋ฅผ ๋ฌถ๋ ๊ฒ์ ๋๋ค. ๋ค์ ์์ ๋ ์ ๋๋ฉ์ด์ ์ํ๋ฅผ ์ผ๋์๋๊ณ ์์ง๋ง์ด ์ค ๋๋ถ๋ถ์ UI ์ํ ๋ก ์ผ๋ฐํ ํ ์ ์์ต๋๋ค.
Redux์์ ์ ๋๋ฉ์ด์ ์ํ๊ฐ ์ด์ํ ๋ช ๊ฐ์ง ์ด์ :
animationStarted
๋๋ animationStopped
์ ๊ฐ์ ๊ธฐ๋ณธ ์ ๋๋ฉ์ด์
์ํ๋ ์ํ๋ฅผ UI์ ์ฐ๊ฒฐํ๊ธฐ ์์ํฉ๋๋ค.๋ฐ๋ฉด์ Redux ์ํ ํธ๋ฆฌ ์ธ๋ถ์์ ์ ๋๋ฉ์ด์ ์ํ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ๋ ํ์คํ ์ด๋ ค์์ด ์์ต๋๋ค.
DOM์ ์กฐ์ํ์ฌ ์ ๋๋ฉ์ด์ ์ ์ง์ ๋ง๋ค๋ ค๊ณ ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒ์์ฃผ์ํด์ผํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ฝ virtual-dom์ด ๋ชจ๋ DOM ์กฐ์์ ์ฒ๋ฆฌํ๋๋กํ๋ ค๊ณ ํ๋๋ฐ (๋น์ ์ดํด์ผํฉ๋๋ค!) Redux์์ ์ ๋๋ฉ์ด์ ์ํ๋ฅผ ์ ์งํ์ง ์์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ด๋ ค์ด ๋ฌธ์ ์ ๋ด์ฐฉํ๊ฒ๋ฉ๋๋ค :
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ํฐ ์ง์ ์ ์ด๋ฃจ๋ react-motion๊ณผ ๊ฐ์ ๋ฉ์ง ํ๋ก์ ํธ๊ฐ ํ์ฌ _for React_์ด์ง๋ง Redux๋ React์๋ง ๊ตญํ๋์ง ์์ต๋๋ค. ๊ทธ๋ ๊ฒํด์๋ ์๋ฉ๋๋ค. ๋ง์ ์ฌ๋๋ค์ด ์์ ์ ๋ทฐ ๋ ์ด์ด๋ฅผ ๊ฐ์ ธ์ Redux์ ํตํฉํ๋ ค๊ณ ํฉ๋๋ค.
๊ถ๊ธํ ์ฌ๋์ด๋ผ๋ฉด Redux + virtual-dom์ ๋ํด ์ ๊ฐ ์ฐพ์ ์ต๊ณ ์ ์๋ฃจ์ ์ ๋ ๊ฐ์ง ์ํ ์์๋ฅผ ์ ์งํ๋ ๊ฒ์ ๋๋ค. Redux๋ ํต์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ์ ์งํ๊ณ , ์์ ์ ๋ํ ์๋ต์ผ๋ก ํด๋น ์ํ๋ฅผ ์กฐ์ํ๋ ํต์ฌ ๋ก์ง์ ๋ณด์ ํฉ๋๋ค. ๋ค๋ฅธ ์ํ ์ ๋๋ฉ์ด์ ์ํ๋ฅผ ์ ์งํ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ์ฒด์ ๋๋ค (๋๋ mobservable์ ์ฌ์ฉํฉ๋๋ค). ๊ทธ๋ฐ ๋ค์ ํธ๋ฆญ์ Redux ์ํ ๋ณ๊ฒฝ _and_ ์ ๋๋ฉ์ด์ ์ํ ๋ณ๊ฒฝ์ ๋ชจ๋ ๊ตฌ๋ ํ๊ณ UI๋ฅผ ๋ ๊ธฐ๋ฅ์ผ๋ก ๋ ๋๋งํ๋ ๊ฒ์ ๋๋ค.
/* Patch h for jsx/vdom to convert <App /> to App() */
import h from './h'
import { diff, patch, create } from 'virtual-dom'
import { createStore } from 'redux'
import { observable, autorun } from 'mobservable'
import TWEEN from 'tween.js'
import rootReducer from './reducers'
import { addCard } from './actions'
import App from './containers/App'
// Redux state
const store = createStore()
// Create vdom tree
let tree = render(store.getState())
let rootNode = create(tree)
document.body.appendChild(rootNode)
// Animation observable
let animationState = observable({
opacity: 0
})
// Update document when Redux state
store.subscribe(function () {
// ... anything you need to do in response to Redux state changes
update()
})
// Update document when animation state changes
autorun(update)
// Perform document update with current state
function update () {
const state = store.getState()
let newTree = render(state, animationState)
let patches = diff(tree, newTree)
rootNode = patch(rootNode, patches)
tree = newTree
}
// UI is a function of current state (and animation!)
function render (state, animation = {}) {
return (
<App {...state} animation={animationState} />
)
}
// Do some animations
function animationLoop (time) {
window.requestAnimationFrame(animationLoop)
TWEEN.update(time)
}
animationLoop()
new TWEEN.Tween(animationState)
.to({ opacity: 100 }, 300)
.start()
// Or when you dispatch an action, also kick off some animation changes...
store.dispatch(addCard())
/* etc... */
ํ๋ฅญํ ๋ต๋ณ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ๊ณ์ ์ค์ธ์.
ํ ๊ฐ์ง ์ฃผ๋ชฉํ ์ ์ Redux๊ฐ _all_ ์ํ์ ์ฌ์ฉ๋๋๋ก ์๋ํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์ฑ์ ์ค์ํด ๋ณด์ด๋ ๋ชจ๋ ๊ฒ. ์ ๋ ฅ๊ณผ ์ ๋๋ฉ์ด์ ์ํ๋ React (๋๋ ๋ค๋ฅธ ์์ ์ํ ์ถ์ํ)์์ ์ฒ๋ฆฌํด์ผํ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. Redux๋ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ ๋ฐ ๋ก์ปฌ์์ ์์ ๋ ๋ชจ๋ธ๊ณผ ๊ฐ์ ์์ ์ ๋ ์ ํฉํฉ๋๋ค.
ํํ
์ฌ๋ฌ ์ธ์ ์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํด์ผ ํ ๋ redux์ ๋จ์ผ ์ํ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ด๋ ค์ ์ต๋๋ค. ๋์ผํ ๋ชจ์์ ๊ฐ์ง ์์์ ์์ ๋ถ๊ธฐ๊ฐ ์๊ณ ๊ฐ๊ฐ ๊ณ ์ ํ ์๋ณ์๊ฐ ์ฌ๋ฌ ๊ฐ ์์ต๋๋ค (๋ฐ์ดํฐ์ ์ถ์ฒ์ ๋ฐ๋ผ ๋ค๋ฅธ ํค๋ฅผ ์ฌ์ฉํฉ๋๋ค). ๊ฐ์๊ธฐ ๊ธฐ๋ฅ๊ณผ ์ฌ ์ ํ ๊ธฐ๋ฅ์ ๋จ์์ฑ์ ์ด๋ฌํ ์๊ตฌ ์ฌํญ์ ์ง๋ฉดํ์ ๋ ๋น ๋ฅด๊ฒ ์ฌ๋ผ์ก์ต๋๋ค. ํน์ ๋ถ๊ธฐ๋ฅผ ๋์์ผ๋กํ๋ ์ฌ์ฉ์ ์ง์ getter / setter๋ฅผ ์์ฑํด์ผํ๋ ๊ฒฝ์ฐ ๋จ์ํ๊ณ ๊ตฌ์ฑ ๊ฐ๋ฅํ ํ๊ฒฝ์์ ์ง๋์น๊ฒ ๋ณต์กํ๊ณ ํํํ๋ค๊ณ ๋๊ผ์ต๋๋ค.
์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ ์์ธํ ์ค๋ช ํ๋ ๋ฌธ์ ๋ฅผ ๋ง๋์๊ฒ ์ต๋๊น? ๋๋ฝ ๋ ์ํ ๋ชจ์์ ๋ค๋ฅด๊ฒ ๊ตฌ์ฑํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด์์ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ํ ๋ชจ์์ด ๊ฐ์ง๋ง ๋ค๋ฅธ ๊ฐ์๊ธฐ์ ์ํด ๊ด๋ฆฌ๋๋ ์ฌ๋ฌ ๋ถ๊ธฐ๋ ์ํฐ ํจํด์ ๋๋ค.
๋ฟก ๋นต๋จ
๊ฐ์๊ธฐ ๊ฐ์ ์ํ ํค ์ถฉ๋ ํ๋ฅ ์ด ์ฆ๊ฐํ์ต๋๋ค.
์ด๋ป๊ฒ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ๋์ง ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น? ์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ ์ํ ์ฌ๋ผ์ด์ค์์ ๋จ์ผ ๊ฐ์๊ธฐ๋ฅผ ์คํํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ถฉ๋์ ์ด๋ป๊ฒ ๋ฐ์ํ ์ ์์ต๋๊น? ์ฃผ์์ ์ฌ๋ฌ ๋ฒ ํต๊ณผํ๊ณ ์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด ๊ทธ ์ด์ ๋ ๋ฌด์์ ๋๊น?
@gaearon @istarkov : ์๋ง๋ ๋ค์ํ ํ๋ฌ๊ทธ์ธ๊ณผ ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋์ผํ ์ต์์ ๋ค์ ์คํ์ด์ค๋ฅผ ์ํด
์, ์ด๊ฒ์ด @istarkov๊ฐ ์๋ฏธํ๋ ๊ฒ์ด
@gaearon
์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ ์์ธํ ์ค๋ช ํ๋ ๋ฌธ์ ๋ฅผ ๋ง๋์๊ฒ ์ต๋๊น? ๋๋ฝ ๋ ์ํ ๋ชจ์์ ๋ค๋ฅด๊ฒ ๊ตฌ์ฑํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด์์ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ํ ๋ชจ์์ด ๊ฐ์ง๋ง ๋ค๋ฅธ ๊ฐ์๊ธฐ์ ์ํด ๊ด๋ฆฌ๋๋ ์ฌ๋ฌ ๋ถ๊ธฐ๋ ์ํฐ ํจํด์ ๋๋ค.
๋๋ ๊ธฐ๋ปํ ๊ฒ์ ๋๋ค! ์ ์๋ง ๊ธฐ๋ค๋ ค์ฃผ์ธ์.
๋๋ ๊ทธ ๋ถ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋จ์ผ ๊ณต์ ๊ฐ์๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง ํ์คํ ๋ฐ ํจํด์ผ๋ก ๊ฐ์ฃผ๋์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ redux๊ฐ ์ ๊ณตํ๋ ํจ๋ฌ๋ค์์ ๋์ผํ ๋ถ๊ธฐ๋ฅผ ๋ถ๋ณ ์ํ๋ก ์ง๋ ฌํ / ์ญ ์ง๋ ฌํํ๋ ์๋ฒฝํ ์ฌ์ฉ ์ฌ๋ก์ ๊ทธ๋ฆฌ ๋ฉ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ํน์ ๋ถ๊ธฐ๋ฅผ ํน์ ํค๋ก ๋์์ผ๋ก ์ง์ ํ๋ ๊ฐ์ ๋ ๋ ผ๋ฆฌ๋ก reselect์ ๊ฐ์ ๊ฒ์ ๋น๋ํ๋ ๊ฒ์ด redux์ ์ ์ ์ ์ด๊ธ๋๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ ๋ํด ์คํ ์ค๋ ๋์ ๋ํด ์ด์ผ๊ธฐํ๋ ๊ฒ์ ๊ธฐ์๊ฒ ์๊ฐํฉ๋๋ค. ๋๋ ์์ฃผ ์ ํ๋ฆด ์ ์์ต๋๋ค.
@taggartbg : ์ฝ๋๊ฐ ์ฌ๊ธฐ์ ์ด๋ป๊ฒ ์๊ฒผ๋์ง ๋ชจ๋ฅธ ์ฑ ์ ์ ์ผ๋ก ๋งํ๊ธฐ. ๋น์ ์ ์ด์ ๊ฐ์ ์ํ๋ฅผ ๋ค๋ฃจ๋ ค๊ณ ํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๊น?
{ groupedData : { first : {a : 1, b : 2}, second : {a : 3, b : 4}, third : {a : 5, b, 6} }
๊ฐ ์์ ์ ์ผ๋ถ๋ก ๊ทธ๋ฃน ๋ณ ID ํค๋ฅผ ์ฌ์ฉํ๋ ๋จ์ผ ๊ฐ์๊ธฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ๊ฐ์๊ธฐ ์ธก์์์ด๋ฅผ ์ฒ๋ฆฌ ํ ์์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฌ์ค, https://github.com/erikras/multireducer , https://github.com/lapanoid/redux-delegator , https://github.com/reducks/redux-multiplex , ๋๋ https://github.com/dexbol/redux-register?
๋ํ ์ฌ ์ ํ ์ธก๋ฉด์์ React-Redux๊ฐ ์ด์ ์ปดํฌ๋ํธ ๋ณ ์ ํ๊ธฐ๋ฅผ ์ง์ํ๋ค๋ ์ฌ์ค์ด ๋์์ด ๋ ์ ์์ต๋๋ค. ์ด๋ ์ปดํฌ๋ํธ props๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ํํ๋ ์๋๋ฆฌ์ค๋ฅผ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
@gaearon
ํ ๊ฐ์ง ์ฃผ๋ชฉํ ์ ์ Redux๊ฐ ๋ชจ๋ ์ํ์ ์ฌ์ฉ๋๋๋ก ์๋ํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์ฑ์ ์ค์ํด ๋ณด์ด๋ ๋ชจ๋ ๊ฒ. ์ ๋ ฅ๊ณผ ์ ๋๋ฉ์ด์ ์ํ๋ React (๋๋ ๋ค๋ฅธ ์์ ์ํ ์ถ์ํ)์์ ์ฒ๋ฆฌํด์ผํ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. Redux๋ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ ๋ฐ ๋ก์ปฌ์์ ์์ ๋ ๋ชจ๋ธ๊ณผ ๊ฐ์ ์์ ์ ๋ ์ ํฉํฉ๋๋ค.
๋ฌธ์์ ํํ ๋ฆฌ์ผ์ ์ฝ๋ React ๊ฐ๋ฐ์๋ ์ด๋ฏธ์ด ์์ ์ํ ์ถ์ํ๋ฅผ ์์ ๋กญ๊ฒ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก Redux๊ฐ ํ๋ก์ ํธ์ ์ ํฉํ ์์น๋ฅผ ๊ณ ๋ คํ ๋ ์ด๋ฏธ ์ผ๋์๋๊ณ ์์ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ UI์ ๋ํ ๊ธฐ๋ฅ์ ์ ๊ทผ์ ์ํ๋ React์ ๋ํ ๊ฒฝํ์ด ๊ฑฐ์ ๋๋ ์ ํ์๋ ๊ฐ๋ฐ์์ ๊ด์ ์์๋ Redux์ ์ํ ์ํ๊ฐ ๋ช ํํ์ง ์์ ์ ์์ต๋๋ค. ์ฒ์์๋ Redux์ virtual-dom์ผ๋ก ์ถฉ๋ถํ์ง๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ณต์ก ํด์ง์ ๋ฐ๋ผ์ด ๋ค๋ฅธ "์์ ์ํ ์ถ์ํ"๊ฐ ํ์ํ๊ฒ๋์์ต๋๋ค. ๊ธฐ๋ณธ ์ ๋๋ฉ์ด์ ํ๋๊ทธ๊ฐ์๋ ์ ๋๋ฉ์ด์ ๊ฐ์๊ธฐ๋ฅผ ์ฒ์ ์ถ๊ฐ ํ ๋ ํญ์ ๋ถ๋ช ํ์ง๋ ์์ง๋ง ๋์ค์๋ ์๋นํ ๊ณ ํต์ค๋ฌ์์ง๋๋ค.
๋ฌธ์๊ฐ Redux์ ์ ํฉํ ์ํ์ ๋ค๋ฅธ ๋๊ตฌ๋ก ๋ ์ ํด๊ฒฐ๋๋ ์ํ๋ฅผ ์ธ๊ธํ๋ ๊ฒ์ด ์ข์ ์ ์์ต๋๋ค. React ๊ฐ๋ฐ์์๊ฒ๋ ์ค๋ณต ๋ ์ ์์ง๋ง ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ Redux๋ฅผ ์ดํด๋ณด๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ํคํ ์ฒ๋ฅผ ๊ณํ ํ ๋ ์ผ๋์๋๋ฉด ๋งค์ฐ ์ ์ฉ ํ ์ ์์ต๋๋ค.
ํธ์ง : ๋ฌธ์ ์ ์ ๋ชฉ์ "๋ชจ๋ ์ํ๋ฅผ ๋จ์ผ ๋ถ๋ณ ์์์ ์ ์ฅํ๋ ๋จ์ ์ ๋ฌด์์ ๋๊น?"์ ๋๋ค. ์ด "๋จ์ผ ๋ถ๋ณ ์์์ ๋ชจ๋ ์ํ"๋ Redux ํธ๋ฆฌ์์ ๋ง์ ์๋ชป๋ ์ข ๋ฅ์ ์ํ๋ฅผ ๊ฐ์ ธ ์ค๋ ์ผ์ข ์ ํํ์ ๋๋ค. ๋ฌธ์๋ ๊ฐ๋ฐ์๊ฐ ์ด๋ฌํ ์ข ๋ฅ์ ํจ์ ์ ํผํ๋ ๋ฐ ๋์์ด๋๋ ๋ช ๊ฐ์ง ๋ช ์์ ์ธ ์์ ๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๋ค.
@gaearon ์ฐ๋ฆฌ๋ Cycle.js์์ ๋จ์ผ ์์ ์ํ์ ํ์ดํ ๊ฐ์ ๊ตฌ์กฐ์ ์ฐจ์ด์ ์ ๋ํด ํฅ๋ฏธ๋ก์ด ๋ํ๋ฅผ ๋๋์์ต๋๋ค. ์ฌ๊ธฐ .
์ด๊ฒ์ด 100 % Redux์ ๊ด๋ จ์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง Observable ์คํธ๋ฆผ์ ์ฑ ์ฃผ๋ณ์ ๋ฐ์ดํฐ ํ๋ฆ์ผ๋ก ์ฌ์ฉํ๋ ๊ตฌํ๊ณผ๋ ๋ค๋ฅธ ๊ด์ ์ ์ ๊ณตํ๊ณ ์ถ์์ต๋๋ค (Cycle์ ๊ฒฝ์ฐ ์์ ํจ์ ์งํฉ ์).
Cycle์ ๋ชจ๋ ๊ฒ์ด Observable์ด๊ธฐ ๋๋ฌธ์ ์ํ๋ฅผ ํ ๊ฒฝ๋ก ๋ณ๊ฒฝ์์ ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ์ด๋ํ๋ ๋ฐ ์ด๋ ค์์ด์์์ต๋๋ค. ์ด๊ฒ์ ๊ฒฝ๋ก๊ฐ ๋ณ๊ฒฝ๋ ํ ๊ตฌ๋ ์๊ฐ์๋ Observable ์ํ ๋๋ฌธ์ด๋ฉฐ ๋จ์ผ ์์ ์ํ๋ฅผ ๊ตฌํํ์ง ์๋ ์ด์ ๋ฅผ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ๋ด ์ฑ์์ ์ํ๊ฐ ๋ณ๊ฒฝ ๋ ๋๋ง๋ค ํ์ดํ๋ฅผ ์ฐํํ์ฌ ์ต์์ ์ ์ฅ์๋ก ๋ค์๋ณด๊ณ ํฉ๋๋ค ( view terrible ์ฌ๊ธฐ์ ๊ทธ๋ฆผ ).
Cycle์ ์ฌ์ฉํ๋ฉด ๋๋ผ์ด๋ฒ์์ ๋ถ์์ฉ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ์ต์์ ๋๋ผ์ด๋ฒ์์ ๊ตฌ์ฑ ์์์ ๊ทธ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ๋ฃจํ๋ฅผ ๋ง๋ค์ด์ผํฉ๋๋ค. ๊ทธ๋์ ์ ๋ ๊ทธ๋ฅ ๊ฑด๋ ๋ฐ๊ณ ๋๋ฐ๋ก ์๋ก ๋์๊ฐ์ ์ฒญ์ทจํ๋ ๊ตฌ์ฑ ์์๋ก ๋์๊ฐ๊ณ ์ถ์์ต๋๋ค. Redux๋ฅผ ์๊ฐ์ ์์ฒ์ผ๋ก ์ผ์์ต๋๋ค.
์ณ๊ฑฐ๋ ๊ทธ๋ฅธ ๊ฒฝ์ฐ๋ ์๋์ง๋ง ์ด์ ํ์ดํ์ ์ํํ๊ณ ์ํ ๋๋ผ์ด๋ฒ๋ฅผ ์์ ๋๊ณ ํ์์ ๋ฐ๋ผ ์ํ๋ฅผ ๋ค๋ฅธ ๊ตฌ์ฑ ์์๋ก ํ์ดํ ํ ์์๋ ๋ฅ๋ ฅ์ด์์ด ๋ฆฌํฉํ ๋ง, ํ๋กํ ํ์ดํ ๋ฐ ๊ฐ๋ ฅํ ์ดํด์ ๋งค์ฐ ์ ์ฐํฉ๋๋ค. ๊ฐ ๊ตญ๊ฐ์ ์์ฒ, ๊ฐ ์๋น์ ๋ฐ ์๋ก์๊ฒ ์ด๋ป๊ฒ ๋๋ฌํ๋์ง.
๋ํ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ฒ์ ์ ํ๋ ์ฌ๋๋ค์ (๋ฌผ๋ก Cycle์ ์ดํดํ๋ค๋ฉด) ์ฝ๊ฒ ์ ์ ์ฐ๊ฒฐํ๊ณ ์ํ๊ฐ ์ฒ๋ฆฌ๋๊ณ ํ์ดํ๋๋ ๋ฐฉ๋ฒ๊ณผ ์ฝ๋์์์ด ๋ชจ๋ ๊ฒ์ ์ผ๋์๋๊ณ ์๊ฐ์ ํํ์ ๋งค์ฐ ๋น ๋ฅด๊ฒ ๊ทธ๋ฆด ์ ์์ต๋๋ค.
์ด๊ฒ์ด ์์ ํ ๋ฌธ๋งฅ์์ ๋ฒ์ด๋ ๊ฒฝ์ฐ ๋ฏธ๋ฆฌ ์ฃ์กํฉ๋๋ค. ๋ค๋ฅธ ํจ๋ฌ๋ค์์ด ๋น์ทํ ๋ํ๋ฅผ ์ด๋ป๊ฒํ๋์ง ๋ณด์ฌ์ฃผ๊ณ ์ถ์์ต๋๋ค.
๋ฟก๋ฟก
๊ฐ ์์ ฏ์ ๋ ์ฌ์ด์ ๊ฒน์น์ง ์๊ณ ์์ฒด ์ํ๋ฅผ ์ ์งํด์ผํฉ๋๋ค. ์ ํ ํ์ ๊ฐ ์์ ฏ์ ํ ๋น ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฏ๋ก ๋ค๋ฅธ ์ฌ๋์ ์ฝ๋๊ฐ ํ๊ฒฝ์ ๋ฏธ์น๋ ์ํฅ์ ๋ชจ๋ฅผ ์ ์์ต๋๋ค.
๋๋ ์์ ฏ์ด ์์ฒด ์ํ (์๋ง๋ ์์ฒด (redux?) ์ ์ฅ์ ์ผ ์๋ ์์)๋ฅผ ๊ฐ์ง ๋ ๋ ๋ซ๋ค๊ณ ์๊ฐํ๋ฏ๋ก ๋ชจ๋ (๋งค์์ ) ์ฑ์์ ๋ ๋ฆฝ์ ์ผ๋ก ์๋ํ๊ณ ์ผ๋ถ ์์ฑ ๋ง๋ฐ์ ์ ์์ต๋๋ค. ๋ ์จ ์์ ฏ์ ๋ํด ์๊ฐํด๋ณด์ญ์์ค. ์์ฒด์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ํ์ ํ ์ ์์ผ๋ฉฐ ๋์, ๋์ด ๋ฐ ๋๋น์ ๊ฐ์ ์์ฑ ๋ง ์์ ํ ์ ์์ต๋๋ค. ๋ ๋ค๋ฅธ ์๋ Twitter ์์ ฏ์ ๋๋ค.
@chicoxyzzy ๊ด๋ จ : https://github.com/rackt/react-redux/issues/278
์ข์ ํ ๋ก !
์ฃผ๋ก ์ฌ๋ฌ ์ฑ / ์ปดํฌ๋ํธ / ํ๋ฌ๊ทธ์ธ์ ๊ฒฐํฉํ๋ ๊ฒ์ด ๋ถํธํฉ๋๋ค.
๋ด๊ฐ ๋ง๋ ๋ชจ๋์ ๊ฐ์ ธ ์์ ๋ค๋ฅธ ๋ชจ๋ / ์ฑ์ ๋์ง ์๋ ์์ต๋๋ค. ๋ฆฌ๋์๋ฅผ ์ฑ ์คํ ์ด๋ก ๋ณ๋๋ก ๊ฐ์ ธ์์ผํ๊ณ , ๋ด ํน์ ํค ์๋์ ๋ฃ์ด์ผํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ชจ๋์ ์๊ณ ์์ต๋๋ค. ์ด๊ฒ์ ๋ํ ์ ์ฒด ์ํ์ ์ฐ๊ฒฐ๋๊ธฐ ๋๋ฌธ์ @connect
์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ชจ๋์ ๋ณต์ ํ๋ ๊ฒ์ ์ ํํฉ๋๋ค.
์๋ฅผ ๋ค๋ฉด :
iMessage์ ๊ฐ์ ๋ฉ์ ์ ๋ฅผ ๋ง๋ค๊ณ ์์ต๋๋ค. redux ์ํ๋ currentConversationId
๋ฑ์
๋๋ค. ๋ด Messenger
๊ตฌ์ฑ ์์์๋ @connect(state => ({ currentConversationId: state.messenger.currentConversationId }))
์์ต๋๋ค.
์ด Messenger
๋ฅผ ์ ์ฑ์ ํฌํจํ๊ณ ์ถ์ต๋๋ค. ์๋ํ๋ ค๋ฉด import { rootReducer as messengerRootReducer } from 'my-messenger'
๋ฅผ combineReducers({ messenger: messengerRootReducer })
์ ์ถ๊ฐํด์ผํฉ๋๋ค.
์ด์ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ๋ ๊ฐ์ <Messenger>
์ธ์คํด์ค๋ฅผ ์ฑ์ ๊ฐ๊ณ ์ถ์ ๊ฒฝ์ฐ ๋ฉ์ ์ ๊ตฌ์ฑ ์์์์ state.messenger
์ ๋ฐ์ธ๋ฉ๋์ด ์๊ธฐ ๋๋ฌธ์ ํ ์ ์์ต๋๋ค. ๋ง๋ค๊ธฐ@connect
์์ต๋๋ค.
๋ํ ํฌํจํ๋ ์ฑ์ my-messenger
๋ชจ๋์ ์กด์ฌํ๋ ํน์ ์์
์ด๋ฆ์ด ์๋ค๊ณ ๊ฐ์ ํ๋ฉด ์ถฉ๋์ด ๋ฐ์ํฉ๋๋ค. ์ด๊ฒ์ด ๋๋ถ๋ถ์ redux ํ๋ฌ๊ทธ์ธ์ @@router/UPDATE_LOCATION
์ ๊ฐ์ ์ ๋์ฌ๊ฐ์๋ ์ด์ ์
๋๋ค.
๋ฌด์์ / ๋ฏธ์น ์์ด๋์ด ๋ช ๊ฐ์ง :
@connect
๋ ์์ ์ ํน์ ์กฐ๊ฐ์ ์ฐ๊ฒฐํ ์ ์์ผ๋ฏ๋ก state.messenger[0]
/ state.messenger[1]
์ ๊ฐ์ด ์์ฒด ๋ฐ์ดํฐ ์กฐ๊ฐ์ ์ฐ๊ฒฐํ๋ ์ฌ๋ฌ <Messenger>
์ฑ์ ํฌํจ ํ ์ ์์ต๋๋ค. state.messenger[1]
์ฌ์ ํ state.messenger
๊ณ์ ์ฐ๊ฒฐ๋๋ <Messenger>
๋ํด ํฌ๋ช
ํด์ผํ์ง๋ง ํฌํจํ๋ ์ฑ์ ๋ค์๊ณผ ๊ฐ์ด ์ฌ๋ผ์ด์ค๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๋ค.
@connect(state => ({ messengers: state.messengers }))
class App extends Component {
render() {
return (
<div>
{this.props.messengers.map(messenger =>
<ProvideSlice slice={{messenger: messenger}}><Messenger /></ProvideSlice>
}
</div>
)
}
}
์ ์ญ ์ ๊ทํ ๋ ์ํฐํฐ๋ฅผ ์ฌ์ฉํ ๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. state.entities
๋ ์์ด์ผํฉ๋๋ค. ๋ฐ๋ผ์ ์ฌ๋ผ์ด์ค ์ํ์ ํจ๊ป ์ ์ฒด ์ํ๊ฐ ์ด๋ป๊ฒ ๋ ์กด์ฌํด์ผํฉ๋๋ค. ProvideSlice
์ Messenger
์ @connect
์์ ์ฝ์ ์์๋ ์ปจํ
์คํธ๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
๋ ๋ค๋ฅธ ๋ฌธ์ ๋ <Messenger>
๊ตฌ์ฑ ์์์ ์ํด ๋ฐ์ํ ์์
์ ๋ฐ์ธ๋ฉํ๋ ๋ฐฉ๋ฒ์ด ํด๋น ์ฌ๋ผ์ด์ค์๋ง ์ํฅ์ ๋ฏธ์น๋ ๊ฒ์
๋๋ค. @connect
์๋์ ProvideSlice
์ด (๊ฐ) ํด๋น ์ฃผ์ ๋ํด์๋ง mapDispatchToProps
์์
์ ์คํํฉ๋๋ค.
store
๋ฐ reducer
์ ์๋ฅผ ๊ฒฐํฉํ์ฌ ๊ฐ ๊ฐ์๊ธฐ๊ฐ ๋
๋ฆฝํ ์ผ ์๋ ์์ต๋๋ค. ๊ฐ์๊ธฐ๊ฐ ๋ทฐ์ธ ๋์ ์ปจํธ๋กค๋ฌ์ฒ๋ผ ์๋ฆฌ๋ฅผ ์ ์ฅํฉ๋๋ค. React์ ์ ๊ทผ ๋ฐฉ์, "๋ชจ๋ ๊ฒ์ด ๊ตฌ์ฑ ์์์
๋๋ค"(angular 1.x์ ์ปจํธ๋กค๋ฌ / ์ง์๋ฌธ๊ณผ ๋ฌ๋ฆฌ)๋ฅผ ์ทจํ๋ฉด ๊ตฌ์ฑ ์์์ ํด๋น ์ํ / ๋์์ด ์ง์ ์ผ๋ก ๋
๋ฆฝํ์ด ๋ ์ ์์ต๋๋ค. ์ ๊ทํ ๋ ์ํฐํฐ (์ : '๊ธ๋ก๋ฒ ์ํ')์ ๊ฐ์ ๊ฒฝ์ฐ React์ ์ปจํ
์คํธ์ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋ชจ๋ ์์
(์ : getState
์ thunk
) / ์ฐ๊ฒฐ๋ ๊ตฌ์ฑ ์์๋ฅผ ํตํด ์ก์ธ์ค ํ ์ ์์ต๋๋ค.
@elado ์ง๊ธ๊น์ง ๋ณธ ๊ฐ์ฅ ์๋ฆฌํ ์์ด๋์ด๋ "์ ๊ณต์"๋ฅผ ์ผ๋์๋๊ณ ์ค๊ณํ๋ ๊ฒ์ ๋๋ค. https://medium.com/@timbur/react -automatic-redux-providers-and-replicators-c4e35a39f1
Thx @sompylasar. ๋๋ ์ฝ๊ฐ์๋ก๋ ํธ๋ฆฝ atm์ ์์ง๋ง ๊ธฐํ๊ฐ ์๊ธฐ๋ฉด ์ด๋ฏธ React์ Redux์ ์ต์ํ ์ฌ๋๋ค์ ์ํด ๊ณต๊ธ์๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ฒ ์ค๋ช ํ๋ ๋ ๋ค๋ฅธ ๊ธฐ์ฌ๋ฅผ ์์ฑํ ๊ณํ์ ๋๋ค. ์ด๋ฏธ ์ต์ํ ์ฌ๋์ด๋ผ๋ฉด ๋๊ตฌ๋ ๊ฐ๋จํ๊ณ ๊ฐ๋จํฉ๋๋ค. :)
_ ๋๊ธ์ด https://github.com/loggur/react-redux-provide/issues/8_ ๋ก ์ด๋ํ์ต๋๋ค.
@gaearon ์ ์ฌ์ ํ โโ์ด๊ฒ์ ๋ํ ๋น์ ์ ์๊ฐ์ ๋ฃ๊ณ ์ถ์ต๋๋ค.
๋ด ๊ฐ์ฅ ํฐ ๋ฐ๋ ค๊ฒฌ์ ๋์์ ๋ ๊ฐ์ ๋ ๋ฆฝ์ ์ธ ๊ณ์ธต (๋ณด๊ธฐ ๋ฐ ๊ฐ์๊ธฐ)์ด ์๊ธฐ ๋๋ฌธ์ ์ปจํ ์ด๋ ๊ตฌ์ฑ ์์๋ฅผ ๊ตฌ์ฑ, ์ฌ์ฌ์ฉ, ์ค์ฒฉ ๋ฐ ์ผ๋ฐ์ ์ผ๋ก ์ด๋ํ๋ ๊ฒ์ด ๋ ์ด๋ ต๋ค๋ ๊ฒ์ ๋๋ค. ๋ํ Redux๋ฅผ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ผ๋ก ์ฌ์ฉํ๊ฑฐ๋ Redux ์นํ์ ์ธ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ค๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ตฌ์ฑ ์์๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ๋ ์์ ํ ๋ช ํํ์ง ์์ต๋๋ค. (๋ค์ํ ์ ๊ทผ ๋ฐฉ์์ด ์์ต๋๋ค.) ๋ํ ๋ชจ๋ ์์ ์ด ์ด๋๊ฐ์์ ๋จ๋ฝ๋๋ ๋์ ์๋ก "๋๊น์ง"์ฌ๋ผ ๊ฐ์ผํ๋ค๋ ์ ์ ๊ฐ๋ช ์๋ฐ์ง๋ ์์ต๋๋ค. ์ฆ, React ๋ก์ปฌ ์ํ ๋ชจ๋ธ๊ณผ ๊ฐ์ ๊ฒ์๋ณด๊ณ ์ถ์ง๋ง ๋ฆฌ๋์์ ์ํด ๋ท๋ฐ์นจ๋๋ฉฐ, ์๋ฆ๋ค์ด ์ถ์ํ๊ฐ ์๋ ์ค์ ์ฌ์ฉ ์ฌ๋ก์ ๋ง๊ฒ ์กฐ์ ๋๊ณ ๋งค์ฐ ์ค์ฉ์ ์ด๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@gaearon ์ด๋ฌํ ์์คํ ๊ตฌํ์ ์์ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ด๋์ด๊ฐ ์์ต๋๊น?
@gaearon
์ฆ, React ๋ก์ปฌ ์ํ ๋ชจ๋ธ๊ณผ ๊ฐ์ ๊ฒ์๋ณด๊ณ ์ถ์ง๋ง ๊ฐ์๊ธฐ์ ์ํด ๋ท๋ฐ์นจ๋ฉ๋๋ค.
๊น๋ค๋ก์ด ๋ถ๋ถ์ React ๋ก์ปฌ ์ํ๊ฐ ๊ตฌ์ฑ ์์์ ์๋ช
์ฃผ๊ธฐ์ ์ฐ๊ฒฐ๋์ด ์๋ค๋ ๊ฒ์ด๋ฏ๋ก Redux์์ ๋ก์ปฌ ์ํ๋ฅผ ๋ชจ๋ธ๋งํ๋ ค๊ณ ํ๋ฉด "๋ง์ดํ
"๋ฐ "๋ง์ดํธ ํด์ "์ ๋ํ ์ค๋ช
์ด ์์ต๋๋ค. Elm์์ด ๋ฌธ์ ๊ฐ ์์ต๋๋ค. 1) ์ปดํฌ๋ํธ์ ๋ผ์ดํ ์ฌ์ดํด์ด์๊ณ 2) ๋ทฐ์ "๋ง์ดํ
"์ด ๋ชจ๋ธ์์ ํ์ ๋ ๋ฐ๋ฉด React์์๋ ๋ก์ปฌ ์ํ๊ฐ ๋ทฐ๊ฐ ๋ง์ดํธ ๋ _after_ ์กด์ฌํ๊ธฐ
๊ทธ๋ฌ๋ ๋น์ ์ด ์ธ๊ธํ๋ฏ์ด Elm ์ํคํ
์ฒ ( "๋ชจ๋ ๋ฐฉ๋ฒ")๋ ์์ฒด ๋จ์ ์ด ์์ผ๋ฉฐ React์ ์
๋ฐ์ดํธ ๋ฐ ์กฐ์ ์ฃผ๊ธฐ์ ์ ๋ง์ง ์์ต๋๋ค (์ : shouldComponentUpdate()
์ต์ ํ๋ฅผ ์์ ๋กญ๊ฒ ์ฌ์ฉํด์ผํฉ๋๋ค. ... render()
๋ด๋ถ์ ๋์คํจ์น ๋ฉ์๋๋ฅผ ์์งํ๊ฒ "์ ๋ฌ"ํ๋ฉด ์ค๋จ๋ฉ๋๋ค.)
ํน์ ์์ ์์, ์ ๋ ๊ฐ์๊ธฐ + setState๋ฅผ ์ฌ์ฉํ๊ณ ํ๋ฃจ๋ผ๊ณ ๋ถ๋ฅด๋ ๋๋์ด ๋ญ๋๋ค. : D React ๊ฐ ์ํ ํธ๋ฆฌ ๋ฅผ
๋๋ ์ด๊ฒ์ด @threepointone ์ด https://github.com/threepointone/redux-react-local ๋ก ํด๊ฒฐํ๋ ค๋ ๊ฒ์ ๋๋ค.
@acdlite Elm์ ๊ฐ๋ ์ ๋ชจ๋ธ์ ๋ก์ปฌ ์ํ์์ ์ ์๋ํ์ง๋ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ๋ง์ดํธ์ ์ด์ ์ ๋ง์ถ๊ณ ์์ฐจ ํจ๊ณผ๋ฅผ ์ฒ๋ฆฌํด์ผํ๋ ์ค์ ์์ฉ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉํ๊ธฐ์๋ ์ ๋ง ๊ณ ํต์ค๋ฌ์ ๋ณด์ ๋๋ค ... https : //๋ฅผ ์ฐธ์กฐ
@slorber ๋ค ๋์ํฉ๋๋ค. ๋ณธ์ง์ ์ผ๋ก ๋ด๊ฐ ๋ฐฉ๊ธ ๋งํ ๊ฒ์ด ์๋๋๊น? :๋
๋๋ ๋น์ ์ ์ฐ๋ ค๊ฐ ์ฝ๊ฐ ๋ค๋ฅด๋ค๊ณ ์๊ฐํฉ๋๋ค. _If_ (ํฐ "if") ๋น์ ์ด React์์ Elm ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ์ฐ๋ฆฌ๋ ์ฌ์ ํ ์๋ช ์ฃผ๊ธฐ์ ์ ๊ทผ ํ ์ ์๊ณ , ํ์ถ ํด์น๋ก์์ setState ๋ฑ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋น์ ์ด ์ธ๊ธ ํ ๋ฌธ์ ๊ฐ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์, ์ฐ๋ฆฌ๋ @acdlite ๊ฐ์ ํ์ด์ง์ ์์ต๋๋ค.
React๊ฐ์๋ Elm ์ํคํ
์ฒ๋์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ์
๋๋ค.
Elm์กฐ์ฐจ๋ vdom ํํฌ ์ฌ์ฉ์ ํ์ฉ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฏธ๋์์์ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ Elm ์ํคํ ์ฒ์๋ ๊ฝค ๋ง์ ์์ฉ๊ตฌ๊ฐ ํ์ํฉ๋๋ค. ๋ฉํ / ๋ฉํ ํด์ ์์ ์ Flow ๋๋ Typescript๋ฅผ ์ฌ์ฉํ์ง ์๋ ํ ์ง์ ๊ฐ๋ฅํ์ง ์๋ค๊ณ ์๊ฐํ๋ฉฐ @threepointone์ ์๋ฃจ์ ๊ณผ ๊ฐ์ด์ด ๋ก์ปฌ ์ํ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ๊ฐ๋ ๊ฒ์ด ์ข์ต๋๋ค
Elm ์ํคํ ์ฒ์ ๋ํ ๋ ๋ค๋ฅธ ์ฐ๋ ค๋ ์ค์ฒฉ ๋ ๋์์ด ๋ก์ปฌ ๊ตฌ์ฑ ์์ ์ํ์์ ์ ์๋ํ๋ค๋ ๊ฒ์ ๋๋ค.ํ์ง๋ง ๋ถ๋ฆฌ ๋ ๊ตฌ์ฑ ์์ ๊ฐ์ ํต์ ์ด ํ์ํ ๊ฒฝ์ฐ์๋ ๊ทธ๋ค์ง ์ข์ ์๊ฐ์ด ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. widget1์ด widget2์ ์ํด ๋ฐ์ํ ์ผ๋ถ ์ด๋ฒคํธ๋ฅผ ์ฐพ๊ธฐ ์ํด ๊น๊ฒ ์ค์ฒฉ ๋ ์กฐ์น๋ฅผ ํ๊ณ ๊ฒ์ฌํด์ผํ๋ ๊ฒฝ์ฐ ์ปคํ ๋ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ช ๊ฐ์ง ์๊ฐ์ ํํํ์ผ๋ฉฐ 2 ๊ฐ์ "์ฌ์ํจ"๊ณผ ํจ๊ป Elm์ ์ฌ์ฉํ๋ ๊ฒ์ด ์์ ์ ์ํ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ ๋ํ redux-saga๊ฐ ํ๋ซ ์ด๋ฒคํธ๊ฐ์๋ non-elm ์ํคํ ์ฒ์์ ๋์์ด ๋ ์์๋ ๊ฒ์ ๋๋ค.
ํ์ฅ ๊ฐ๋ฅํ redux ์ฑ์ ์ค๊ณํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ข์ ์์ด๋์ด๋ฅผ ๊ฐ์ง๊ธฐ ์์ํ๊ณ ๋ ๋ฐ์ ๋ ์ด์ ๋ํด ์์ฑํ๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค.
@gaearon ๋ง์ง๋ง ๊ฒ์๋ฌผ์์ react-redux-provide
์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๊น? ๋น์ ์ด ๋๋ต์ ๋ฐ๋ฅด๋ฉด, ๋น์ ์ด ๊ทธ๊ฒ์ ์ถฉ๋ถํ ๊ฐ๊น์ด ๋ณด์ง ์์ ๊ฒ์ด ๋ถ๋ช
ํ๊ธฐ ๋๋ฌธ์ ๋๋ ๋ฌป๋ ๊ฒ์
๋๋ค.
๋ํ @acdlite ์ ์ํ ํธ๋ฆฌ ์ธ๋ถํ์ ๋ํ ์ธ๊ธ๊ณผ ๊ด๋ จํ์ฌ ์ด๊ฒ์ ์ ๊ณต ์ ์ฒด๊ฐ ํด๊ฒฐํ๋๋ก ์ค๊ณ๋ ๋ฌธ์ ์ ๋๋ค.
provide
๋ฐ์ฝ๋ ์ดํฐ๊ฐ ์ ๊ณตํ๋ API๋ ํ์คํ ์ถ์ํ์ด๋ฉฐ ์, ํ์ฌ redux
์ ์ข
์๋์ด ์์ง๋ง redux
์ ์ข
์๋์ด ์๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ ์๋ชป๋ ๋ฐฉ๋ฒ์
๋๋ค. React์ context
๋ ์์ง ์์ ํ ๊ฐ๋ฐ๋์ง ์์๊ธฐ ๋๋ฌธ์ ๊ตฌ์ฑ ์์์ ์ํ ํธ๋ฆฌ ๊ฐ์ "์ ์ฐฉ์ "์ ๋ถ๊ณผํ๋ฏ๋ก ์๊ฐํด๋ณด์ญ์์ค. actions
๋ฐ reducers
(์ฆ, ์์ ์ ์ํ)๋ฅผ ํตํด ์ํ ํธ๋ฆฌ๋ฅผ ์กฐ์ํ๊ณ ํํํ๋ ์ด์์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ์๊ฐํ์ญ์์ค. props
. ๋ณธ์ง์ ์ผ๋ก ์ ์ธ actions
๋ฐ reducers
๋ก propTypes
(๋ฐ / ๋๋ contextTypes
์ด๋ป๊ฒ ๋น์ ์๊ฒ ์ ์ฌํ ๋ฏธ๋์) import
๋ค๋ฅธ ์ด๋ค ์ฑ ๋ด์์. ์ด๋ ๊ฒํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ถ๋ก ํ๊ธฐ๊ฐ ์์ฒญ๋๊ฒ ์ฌ์์ง๋๋ค. React์ context
๋ ์ ์ฌ์ ์ผ๋ก ์ด๋ฌํ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ํฌํจํ๋๋ก ๋ฐ์ ํ ์ ์์ผ๋ฉฐ,์ด ๊ฒฝ์ฐ grepํ๊ณ @provide
๋ฐ import provide from 'react-redux-provide'
์ ๊ฑฐํ๋ ๋ฐ ์ ์ฒด 2 ์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ ์ด์ ์์กดํ์ง ์๋ ๊ฐ๋จํ ๊ตฌ์ฑ ์์๋ฅผ ๋จ๊ฒผ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ๊ฒฐ์ฝ ์ผ์ด๋์ง ์๋๋ค๋ฉด, ๋ชจ๋ ๊ฒ์ด ์๋ฒฝํ๊ณ ์์ธก ๊ฐ๋ฅํ๊ฒ ๊ณ์ ์๋ ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํฐ ๋ฌธ์ ๋ ์๋๋๋ค.
๋๋ ๋น์ ์ด ๋ฌธ์ ๋ฅผ ์ง๋์น๊ฒ ๋จ์ํํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ์ ํ ์ฅ์ฐฉ ๋ฐ ๋ถ๋ฆฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํฉ๋๋ค.
@acdlite ์์ ๊ฐ ์์ต๋๊น?
๋น์ ์ด ์ธ๊ธํ๊ณ ์๋ ๊ฒ ์ค ํ๋๋ ๊ฒ์ (์๋ฅผ ๋ค์ด) ์ธ ๊ฒฝ์ฐ props
์ผ๋ถ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ผ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ id
์ด๋ , (๋น์ ์ด ์๊ฐํ ์์๋ ๊ฑฐ์ ๋ชจ๋ ๋ค๋ฅธ ์ค์ฉ์ ์ธ ์์ฉ ํ๋ก๊ทธ๋จ๋ค)์ด ๊ณต๊ธ์๋ฅผ ํตํด ์ฝ๊ฒ ๋ฌ์ฑ ํ ์ ์์ต๋๋ค. ์์
์ค์ธ ๋ค๋ฅธ ์์
์ ๋ง์น๋ฉด ์ผ๋ง๋ ์ฌ์ด ์ง ๋ณด์ฌ ๋๋ฆฌ๊ฒ๋์ด ๊ธฐ์ฉ๋๋ค. :)
ํฅ๋ฏธ๋ก์ธ ์ ์์ต๋๋ค : ๋ฐ์ ์ํ ๊ตฌํ ๋น๊ต .
Elm, Redux, CycleJS ... (์งํ์ค์ธ ์์
)
์ฌ๋ฌ ๋งค์ฅ์ ๋ํ ๋ ๋ค๋ฅธ ๊ฐ๋ฅํ ์๊ตฌ ์ฌํญ์ ์ฌ๋ฌ _ ํ์ ๋ผ์ธ _, _ ์๊ฐ ์ฌํ _, ์ ์ฅ ์์น ๋ฐ ์ ์ฅ ๋น๋๊ฐ ๊ฐ๋ฅํ๊ณ ํ์ํ ๋์
๋๋ค. ์๋ฅผ ๋ค์ด, ๋จ์ผ ์ฌ์ฉ์์๋ง ํด๋นํ๋ user data
๋ฐ user actions
, ์ฌ์ฉ์ ๊ทธ๋ฃน์ ํด๋นํ๋ common data
๋ฐ group actions
(์ : ๊ณต์ ๋ค์ค ์ฌ์ฉ์ ํ๋ก์ ํธ ๋๋ ๋ฌธ์). ์ด๋ ๊ฒํ๋ฉด ์คํ ์ทจ์ ํ ์์๋ ํญ๋ชฉ (๊ฐ์ธ ๋ฐ์ดํฐ ๋ณ๊ฒฝ)์ ์์ ๋ ํญ๋ชฉ (๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ์ด๋ฏธ ์ถ๊ฐ ํ ํธ์ง)๊ณผ ์ฝ๊ฒ ๋ถ๋ฆฌ ํ ์ โโ์์ผ๋ฉฐ ๋ค๋ฅธ ์ ์ฅ ๋ฐ / ๋๋ ๋๊ธฐํ์ฃผ๊ธฐ๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ angular 2.0 ๊ฐ๋ฐ ๋ง์ธ๋ ์ธํธ๋ฅผ ๊ฐ์ง angular 1.x ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค๊ณ / ์ด๊ธฐ ๊ฐ๋ฐ ๋จ๊ณ์ ์์ผ๋ฉฐ redux๋ฅผ ์ฌ์ฉํ ์๊ฐ์ ๋๋ค. ๊ณผ๊ฑฐ์๋ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ๋์คํจ์น์ ์ผ๋ถ ์ ์ฉ ๋์คํจ์น์ ์๋ตํ๋ ์ฌ๋ฌ ๋งค์ฅ์์ ํ๋ญ์ค๋ฅผ ์ฌ์ฉํด ์์ต๋๋ค.
Redux๋ ๋์๊ฒ ํ๋ฅญํด ๋ณด์ด์ง๋ง ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํด ๋จ์ผ ์คํ ์ด ๊ฐ๋ ์ ์ถ๋ก ํ ์๋ ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค๋ ์์์ ์ง์ ํ๋ฏ์ด, ์ฐ๋ฆฌ๋ ์๋ก ๋ค๋ฅธ ์๋น์ ์์ฉ ํ๋ก๊ทธ๋จ์์ ํธ์คํ ๋์ด์ผํ๊ณ ์ด๋ค ๊ฐ๊ฐ์ ๋ํ ์ ์ฉ ๋ฐ์ดํฐ ์ ์ฅ์๊ฐ ํ์ํ ๋ง์ ํฐ ์์ ฏ์ด ์์ต๋๋ค.
๊ฐ์๊ธฐ๋ฅผ ๋ถํ ํ์ฌ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ / ์์ ฏ๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์์ง๋ง ์คํ ์ด๋ฅผ ๋ง๋ค ๋ ๋ชจ๋๋ฅผ ํด๋ฝ ํํด์ผํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ ์์ ฏ์ด ์ ๊ฒฝ ์ฐ์ง ์๋ ๋ฆฌ๋์์ ๋ํ ์ง์ / ๊ฐ์ ์ฐธ์กฐ์์ด ์กด์ฌํ๋ ๊ฒ์๋ณด๊ณ ์ถ์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ฑ์์ redux๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๊ทธ๋ฌํ ์ํฉ์์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ค๋ช ํ๊ธฐ ์ํด ๋ฌธ์ ํํ์ ์ง์นจ์ด๋ ์๊ฒฌ์ ์ ๋ง๋ก ๊ณ ๋ํ๊ณ ์์ต๋๋ค. ์ด๋ค ๋์์ด๋ผ๋ ์ ๋ง ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. ๊ฐ์ฌ.
@VivekPMenon : ๋น์ ์ ๊ตฌ์ฒด์ ์ธ ๊ด์ฌ์ฌ๋ ๋ฌด์์ ๋๊น? ์ํ ํธ๋ฆฌ์ ํฌ๊ธฐ? ๋ค์ ์คํ์ด์ค ์์ / ๋ฆฌ๋์๋ฅผ ๊ฒฉ๋ฆฌ ํ ์ โโ์์ต๋๊น? ๊ฐ์๊ธฐ๋ฅผ ๋์ ์ผ๋ก ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐ ํ ์ ์์ต๋๊น?
๊ทธ๋งํ ๊ฐ์น๋ฅผ ์ํด ๋ฐฉ๊ธ Redux ์ ๋์จ ์ํ๊ณ๋ฅผ ๋ถ๋ฅํ๋ ๋งํฌ ๋ชฉ๋ก์ ์์ฑํ์ต๋๋ค. ์ด๋ฌํ ๊ฒฉ๋ฆฌ / ๋ณต์ / ๋ฒ์ ์ง์ ๊ฐ๋ ์ค ์ผ๋ถ๋ฅผ ํด๊ฒฐํ๋ ค๋ ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค. ๊ฐ์๊ธฐ ํ์ด์ง ์ ๋ก์ปฌ / ์ปดํฌ๋ํธ ์ํ ํ์ด์ง ๋ฅผ ์ดํด๋ณด๊ณ ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ฌ์ฉ ์ฌ๋ก์ ๋์์ด ๋ ์ ์๋์ง ํ์ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@markerikson. ๋ต์ฅ์ ๋ณด๋ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋ด ํผ๋์ ๋๋ถ๋ถ ๋ ๋ฒ์งธ ์ง์ (๊ฒฉ๋ฆฌ)์ ๋๋ค. ์ฐ๋ฆฌ ํ ์ค ํ๋๊ฐ ํ๋ญ์ค ๊ธฐ๋ฐ์ ์์ ฏ A๋ฅผ ๋ง๋ค๊ณ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ ์ฅ์๋ฅผ ์ฌ์ฉํด์ผํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. jspm / npm ํจํค์ง๋ฅผ ๋ง๋ค๊ณ ๋ฐฐํฌํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์์ ฏ B๋ฅผ ์์ฑํ๋ ๋ค๋ฅธ ํ์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ์ด๋ค์ ๋ ๋ฆฝ์ ์ธ ์์ ฏ / ํจํค์ง์ด๋ฉฐ ์๋ก์ ๋ํ ์ง์ / ๊ฐ์ ์ข ์์ฑ์ ๊ฐ์ง ํ์๊ฐ ์์ต๋๋ค.
์ด ๋งฅ๋ฝ์์ ์ผ๋ฐ์ ์ธ ํ๋ญ์ค ์ธ๊ณ์์. ์์ ฏ A์ B๋ ํจํค์ง ๋ด์ ์์ฒด ์ ์ฅ์๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค (๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์์ ์ ์์ ํ ์ ์์ง๋ง ์ผ๋ฐ์ ์ด์ง ์์ ์์ ์ด ๋ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค). ๊ทธ๋ฆฌ๊ณ ๋ ์์ ฏ ๋ชจ๋ ์ ์ญ ๋์คํจ์ฒ์ ์ข ์๋ฉ๋๋ค. redux ํจํด์์ ๊ทธ ์ ์ฅ์๋ (๋ฌผ๋ฆฌ์ ์ผ๋ก) ์ด๋์์ ์์ฑ๋ฉ๋๊น? ์์ ฏ A์ B UI ๊ตฌ์ฑ ์์๋ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์์ ํ๊ณ ์ํ๋ฅผ ๊ฐ์ ธ ์ค๊ธฐ ์ํด ์ ์ฅ์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค. ์ ๊ธฐ์ ์ผ๋ก ๊ทธ๋ค์ ์์ฒด ๋งค์ฅ ์ธ์คํด์ค์์ ์๋ํฉ๋๋ค. ์ด ์ํฉ์์ ๋จ์ผ ์์ ๊ฐ๋ ์ด ์ด๋ป๊ฒ ์์ฉํ ๊ฒ์ธ์ง ์๊ฐํํ๋ ค๊ณ ํฉ๋๋ค.
@VivekPMenon ์ด๊ฒ์ ์ฐ๋ฆฌ ์ค ์ผ๋ถ๊ฐ ํด๊ฒฐํ๋ ค๋ ์ ํจํ ์ง๋ฌธ์ ๋๋ค.
https://github.com/slorber/scalable-frontend-with-elm-or-redux์์ ๋ช ๊ฐ์ง ํต์ฐฐ๋ ฅ์ ์ป์ ์ ์์ต๋๋ค.
๋ํ ์ฌ๊ธฐ์์ Redux-saga์ ๋ํ ๋ด anwser๋ฅผ ์ดํด๋ณด์ญ์์ค : http://stackoverflow.com/a/34623840/82609
@slorber ์ง๋ https://github.com/slorber/scalable-frontend-with-elm-or-redux
@taggartbg ๊ฒฐ๊ตญ ์ด์๋ฅผ ์ด์์ต๋๊น? ๋๋ ๋น์ทํ ๊ฒ์ ๊ด์ฌ์ด ์์ต๋๋ค-๋ค๋ฅธ ๋ ๋ฆฝ์ ์ธ ํ์ ํธ๋ฆฌ๋ฅผ ๊ฐ์ง ๋ฐ์ ๋ผ์ฐํฐ๋ฅผ ๊ฐ์ง ๋, ์๋ก์ด ๋ถ๊ธฐ๋ก ์ด๋ํ๋ ๋์ ์ด์ ๊ฒฝ๋ก์ ์ํ๋ฅผ ์ ์งํ๋ ๊ฒ์ด ๋ฌธ์ ๋ผ๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
@slorber
redux saga๋ ์์ฃผ ๋ง์ ๊ฒ์ ๋ด์ ๋ฉ์ง ํ๋ก์ ํธ๋ผ๊ณ ๋งํ๋ฉด์ ์์ํ๊ฒ ์ต๋๋ค. ์ด๊ฒ์ ๊ฒฐ์ฝ ๊ทธ๊ฒ์ ์ค์ด๋ ค๊ณ ํ์ง ์์ต๋๋ค.
ํ์ง๋ง ํ์ฌ ์ํ์์๋ ์ด๋ค ํ๋ก์ ํธ์์๋ ์ฌ์ฉํ์ง ์์ ๊ฒ์ ๋๋ค. ๋ช ๊ฐ์ง ์ด์ ๊ฐ ์์ต๋๋ค.
์์ฑ๊ธฐ์ ์ํ๋ฅผ ์ง๋ ฌํ ํ ์ ์์ต๋๋ค. ์คํ์ค์ธ ๋์์๋ ์๋ฏธ๊ฐ ์์ง๋ง ์์ ํ ์ฌ๊ฐ์ ์ํ์ ๋ฌถ์ฌ ์์ต๋๋ค. ์ด๋ก ์ธํด ์ผ๋ จ์ ์ ํ์ด ๋ฐ์ํฉ๋๋ค.
[*] ์ด๊ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ๋ชจ๋ธ์ ์ ์ ๋ด์์ ๋น์ฆ๋์ค ๋ก์ง์ ์ ์ํ๋ ๊ฒ์ผ๋ก ํด์ ๋ ์ ์์ผ๋ฉฐ, MVC์ M๊ณผ C๋ฅผ ๋์ผํ ๊ฒ์ผ๋ก ๋ง๋ค์ด ๋ฐ ํจํด์ผ๋ก ๊ฐ์ฃผ ๋ ์ ์์ต๋๋ค.
redux ์ฌ์ฉ์ ํฐ ์ฅ์ ์ค ํ๋๋ ์ํ๊ฐ ์์ ์ ์ด๋ป๊ฒ ๋ฐ์ํ๋์ง์ ๋ํ ๊ฐ๋จํ ์ดํด๋ฅผ ์ ์งํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ redux-saga๋ ์ด๋ค ๋ถ๋ถ์์ ์์ํ๋์ง ์ ์ ์๊ธฐ ๋๋ฌธ์ ์๊ธฐ์น ์์ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ด ์์ ์ ๋ง๋ญ๋๋ค.
๋ฌธ์ ๋ ์ฌ๊ฐ์ ํ์ฌ ์ํ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ฌ ์ํ์ ์ํฅ์ ๋ฏธ์น๊ณ ์ฌ๋๋ค์ ์ํ๋ฅผ ์ง๋ ฌํ ๊ฐ๋ฅํ๊ฒ ์ ์งํ๋ ๊ฒ์ ๋ํด ์คํธ๋ ์ค๋ฅผ ๋ฐ๋๋ค๋ ๊ฒ์ ๋๋ค.ํ์ง๋ง์ด๋ฅผ ์ฌ๊ฐ๋ก ์ด๋ป๊ฒ ๋ณํํฉ๋๊น? ์ํ๋ฅผ ์์ ํ ์ง๋ ฌํ ํ ์ ์๋ค๋ฉด ์ค์ ๋ก ์ง๋ ฌํํ๋ ๊ฒ์ด ์๋๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก saga๋ฅผ ๋ณต๊ตฌํ์ง ์๊ณ ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ํ๋ฅผ ๋ณต๊ตฌ ํ ์ ์์ต๋๋ค.
์ํ์ ๋ ผ๋ฆฌ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ ๋์๊ณ ์ ์๊ฐ์๋ ์ด๊ฒ์ด redux saga ๊ฐํ๋ ์ผ์ ๋๋ค.
์์ฉ ํ๋ก๊ทธ๋จ์ ์ํ๊ฐ _your_ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ณ ์ ํ๋ค๊ณ ๊ฐ์ ํด๋ ๊ด์ฐฎ์ต๋๋ค. ์ฆ, _your_ ์ ํ๋ฆฌ์ผ์ด์ ์์์ ์๋ํ๋ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ์์ธกํ ์ ์๋ค๊ณ ๊ฐ์ ํด๋ ์ข์ต๋๋ค. ์ด๋ ์ค์ ๋ก ๋ก์ง์ ์ ์ฅํ์ง ์๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ ๋ฐฉ์์ ๊ฒฐ์ ํ๋ ์ ์ฅ์ ์ ๋ณด๋ฅผ ์ ์งํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
๋ฟก๋ฟก
๋๋ ๋น์ ์ ์ฐ๋ ค๋ฅผ ์ดํดํฉ๋๋ค. redux-saga ๋ฌธ์ ๋ฅผ ์ดํด๋ณด๋ฉด ์ด๋ฌํ ๋ฌธ์ ๊ฐ ๋ ผ์๋๊ณ ํด๊ฒฐ์ฑ ์ด ์์์ ์ ์ ์์ต๋๋ค.
๋ํ redux-saga๋ ์ ๋๋ ์ดํฐ๋ก ๊ตฌํํ๊ธฐ๋ก ์ ํํ์ง๋ง saga ํจํด์ ๊ตฌํํ๋ ๊ฒ์ด ์ ํ ์๊ตฌ ์ฌํญ์ ์๋๋ฉฐ ์ฅ๋จ์ ์ด ์์ต๋๋ค.
redux-saga ๋ด๋ถ์์ redux ์ํ๋ฅผ ์ฌ์ฉํ ์์๋ ์ ํ ํจ๊ณผ๊ฐ ์์ผ๋ฏ๋ก ์์ฑ๊ธฐ ๋ด๋ถ์์ ์ํ๋ฅผ ์จ๊ธฐ๊ณ ์ถ์ง ์๋ค๋ฉด ๋จ์ํ redux-store์ ์ง์ saga ์ํ๋ฅผ ๋ฃ์ ์ ์์ง๋ง ๋ ๋ง์ ์์ ์ด ํ์ํฉ๋๋ค.
saga์ ์คํ์ ์ถ์ ํ ์์๋ saga devtools๊ฐ ์์ต๋๋ค.
์๊ฐ ์ฌํ์ ๋ํ ๊ฐ๋ฅํ ์๋ฃจ์ ์ด ์์ง๋ง ์์ง ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ์์ต๋๋ค.
๊ถ๋ฆฌ. ๊ฝค ๊ธด ์ฃผ์ ์ด๊ณ ๋งค์ฐ ํฅ๋ฏธ ๋กญ์ต๋๋ค. ์ ๋ ๋ค์ํ ๊ตญ๊ฐ ๊ด๋ฆฌ ์ ๊ทผ ๋ฐฉ์์ ๋น๊ตํด ์์ต๋๋ค.
๋น๊ตํ๋ ๋์ ๋ช ๊ฐ์ง ์ฌํญ์ ์ผ๋์๋๊ณ ์์ต๋๋ค.
๊ทธ๋์ ์ด๊ฒ์ด ์ ๊ฐ ๊ตญ๊ฐ ๊ด๋ฆฌ์ ๋ํด ์๊ฐํ ๋์ฃผ์ํ๋ ์ ์ ๋๋ค. Redux๋ ๋๋ถ๋ถ์ ์์๋ฅผ ์ ํํ์ฌ ์น์์ ๋๋ค. ๋๋ Redux๋ฅผ ๊ฝค ์ ์๊ณ ์์ผ๋ฉฐ ํด๋ผ์ด์ธํธ ์ธก js ์์ญ์์ ์นจ์ฐฉํ๊ฒ ์จ์ ์ฌ๊ฒ ํ ์ฒซ ๋ฒ์งธ ์ผ์ด์์ต๋๋ค.
๋ด๊ฐ ์ดํด๋ณธ ๊ฐ์ฅ ์ฃผ๋ชฉํ ๋งํ ๋ค๋ฅธ ํ๋ก์ ํธ๋ SAM ํจํด (_ ๋ง์ธ๋ ์ ์ ๋ค์ด๊ฐ๊ธฐ๊ฐ ์ด๋ ต๊ณ ๋๊ตฌ๊ฐ ์์ _) ๋ฐ Mobx (_ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ ์ฅ์๋ก ์๋ ค์ ธ ์์ _)์ ๋๋ค.
๋ ๋ค ๋จ์ผ ์์ค์ ์ง์ค์ด๋ผ๋ ์๊ฐ์ ๊ณต์ ํ๊ณ ์์ผ๋ฉฐ ๊ทธ๋ค์ด ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง ๋ณด๋ ๊ฒ์ด ํฅ๋ฏธ ๋กญ๋ค๊ณ ์๊ฐํฉ๋๋ค.
Mobx์ ๋ํ ๋์ (๋ฌผ๋ก ์ ํ์ ) ์ฐ๊ตฌ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
redux-orm
์ ์ ์ฌ์ ์ด ๋ณด์
๋๋ค. AFAIK ํ์ ์ ์ฅ์๋ ์ํ์ผ๋ก ๊ตฌ์ฑ ์์์ ์ ๋ฌ๋ฉ๋๋ค (์ด๋ ๊ฒํ๋ฉด ๊ตฌ์ฑ ์์๊ฐ ์ํ๋ฅผ ์ํ์ ๋งคํํ๊ฑฐ๋ ์ ์ญ ํธ๋ฆฌ์ ํน์ ํค์ ์์กดํ์ง ์์). ๊ทธ๋ฌ๋ ๋จ์ผ ์์ฑ์ ์ ๋ฌํ๋ฉด "์์ฑ"์ ๋ํ ๋ด ์๊ฐ์ด ๊นจ์ง๋๋ค. ๊ตฌ์ฑ ์์์ ํ์ํ ๋ด์ฉ์ ์ค๋ช
ํด์ผํฉ๋๋ค. ์ด๊ฒ์ ์ค์ ๋ก React propTypes
๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฌ๋๋ ์์ ์ ๋ชจ์์ ์ ์ ํ ์ ์๋ค๋ฉด ๋ฌธ์ ๊ฐ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ฒํฉ๋๋ค. ๋ํ ์ ์ฅ์ ๋ฐ ํ์ ์ ์ฅ์๋ฅผ ํด๋์ค๋ก ์ฌ์ฉํ๋ฉด ์ ๊ทํ์์ด ์ง์ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐ ํ ์ ์์ง๋ง ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ์ด๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๊ณต๊ธํ๋ ค๋ ๊ฒฝ์ฐ์๋ ์๋ฏธ๊ฐ ์์ต๋๋ค.reselect
+ connect
๋ฐ์ฝ๋ ์ดํฐ์๋ ๋ฐ๋๋ก (์คํ ์ด์ ๋ฐฉ๋ฒ์ผ๋ก) ์คํ ์ด์ ๋ฐ์ดํฐ ํ์๋ฌผ์ ๋ณด๊ดํ๋ ๊ฒ์ ์นํธํฉ๋๋ค. ์ด๊ฒ์ ๋์๊ฒ ๋ค์ ์๋ชป๋ ๊ฒ ๊ฐ์ต๋๋ค.SAM๊ณผ Redux๋ฅผ ๋น๊ตํ๋ฉด ๋ ผ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ํ๋ฅด๋ ์ง ์๊ฐํ๊ณ ์ถ์ต๋๋ค.
isForgottenPassword
). ์ด setter๋ ๋ฐ์ดํฐ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๊ณ ๋์ ์ค๋ฅ๋ฅผ ์ ์ฅํ๊ธฐ์ํ ๊ฒ์ด๊ธฐ๋ํฉ๋๋ค. setter๊ฐ ์๋ฃ๋ ํ-> ์ ์ํ๋ก ๋ค์ ๋ ๋๋งํฉ๋๋ค.๋ฐ๋ผ์ redux, SAM ๋ฐ Mobx๋ ๋ชจ๋ ์ํ๋ฅผ ํ๊ณณ์ ์ ์งํฉ๋๋ค. ๊ทธ๋ค์ดํ๋ ๋ฐฉ์์ ๊ทธ๋ค ์์ ์ ์ข์ ์ ๊ฐ์ ธ์ต๋๋ค. ์๋ฌด๋ ์ง๊ธ๊น์ง redux์ ์ํ๊ณ๋ฅผ ์ด๊ธธ ์ ์์ต๋๋ค.
๋ด๊ฐ ๋ณธ ๊ฐ์ฅ ํฐ ๋จ์ ์ ์ง๋ ฌํ ํ ์์๋ ์ํ๋ฅผ ์ฒ๋ฆฌํ๋ค๋ ๊ฒ์
๋๋ค.
์ ๊ฒฝ์ฐ์๋ ํ๋ฌ๊ทธ์ธ API๊ฐ ์์ผ๋ฏ๋ก Redux์ ํ ์ผ์ด ์์ง๋ง ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ์ํธ ์์ฉํด์ผํ๋ ๋์๊ณผ ๋ก์ง์ด ์์ต๋๋ค. ๊ทธ๋์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฃผ์ด์ง ์ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๋ฌด๋ฆฌ์ ํด๋์ค๋ฅผ ์ฒ์์ ๋ค์ ๋ง๋ค์ด์ผํฉ๋๋ค.
์ด๋ฌํ ์ข ๋ฅ์ ์ง๋ ฌํ ๋ถ๊ฐ๋ฅ ์ํ๋ฅผ ๋ ๋์ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ช ๊ฐ์ง ๊ฐ๋ ์ ์ฐ๊ตฌํ๊ณ ์์ต๋๋ค. ์ฃผ์ด์ง ์ํ์์ ๋ค์ ์์ฑํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ๋๋ ์ด๋ฏธ ํจ์ / ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ์ ์ธํ ๋ชจ๋ ๊ฒ์ ์ ์ฅ์๋ก ๋ค์ ์ฎ๊ฒผ์ต๋๋ค. ๋จ์ ๊ฒ์ ๋ด ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ๋ด ์์ ๊ณผ ์ํธ ์์ฉํ๋ ์ ์ ๋ API๊ฐ์๋ ์์ฒด ์๋ช ์ฃผ๊ธฐ๊ฐ์๋ ๊ฐ์ฒด์ ๋๋ค. -UI ๋ ๋๋ง์ด ์๋๋ผ ์ฌ์ฉ์ ์ ์ ๋ก์ง์ ๋ํ React ๊ตฌ์ฑ ์์์ ๋น์ทํฉ๋๋ค.
์ฌ๋ฌ๋ถ ์ด Erik Meijer์์ด ๊ธฐ์ฌ๋ฅผ ์ฝ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ฐ๋จํ ์ธ์ฉ๋ฌธ :
๋์ค์ ์ธ ๋ฏฟ์๊ณผ๋ ๋ฌ๋ฆฌ, ์ํ ๋ณ์๋ฅผ ๋ถ๋ณ์ผ๋ก ๋ง๋๋ ๊ฒ์ ์ฉ๋ฉ ํ ์์๋ ์์ ์ ๋ช ๋ น ํจ๊ณผ๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ๊ณผ ๊ฑฐ์ ๋น์ทํ์ง ์์ต๋๋ค.
์๋ง๋์ด ๋ชจ๋ ๋ถ๋ณ์ฑ ๋์ผ์ค๋ฅผ ๋ค์ ์ดํด๋ณผ ๋์ผ ๊ฒ์ ๋๋ค. ๋ชจ๋ ์ฌ๋๋ค์ ๋จ์ผ ์ํ ํธ๋ฆฌ์ ํฌ๊ธฐ๊ฐ ์ปค์ง๋ฉด ์ฑ๋ฅ์ด ์ ํ๋๋ค๊ณ ๋งํ ๊ฒ์ ๋๋ค. SAM ํจํด ์ ๋ณ์ด๋ฅผ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ ๊ธฐ๋ณธ ํด๋์ค ์๋ฏผ์ผ๋ก ๋ง๋ญ๋๋ค. Sagas๊ฐ ๋ ์ด์ ํ์ํ์ง ์์ ๊ฒ์์ ํจ๊ณผ (์ : ๊ฐ์ ธ ์ค๊ธฐ)๋ฅผ ์ถ์ ํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๋ณด์กฐ ์ํ ๋จธ์ ์ ์ด๋ฅด๊ธฐ๊น์ง ๋ง์ ๋จ์ํ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด ๊ธฐ์ฌ๋ ๋น์ ์๊ฒ ์ ๋ฆฌํ๊ฒ ์ฃผ์ฅํ์ง ์์ต๋๋ค. Erik Meijer๋ "์ด ๋ถ๋ณ์ฑ ๋์ผ์ค"๋ฅผ ์ฌ๊ฒํ ํ๊ณ ์ด๋ฅผ ์์ ํ ์์ฉํฉ๋๋ค . ๊ทธ๋ ์ํ ๋ณ์ด๋ฅผ ์ ๊ฑฐ ํ๋ ๊ฒ์ด ๊ธฐ๋ณธ์ ์ธ ์ฒซ ๋ฒ์งธ ๋จ๊ณ ์ด๋ฉฐ ๊ทผ๋ณธ์ ์ด์ง๋ง ์ถฉ๋ถํ์ง๋ ์๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ๊ทธ์ ๊ถ๊ทน์ ์ธ ๋ชฉํ๋ ๋ชจ๋ ์ํ ๊ด๋ฆฌ๋ฅผ ์ธ๋ชจ ์๊ฒ ๋ง๋๋ ์์ ์ ๋ถ์์ฉ์ ์์ ํ ์ ๊ฑฐํ๋ ๊ฒ์ ๋๋ค (๊ด๋ฆฌ ํ ์ํ๊ฐ ์์ต๋๋ค!).
๋๋ Erik Meijer์ ์์ ์ ํฌ์ด๋ฉฐ ๊ทธ๊ฐ ๋งํ๋ ๋ชจ๋ ๊ฒ์ ์ด์ฌํ ์ฝ๊ณ ๋ค์ ๊ฒ์ด๋ฉฐ, ๊ทธ๊ฐ ๋์ ๊ฐ์ ์ฌ์ , ๊ธฐ์ ๋ฐ ์ง์ ์ ์ฝ ํ์์ ์ด์๋์ง ์๋๋ค๋ ๊ฒ์ ๋ช ์ฌํ ๊ฒ์ ๋๋ค.
์ํํธ์จ์ด ์์ง๋์ด๋ง์ ํต์ฌ ๋ฌธ์ ๋ ๋ชจ๋ ์ฌ๋์ด ํ ๋น IS-A ๋์ฐ๋ณ์ด๋ฅผ ๋ฏฟ๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค๋ ๊ฒ์ ๋๋ค. ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ํ ๋น ๋ง ์ง์ํ๋ฉฐ ๋ณ์ด๋ ํ๋ก๊ทธ๋๋จธ์ ํด์์ ๋งก๊ฒจ์ง๋๋ค.
์ฌ๋ฌ ํ ๋น์ ํจ์ ๋ํผ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์๋์ผ๋ก ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด๋๋ ๊ฒ์ ์๋๋๋ค. ๊ทธ๊ฑด ๋ง๋ ์๋ผ.
(Application) State Mutation ๋ค์๋ ์ด๋ก ์ด ์์ต๋๋ค. TLA +๋ผ๊ณ ํฉ๋๋ค. ์ด์ํ๊ฒ๋ ... Erik์ TLA +๋ฅผ ์ธ๊ธํ์ง ์์ต๋๋ค.
JJ-
๋ง์ ํผ๋์ด์๋ ๊ฒ ๊ฐ์ผ๋ ์์ธํ ์ค๋ช ํ๊ฒ ์ต๋๋ค. Erik์ ๋ ผ๋ฌธ์ ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ๋ณ์ด ์ํ์ ๊ด๋ จํ์ฌ ๋ค์ ์์๋์์์ ์ค๋๋ ฅ์๊ฒ ๋ณด์ฌ์ค๋๋ค. ๋๋ ๋ชจ๋๊ฐ ๊ทธ๊ฒ์ ๋์ํ๋ค๊ณ ๋ฏฟ์ต๋๋ค.
๋ฌธ์ ๋ ์ด๋ป๊ฒ ํด๊ฒฐํด์ผํ๋์? ์ด๊ฒ์ด " ์ฒซ ๋ฒ์งธ ์์น "์ ๊ทผ ๋ฐฉ์์ด ํ์ํ ๋ฌธ์ ๋ผ๋ ๋ฐ ๋์ํ์ง ์์ต๋๊น?
์ปดํจํฐ ๊ณผํ์์ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ๋์ ํ ์์๋ ํ๋์ ์์น์ด ๊ฑฐ์ ์๋ค๊ณ Lamport ๋ฐ์ฌ๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํฉ๋๋ค. "์ปดํจํฐ ๊ณผํ์ ๋๋ถ๋ถ์ ์ํ ๊ธฐ๊ณ์ ๊ดํ ๊ฒ์ ๋๋ค." "๊ทธ๋ฌ๋ ์ปดํจํฐ ๊ณผํ์๋ค์ ๊ณ์ฐ์ ์ค๋ช ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ธ์ด์ ๋๋ฌด ์ด์ ์ ๋ง์ถ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ทธ ์ธ์ด๊ฐ ๋ชจ๋ ์ํ ๊ธฐ๊ณ๋ฅผ ์ค๋ช ํ๋ค๋ ์ฌ์ค์ ๊ฑฐ์ ์์ง ๋ชปํฉ๋๋ค."
์ค์ ๋ก ๋ชจ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฏธ์ ๊ด๊ณ์์ด "์ํ ๋จธ์ "์ ์ง์ ํ ์ ์์ต๋๋ค. ๋ถํํ๋ ๋ง์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ "์ํ-์์ "๋ณด๋ค๋ "์์ "์ ํธํฅ๋์ด ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ ๋นํ ์ด์ ๊ฐ ์์ต๋๋ค. (์ํ ๋จธ์ ์ ์ํ๋ ๋๋ถ๋ถ ๋ฌด์ ๋ ์์๋) ์ก์ ๊ธฐ๋ฐ ํ์์ฃผ์๋ก ํจ์ฌ ๋ ํจ์จ์ ์ผ๋ก ์ฝ๋ฉ๋๋ ๋ง์ ์ข ๋ฅ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋น์ ์ด ๊ทธ๊ฒ๋ค์ ๋ฌด์ํ ๋, ๋ณธ์ง์ ์ผ๋ก ๋น์ ์ ์ฃผ์ด์ง ์ํ์์ ๋ชจ๋ ํ๋์ด ๊ฐ๋ฅํ๋ค๊ณ ๋งํ๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ์๊ณ ์๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ค์ด ์๋๋๋ค.
Erik์ haha โโ์์ ์ ๋ํด ์ํ๋๋งํผ ์์ ์ ์์ต๋๋ค.
// prints Ha
var ha = Ha();
var haha = ha+ha;
๊ทธ๋ฌ๋ ๊ทธ๊ฐ ๋งํ๋ ๊ฒ์ ์ฃผ์ด์ง ์ํ์์ ์๋ชป๋ ํ๋์ํ๊ณ ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ ์ด์๋ ๊ทธ ์ดํ๋ ์๋๋๋ค.
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด ํ ์ด๋ธ์ ๊ฐ์ ธ ์ค๋ ๊ฒ์ ๋ฌด์์ ๋๊น? ์ ํ ๊ทธ๋ ์ง ์์ต๋๋ค. ํ๋์ ์ทจํ๋ ๊ฒ๊ณผ ๊ทธ๋ก ์ธํ ๊ฒฐ๊ณผ ์ฌ์ด์ ๊ด๊ณ๋ฅผ ๋งค์ฐ ๋ณต์กํ ๋ฐฉ์์ผ๋ก ํํํฉ๋๋ค. ๋ง์น ๊ฑฐ๋ํ ๋ฏธ๋ก์ ํ์ด (์ค๋งํธ ๋ชจ๋ ๋ ํ์ด๋)์ ๋์ง๊ณ ๋ชฉํ๋ฌผ์ ๋ง์ถ๊ธฐ๋ฅผ ๋ฐ๋ผ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
TLA +๋ ํจ๊ณผ๋ฅผ ์ฒ๋ฆฌํ๋ ํจ์ฌ ๋ ์์ฐ์ค๋ฌ์ด ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋จผ์ ๋จ๊ณ๊ฐ ๋ฌด์์ธ์ง, ๋์ฐ๋ณ์ด๊ฐ ํ๋๊ณผ ์ด๋ป๊ฒ ๊ด๋ จ๋๋์ง์ ๋ํ ๋ช ํํ ๊ฐ๋ ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. TLA +๋ฅผ ๋ฌด์ํ ์๋ ์์ง๋ง ์ง๊ตฌ๊ฐ ํํํ๊ณ ์ฐ์ฃผ์ ์ ์กฐ์ข ํ๋ ๊ฒ์ด ์ ๋ง ์ด๋ ค์ ๋ค ๊ณ ๊ฐ์ ํ์ฌ ๋ฌ์ ๋ก์ผ์ ๋ณด๋ด๋ ค๊ณ ํ๋ค๊ณ ๋ถํํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๋๋ค์ด ํ์ค์ ์๊ณก ํ ์ ์๋ค๊ณ ๋ฏฟ๋ ์ธ์์ ์ด๊ณ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
๋ค์ ๋งํ์ง๋ง, Erik์ด TLA +์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ๋์ง ์ ๋ง ๊ถ๊ธํฉ๋๋ค. LinkedIn์์ ๊ทธ์ ์ฐ๊ฒฐํ์ฌ ์ง๋ฌธ์ํ์ต๋๋ค. ๋ต์ ์ป์ง ๋ชปํ์ต๋๋ค ... ๋จ ํฌํธ ๋ฐ์ฌ๊ฐ ํ๋ง ์์ ๋ฐ์์ง๋ง ์๊ฐ์ ํ ์ ํ ๊ฐ์น๊ฐ ์์ ๊ฒ์ ๋๋ค.
์์งํ, @jdubray , ๋น์ ์์ด ์์ ์์ ๊ฒฝ๊ณ์ ํธ๋กค๋ง์ํ๊ณ ์์ต๋๋ค. ์ด ์ค๋ ๋, ๋ค๋ฅธ ๋ฌธ์ ๋ฐ ๋ค๋ฅธ ๊ณณ์์ ์ฃผ์ฅ์ ์์ญ ๋ฒ ๋ฐ๋ณตํ์ต๋๋ค. Dan๊ณผ Redux ์ปค๋ฎค๋ํฐ๋ฅผ ๋ชจ์ํ๊ณ ์๊ฒฉ ์ฆ๋ช ์ ํ๋ค์ด "TLA +"์ "Lamport"๋ผ๋ ๋จ์ด๋ฅผ ๋ง์น ์ฑ๋ฐฐ์ ์๋ช , ์ฐ์ฃผ ๋ฐ ๋ชจ๋ ๊ฒ์ ๋ํ ๋ต์ธ ๊ฒ์ฒ๋ผ ๊ณ์ ํธ์ถํฉ๋๋ค. ๋น์ ์ SAM์ด Redux๋ณด๋ค ํจ์ฌ ์ฐ์ํ๋ค๊ณ ์ฃผ์ฅํ์ง๋ง, ์ฆ๊ฑฐ๋ฅผ ๋ณด์ฌ ๋ฌ๋ผ๋ ์๋ง์ ์ด๋์๋ ๋ถ๊ตฌํ๊ณ ์๋ฏธ์๋ ๋น๊ต ์ฑ ๋ฐฉ์์ผ๋ก ๋ง์ ๊ฒ์ ์์ฑํ์ง ์์์ต๋๋ค. ๋น์ ์ ์ง๊ธ๊น์ง ์์ง ํ์ ํ์ง ๋ชปํ๋ ์ฌ๋์ ๋ง์์ ์ ๋ง๋ก ๋ฐ๊พธ์ง ์์ ๊ฒ์ ๋๋ค. ์์งํ ์ข ๋ ์์ฐ์ ์ธ ์ผ์ํ๋ฉด์ ์๊ฐ์ ๋ณด๋ด์ค ๊ฒ์ ๊ถํฉ๋๋ค.
์ด ์์ ์์ ์ค๋ ๋๋ฅผ ๋ซ์ ๊ฒ์ ๋๋ค. ๋๊ธ์ ๊ณ์ ๋ ์ ์์ง๋ง ์ฌ๊ธฐ์์ ์คํ ๊ฐ๋ฅํ ๊ฒ์ ์์ต๋๋ค.
@markerikson ์ ๋ชฉ์ด ์๋ฌด๋ฐ๋ ๊ฐ์ง
@antitoxic (๋ง์ฅ๋ ์๋ ์์) ์ธ์๋ ๊ฐ์
์ผ๋ก ์ธํด ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์ผ๋ง๋ ๋๋นด๋์ง ์๊ณ ์์ผ๋ฏ๋ก ๋ ์ด์๋ค์ ํ์๊ฐ ์์ต๋๋ค.
๊ด์ฐฎ์ ๋งํฌ ๋ด ๋๊ธ์ ์ญ์ ํ ์ ์๋๋ฐ, ์ ์ด๋ ๊ฒ ํ๋ คํ ๋ํ๋ฅผ ๋ง์น ๊น?
@jdubray ๋น์ ๋ง์ด
๋๋ TLA + ๋๋ ์ข์ง ์์ ๊ฒ์ ๋งํ์ง ์์ผ๋ฉฐ ์๋ง๋ ๋ฏธ๋์ ๋๊ตฐ๊ฐ๊ฐ ๋น์ ์ด ๊ทธ๊ฒ์ ํ๋ ๊ฒ๋ณด๋ค ๋ ๋์ ์ผ์ ํ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ดํดํ๋ ๋ฐ ์ ํ ๋์์ด๋์ง ์๋ ๊ฒ์ ๋น์ ์ด ์ค๋ช ํ๋ ๋ฐฉ์ ์ผ ๋ฟ์ด๋ฉฐ, ๋น์ ์ ์๊ตฌ์ ์ธ ๊ฒธ์ํ ์ด์กฐ๋ TLA +์ ๋ํด ๋ฐฐ์ฐ๋ ๋ฐ ์๊ฐ์ ํฌ์ํ๋๋ก ์ด๋ํ์ง ์์ต๋๋ค.
Erik์ ๋ ผ๋ฌธ์ ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ๋ณ์ด ์ํ์ ๊ด๋ จํ์ฌ ๋ค์ ์์๋์์์ ์ค๋๋ ฅ์๊ฒ ๋ณด์ฌ์ค๋๋ค. ๋๋ ๋ชจ๋๊ฐ ๊ทธ๊ฒ์ ๋์ํ๋ค๊ณ ๋ฏฟ์ต๋๋ค.
์ค์ ๋ก ๋ชจ๋ ๊ฒ์๋ฌผ์์ ํญ์ I believe everyone agrees on that
์ ๊ฐ์ ์ฉ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๊ฒ์ ์ฌ๋๋ค์๊ฒ ์ข๊ฑฐ๋, ๋์์ด๋๊ฑฐ๋, ํ์ํ๋ ๊ฒ์ด ์๋๋๋ค. ์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ํ์ง ์์ผ๋ฉฐ, ๋๋ถ๋ถ์ Erik์ ๋
ผ๋ฌธ์ ์ฝ์ง ์์๊ณ ์ฝ์ง ์์ ๊ฒ์
๋๋ค. ์ฌ๋๋ค์ ํ์ํ๋ ๋ฐฉ์์ผ๋ก ์ค๋ ํ ์์๊ณ , ์ ์ ๋ง์ ์ข
์ด๋ฅผ ์ฝ์ด๋ฌ๋ผ๊ณ ์์ฒญํ์ง ์๊ณ , ๊ทธ๋ค์ด ๋น์ ๊ณผ ๋์ํ์ง ์๊ฑฐ๋ ๋์ํ์ง ์์ผ๋ฉด ๋ฉ์ฒญํ๊ฒ ๋๋ผ๊ฒํ๋ค๋ฉด ๊ทธ๊ฒ์ ๋น์ ์ ์์ด๋์ด๋ฅผ ์ ํํ๋ ๋ฐ ๋์์ด๋์ง ์์ ๊ฒ์
๋๋ค.
TLA +๋ฅผ ๋ฌด์ํ ์๋ ์์ง๋ง ์ง๊ตฌ๊ฐ ํํํ๊ณ ์ฐ์ฃผ์ ์ ์กฐ์ข ํ๋ ๊ฒ์ด ์ ๋ง ์ด๋ ค์ ๋ค ๊ณ ๊ฐ์ ํ์ฌ ๋ฌ์ ๋ก์ผ์ ๋ณด๋ด๋ ค๊ณ ํ๋ค๊ณ ๋ถํํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
์ด๊ฒ์ ํ์คํ ์ฒซ ๋ฒ์งธ ์์น์ด ์๋ ๋น์ ์ฒ๋ผ ๋ณด์ ๋๋ค. ์ง์งํ๊ฒ, ๋น์ ์์ด ์ง์ ์ด "ํฅ๋ฏธ๋ก์ด ํ ๋ก "์ผ๋ก ๊ฐ์ฃผ๋์ด์ผํ๋ค๊ณ ์๊ฐํฉ๋๊น?
TLA +์ ๋ํ ๋ชจ๋ ๊ด์ฌ์ ๋ ์ ํ๊ณ ์ค์ ๋ก TLA +์ ๊ด์ฌ์ด์๋ ์ฌ๋๋ค์ด ๋ ๊ตฌ์ฒด์ ์ธ ๋ฌด์ธ๊ฐ๋ก ๋ฌ์ ๋ก์ผ์ ๋ณด๋ด๋ ค๊ณ ํ๋ ๊ฒ์ ๋ง๊ธฐ ๋๋ฌธ์ ๋ ผ์๊ฐ ์ค์ ๋ก ๋ ํ๋ คํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ๋๋ค์ Redux์ฒ๋ผ ์ดํดํ ์ ์์ต๋๋ค.
์ฌ์ ํ TLA +๊ฐ ๊ทธ๋งํ ๊ฐ์น๊ฐ ์๋ค๊ณ ๋งํ๋ ๊ฒ์ ์๋๋๋ค. ๋จ์ง ์๋ชป๋ ๋ฐฉ์์ผ๋ก ์๋ชป๋ ์ฌ๋๋ค์๊ฒ ๋งํ๋ ๊ฒ์ ๋๋ค. Erik์ด ๋น์ ์๊ฒ ๋๋ตํ์ง ์์๋ค๋ฉด ๊ทธ๊ฒ์ ๊ทธ๊ฐ ๋น์ ์ ์ดํดํ ์ ์๊ธฐ ๋๋ฌธ์ผ๊น์? ์ด์ฉ๋ฉด ๋น์ ์ ๋จ ํฌํธ๋ง์ด ๋น์ ์ ์ดํดํ ์์์ ์ ๋๋ก ์๋ฆฌํ๊ฐ? ์ด์ฉ๋ฉด ๋ฏธ๋์ ํ๋ง ์์๋ฐ์ ์ ์์๊น์? ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง ํ ๊ฐ์ง ํ์คํ ๊ฒ์ ํ์ฌ ํ ๋ก ์ด ํ ์ด๋ธ์ ์๋ฌด๊ฒ๋ ๊ฐ์ ธ ์ค์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค.
@gaearon์ ์ข์ํ๊ณ egghead ์ฉ TLA + / SAM ๋น๋์ค ์์ต์๋ฅผ ๋ง๋ค ์๋ ์์ต๋๋ค. 2 ์๊ฐ ๋ฏธ๋ง์ ๋์์์์ ๋งค์ฐ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ผ๋ก ์์ด๋์ด๋ฅผ ์ค๋ช ํ ์ ์๊ณ ๋ง์ง๋ง์ ํจํด์ด ํด๋ฆญํ๊ณ ๊ฐ๋ฐ์์๊ฒ ์ ์ฉํ๋ค๊ณ ๋๋ผ๋ฉด ์น๋ฆฌํฉ๋๋ค. Redux๋ ๋ง์ ์ฌ๋๋ค์ ์ํด ๊ทธ๋ ๊ฒํ์ต๋๋ค. SAM / TLA +๊ฐ Redux๋ณด๋ค ๋์ ์ด์ ๋ฅผ ์ด๋ก ์ ์ผ๋ก ์ค๋ช ํ๊ธฐ ์ํด์๋ง "์๋"ํ๊ณ ๋์ฐํ TodoMVC ๊ตฌํ์ ์ ๊ณตํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ CS ์ฐ๊ตฌ์์ด๋ฉฐ ์ฝํฌ๋ฆฌํธ ์ฌ๋ฃ๊ฐ ํ์ํฉ๋๋ค. Redux๋ก ์์ฑ๋ ์ฑ๊ณผ SAM์ผ๋ก ์์ฑ๋ ์ฑ์ ๋ณด์ฌ ์ฃผ์ค ์ ์์ต๋๊น? ์ฌ๋๋ค์ด ์ค์ ๋ก SAM ๊ตฌํ์ด ๋ ๋ซ๋ค๊ณ ๋๋ ์ ์์ต๋๊น? ์ง๊ธ๊น์ง๋ ๊ทธ๋ ์ง ์์์ต๋๋ค.
@Niondir ์ํ๋ฅผ ๋ณต๊ตฌํด์ผํ๋ ๊ฒฝ์ฐ sagas๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์
๋ฐ๋ผ์ผ ํ ํจํด์ด๋ ๊ท์น์ ๊ฐ๊น์ต๋๋ค.
put
์ด์์ด ์๋๋ก sagas๋ฅผ ๋ถ๋ฆฌํ์ญ์์ค. put
์ด์์ ์ฌ๊ฐ๊ฐ์๋ ๊ฒฝ์ฐ ๋ถํ ํ๊ณ call
ํจ๊ณผ๋ก ์ฐ๊ฒฐํฉ๋๋ค. ์function* mySaga() {
yield put(action1());
yield put(action2());
}
// split into
function* mySaga() {
yield put(action1());
yield call(myNextSaga);
}
function* myNextSaga() {
yield put(action2());
}
take
ํจ๊ณผ๊ฐ์๋ ์ฌ๊ฐ๋ take
์ ์ฌ๊ฐ์ ์์์ ์ ๋ฐ๋ฅด๋ ๋
ผ๋ฆฌ๋ก ๋ถํ ๋์ด์ผํฉ๋๋ค. ์function* mySaga() {
yield take(ACTION);
// logic
}
// split it into
function* rootSaga() {
yield takeLatest(ACTION, mySaga);
}
function* mySaga() {
// logic
}
call
ํ์ํ ์ฌ๊ฐ๋ฅผ ์ฝ์ต๋๋ค.function* rootSaga() {
// emit all forks and take effects that need to run in the background
yield call(recoverCheckpoint);
}
function* recoverCheckpoint() {
const state = yield select();
if (state.isFetching) {
// run the saga that left the state like this
}
}
์ด๊ฒ์ด ์๋ํ๋ ์ด์ ์ ๋ํ ์ค๋ช ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ค ์ธ ์ผ๋ จ์ ๊ฐ์ ์ ๊ธฐ๋ฐ์ผ๋กํฉ๋๋ค.
take
ํจ๊ณผ๋ ์์ ์ ์ ๋ฌ ๋ ์์
์ด ํ์ํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ํ์ด์ง์ ์ํธ ์์ฉํ๊ฑฐ๋ sagas๊ฐ ์ด๋ฏธ ์คํ ์ค์ผ ๋๊น์ง ์ ํด ์ํ๋ก ์ ์ง๋๊ธฐ ๋๋ฌธ์ ๋ณต๊ตฌ์ค์ธ ๊ฒฝ์ฐ์๋ ํญ์ ์ด๊ธฐํ์ ์ด๋ฌํ sagas๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ์์ ํฉ๋๋ค.put
ํธ์ถ์ ํ์ฉํ์ง ์์ผ๋ฉด ์ํ์ ์์ ์ ๋ณ๊ฒฝ์ด ํ์ฉ๋ฉ๋๋ค. ๋์ผํ ๋ฐฉ์์ผ๋ก ์ฌ๊ฐ๊ฐ ํด๋น ์ฉ๋์ผ๋ก ์ ํ๋๋ ๋จ์ผ ๋ฐฉ์์ผ๋ก ๋ง ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ฌ๊ฐ์ ์ก์
๋์คํจ์น ์ฌ์ด์ ์๊ด ๊ด๊ณ.์ด๋ฐ ์์ผ๋ก ์ฌ๊ฐ๋ฅผ ๋๋๋ ๊ฒ๋ ๊ธ์ ์ ์ธ ํจ๊ณผ๊ฐ ์์ต๋๋ค.
ํ์ง๋ง @slorber :
๋ง์ ์ฌ๋๋ค์ด์ด "๋์ ๊ฒ์"์ํ์ด ๋์ ์ํ ํํ ๋ฐ "๋ค์ ์์ ์กฐ๊ฑด ์"๋ฅผ ํฌํจํ์ฌ SAM์ด ์ ์ฒด์ ์ผ๋ก ์๋ํ๋ ๋ฐฉ์์ ์ง์ ๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์ ์ฝ๋ฉ์ ๋งค์ฐ ํฅ๋ฏธ ๋กญ๋ค๊ณ ์๊ฐํฉ๋๋ค. NAP๋ Sagas์ ํ์์ฑ์ ์ํํ๊ณ ๋จ์ผ ์ํ ํธ๋ฆฌ ์ธ Redux ์์น # 1์ ์๋ฐํ ํ์๊ฐ ์์ต๋๋ค.ํ์ง๋ง ์ ๊ฐ ๋ฌด์์ ์๊ณ ์์ต๋๊น?
๊ฐ๋ Ableton Live๋ฅผ ์ฌ์ฉํ ๋ "Ableton Live GUI๋ฅผ React / Redux ์ฑ์ผ๋ก ์์ฑํ๋ ๊ฒ์ด ๊ฐ๋ฅํ ๊น์?"๋ผ๋ ์๊ฐ์ด ๋ ์ค๋ฆ ๋๋ค. ๋๋ต์ '์๋์ค'๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์์ฉ ๊ฐ๋ฅํ ์ฑ๋ฅ์ ์ป๊ธฐ๊ฐ ๋๋ฌด ์ด๋ ค์ธ ๊ฒ์ ๋๋ค. Qt๋ก ์์ฑ๋ ์ด์ ์ Qt์ ์ ํธ / ์ฌ๋กฏ ์ํคํ ์ฒ๊ฐ์๋ ์ด์ ๊ฐ ์์ต๋๋ค.
Meteor์ ํจ๊ป React / Redux๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ฝ๋ฐฑ์ ๋ํ Redux ์์
์ Mongo.Collection.observeChanges
์ ๋์คํจ์นํ์ฌ Mongo ๋ฌธ์๋ฅผ Immutable.js ์ํ์ ์ ์ฅํฉ๋๋ค. ์ต๊ทผ์ ์์ฒ ๊ฐ์ ๋ฌธ์๋ฅผ ๊ตฌ๋
ํ ๋ Meteor๊ฐ ์ด๊ธฐ ๊ตฌ๋
๊ฒฐ๊ณผ๋ฅผ ํ๋์ฉ ๋ณด๋ด๋ฉด์ ์์ฒ ๊ฐ์ Redux ์์
์ด ๋ฐ์ก๋์ด ์์ฒ ๊ฐ์ Immutable.js ์์
๊ณผ ์์ฒ ๊ฐ์ rerenders๊ฐ ๋น ๋ฅด๊ฒ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ UI๊ฐ ์์์ ๋งค์ฐ ๋๋ฆฌ๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๊ฐ๋ฅํ ํ. ํ์คํ์ง๋ ์์ง๋ง RethinkDB๋ ์ด๋ฐ ์์ผ๋ก ์๋ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๋ด ์๋ฃจ์ ์ ์ด๋ฌํ ์์ง ์์ ์ ์ ์ณ๋๊ณ ์กฐ์ ๋ ์๋๋ก ์ผ๊ด ์ฒ๋ฆฌํ์ฌ ๋จ์ผ ์ํ ๋ณ๊ฒฝ์ผ๋ก ~ 800 ๊ฐ์ ๋ฌธ์๋ฅผ ์ถ๊ฐ ํ ์์๋ ํน์ ๋ฏธ๋ค์จ์ด๋ฅผ ๋ง๋๋ ๊ฒ์ด ์์ต๋๋ค. ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ง ์ด๋ฒคํธ ์์๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์ผ๊ด์ฑ์๋ ์ํ๋ก ์ด์ด์ง ์ ์์ผ๋ฏ๋ก ๋ณธ์ง์ ์ผ๋ก ์ํํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ชจ๋ ๋ฌธ์๊ฐ Redux ์ํ์ ์ถ๊ฐ๋๊ธฐ ์ ์ ๊ตฌ๋ ์ด ์ค๋น๋ก ํ์๋์ง ์๋๋ก ๊ตฌ๋ ์ํ ์์ ์ด ๋์ผํ ์ค๋กํ ๋ฌ๋ฅผ ํตํด ์ ๋ฌ๋์๋์ง ํ์ธํด์ผํ์ต๋๋ค.
@ jedwards1211 ๋น์ทํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค (์ด๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์ฑํ๋ ๋ง์ ์์ ๋ฉ์์ง).
์ผ๊ด ์ ๋ฐ์ดํธ๋ฅผ ์ํํ์ฌ ๋์ผํ ๋ฐฉ์์ผ๋ก ํด๊ฒฐ๋์์ต๋๋ค. ๋ฏธ๋ค์จ์ด ๋์ (์์) ์ฌ์ฉ์ ์ง์ ๋๊ธฐ์ด ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ต๋๋ค (๋ฐฐ์ด์ ๋ชจ๋ ์ ๋ฐ์ดํธ๋ฅผ ํธ์ํ๊ณ ์ ๋ฐ์ดํธ ํ ํญ๋ชฉ์ด ์์ผ๋ฉด ์ ๊ธฐ์ ์ผ๋ก ๋ชจ๋ ์ ๋ฐ์ดํธ๋ฅผ ๋์์ ์ ๋ฐ์ดํธํฉ๋๋ค.
@andreieftimie ์, ํ๋กฏ ๋๊ธฐ ๋ฐ ํ๋ / ์ถ์์ ๊ฐ์ด ์ฆ๊ฐ์ ์ธ ์ ๋ฐ์ดํธ๊ฐ ํ์ํ UI ์ํธ ์์ฉ์ด ์๊ธฐ ๋๋ฌธ์ ๋ด ์ฑ์์ ๋ ๊น๋ค ๋กญ์ต๋๋ค. ๋ฐ๋ผ์ ์ก์ ์ ์ฆ์ ๋ฐ์กํ ์ง ์๋๋ฉด ์ผ๊ด ๋ฐ์ก์ ์ํด ๋๊ธฐ์ด์ ๋ฃ์์ง ๊ฒฐ์ ํ๋ ๋ฏธ๋ค์จ์ด ๊ณ์ธต์ด ์์ด์ผํฉ๋๋ค.
๊ทธ๋งํ ๊ฐ์น๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ "๊ฐ์ง"๋ฅผ ๋ง๋๋ ์์ด๋์ด๊ฐ ์์๋ค. ๊ทธ๊ฒ์ ๋จ์ผ ์์ ์์น์ ์์ ํ ๋ฌด์ํ์ง๋ง ์ข์ ํํ์ฒ๋ผ ๋ณด์์ต๋๋ค.
@ jedwards1211 ์ฑ์ด ๋ณต์ก ํด์ง์ ๋ฐ๋ผ ๊ฒฐ๊ตญ ํน์ ์ ํ์ ๋ฐ์ดํฐ์ ํน์ ์ ํ์ ์ ๋ฐ์ดํธ๋ฅผ ๋ถ๋ฆฌํ์ฌ ํน์ ์ ์ฅ์๊ฐ ์ ์ฒด ๋ถํ๋ฅผ ์ฒ๋ฆฌํ์ง ๋ชปํ๋๋กํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฐฑ์๋์ ๋๊ธฐํํ๋ ค๋ ํต์ฌ ์ํ๊ฐ ์๊ณ , ํ์ฌ ์ํ์ค์ธ ์์ ์ ๋ฐ๋ผ ์ฑ UI ๊ตฌ์ฑ ์์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ํ์๋๋๋ก ์ผ๋ถ ์ ๋๋ฉ์ด์ ์ํ๊ฐ ์์ผ๋ฉฐ, ์ถ์ ์ค์ธ ๋๋ฒ๊ทธ ๋ฐ์ดํฐ๊ฐ์์ ์ ์์ต๋๋ค. ๊ฐ๋ผ์ ธ.
์ด ์ธ์์ ์ธ ์์ ์์๋ ํ์คํ ๋จ์ผ Redux ์คํ ์ด์์์ด ๋ชจ๋ ๊ฒ์ ๊ตฌ์ถ ํ ์ ์์ง๋ง ์ด๋ป๊ฒ ์ค๊ณ ํ๋๋์ ๋ฐ๋ผ ์ํ ํธ๋ฆฌ์ ๋ค์ํ ๋ถ๊ธฐ์ ๋ํ ์ฐ๋ ค ์ฌ์ด์ ๋ชจํธํ ๊ฒฝ๊ณ๊ฐ์์ ์ ์์ผ๋ฉฐ ๋ช ํ์ฑ์ด ๋ถ์กฑํ ์ ์์ต๋๋ค. ์ฃผ์ด์ง ํ๋์ด ์ด๋ค ์ํ์ ์ํธ ์์ฉํ ๊ฒ์ธ์ง์ ๊ดํ ๊ฒ์ ๋๋ค.
์ํ์ ๋ฒ์๋ฅผ ์ง์ ํ๋ ค๋ ๋ฐฉ๋ฒ๊ณผ ๊ทธ์์ ๊ธฐ๋ํ๋ ์ฑ๋ฅ ํน์ฑ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ํ ๊ด๋ฆฌ ์ ๋ต์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ฒฝํ๊ฒ ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. Redux๋ ์์ ์ ๋กค๋ฐฑ ๋๋ ์ฌ์ํ๊ฑฐ๋ ์ง๋ ฌํํ๊ณ ๋์ค์ ๋ค์ ๋์๊ฐ ์์๋ ์ํ์ ์ ํฉํฉ๋๋ค. ์ ๋๋ฉ์ด์ ์ํ์ ๊ฒฝ์ฐ ์ํ๋ ๊ฒฝ์ฐ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ ์ฅ์ ๋๋ ๋ฐ์ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ฒํ๋ฉด ์ค๋ฒ ํค๋๊ฐ ์ค์ด๋ค๊ณ ์ด ์ผ์์ (๊ทธ๋ฌ๋ ์ฌ์ ํ ํ์ํ) ์ํธ ์์ฉ ์ํ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ์ค์ผ์ํค์ง ์์ ๊ฒ์ ๋๋ค.
์ ๋ง ๋นจ๋ฆฌ, ๊ณง ์ถ์ ๋ React ํ์ด๋ฒ ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ ๋ง๋ค๊ณ ์ถ์ต๋๋ค. ์ฌ๊ธฐ์ ๋งํฌ ๊ฐ ์์ต๋๋ค. ์ ์ดํด๊ฐ ์ฝ๊ฐ ์ค๋๋ ๊ฒฝ์ฐ ์ฌ๊ณผ๋๋ฆฝ๋๋ค. ๋๋ต ํ์ด๋ฒ ์ํคํ ์ฒ๋ React ๊ตฌ์ฑ ์์ ํธ๋ฆฌ๋ฅผ ํตํด ์ ํ๋๋ ๋ค์ํ ์ข ๋ฅ์ ์ ๋ฐ์ดํธ๊ฐ ์์ผ๋ฉฐ ์ด๋ฌํ ์ ๋ฐ์ดํธ๊ฐ ์ํ๋๋์๊ธฐ์ ๋ฐฉ๋ฒ์ ๋ํ ๋ค๋ฅธ ๊ธฐ๋๊ฐ ์์์ ์ธ์ํฉ๋๋ค. ์ ๋๋ฉ์ด์ ์ ๋ฐ์ดํธ๊ฐ ๋น ๋ฅด๊ณ ๋ฐ์์ด ๋น ๋ฅด๊ณ ์์ ์ ์ด๊ธฐ๋ฅผ ์ํ๊ณ , ํฐ ์ํธ ์์ฉ ์ ๋ฐ์ดํธ๋ก ์ธํด ์ ๋๋ฉ์ด์ ์ ๋ฒ๋ฒ ๊ฑฐ๋ฆผ์ด ๋ฐ์ํ๋ ๊ฒ์ ์ํ์ง ์์ต๋๋ค.
๋ฐ๋ผ์ ํ์ด๋ฒ ์ํคํ ์ฒ๋ ์ ๋ฐ์ดํธ๋ฅผ ์์ ํจํท์ผ๋ก ๋๋๊ณ ์ํ์ค์ธ ์์ ์ ๋ฐ๋ผ ์ฐ์ ์์์ ๋ฐ๋ผ ์ ๋ฐ์ดํธ๋ฅผ ์์ฝํฉ๋๋ค. ์ ๋๋ฉ์ด์ ์ ์ค๋จ๋์ง ์๋๋ก ์ฐ์ ์์๊ฐ ๋์ผ๋ฉฐ ๋๋ฆฐ ๊ธฐ๊ณ์ ์ ๋ฐ์ดํธ๋ ์ฐ์ ์์๊ฐ ๋ฎ์ต๋๋ค.
React ํ์ด๋ฒ์ ๋ํ ๋ง์ ์ธ๋ถ ์ ๋ณด๋ฅผ ๊ฑด๋ ๋ฐ๊ณ ํ๋ก์ธ์ค์์ ๋ช ๊ฐ์ง ์๋ชป๋ ์ ์ ๋ฐ๊ฒฌํ์ง๋ง ์ ์์ ์ ์ด๊ฒ์ด ๋ค์ํ ์ ํ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ ์ ์ฅ์์ ํ์ํ๋ค๊ณ ์๊ฐํ๋ ์ธ๋ถํ ๋ ์ ๊ทผ ๋ฐฉ์์ด๋ผ๋ ๊ฒ์ ๋๋ค.
์ค๋ ๋ณต์กํ ์ฑ์ ๊ตฌ์ถํ๊ณ ์๋ค๋ฉด ๋ช ๊ฐ์ ๋ค๋ฅธ ์คํ ์ด์์ ์ง์ํ๋ Redux์ ๊ฐ์ ์ต์์ ์คํ ์ด ํด๋์ค๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค. ๋์ถฉ:
์ด ์ด์ผ๊ธฐ๋ Redux๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ์์ ํ ์ํ ์๋ฃจ์ ์ ๋งค์ฐ ๊ฐ๊น์ต๋๋ค. Redux๋ ์ผ๋ จ์ ์์ ํ์ ๋ณด๋ ค๋ ๋ฐ์ดํฐ์ ์ ํฉํ๋ฉฐ ์ ์คํ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๋ค๋ฅธ ์ํ๋ ๋ง์ด ์์ต๋๋ค.
@jsonnull ์ ๋ ์์ ์ ์ ๋๋ฉ์ด์ ์ํ๋ฅผ ์ ์ฅํ ํ์๊ฐ ์์์ต๋๋ค. ๋ก์ปฌ ์ํ๋ ํญ์ ์ ๋๋ฉ์ด์ ์ฌ์ฉ ์ฌ๋ก์ ์ด์์ ์ด์์ต๋๋ค. ๋ก์ปฌ ์ ๋๋ฉ์ด์ ์ํ๊ฐ ์์ ํ ์ ํฉํ์ง ์์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์๋์ง ๊ถ๊ธํฉ๋๋ค. ๊ทธ๋๋ ์๋ก์ด ์ํคํ ์ฒ์ ๋ํ ํ๋ฅญํ ์์ด๋์ด๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
@ jedwards1211 ๋ก์ปฌ ์ ๋๋ฉ์ด์ ์ํ๊ฐ ์๋ํ์ง ์๋ ๋ช ๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ๋๋ ๋น์ ์๊ฒ ํ๋ฝ ํ ๊ฒ์ ๋๋ค. ๊ทธ๋ค์ ๋น์ ์ด ๋ชจ๋ ์์ฉ ํ๋ก๊ทธ๋จ์์ ๋ง์ฃผ ์น๋ ๊ฒฝ์ฐ๋ ์๋์ง๋ง ์ถฉ๋ถํ ์์ฃผ ๋ฑ์ฅํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํ ๊ฒฝ์ฐ์๋ ๋ก์ปฌ ์ํ๊ฐ์๋ Redux ์ด์ธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. (์ข์, ์, ์ ๊ฐ ์ฌ๊ธฐ์ ์ฝ๊ฐ ์์์๋ฅผ ์ฐ๊ณ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.) ๋งค์ฐ ๊ฐ๊ฒฐํ ํ์ดํผ ์คํฌ๋ฆฝํธ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ๊ฐ์ ๋, ์์ ๊ธฐ๋ฅ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ก์ปฌ ์ํ ๋์ ์ผ๋ถ ์ ๋๋ฉ์ด์ ์ ์ ๋ฌํด์ผํฉ๋๋ค. ๋ฃจํธ ๋ ธ๋ ๋๋ ๋ค์ ๋ ๋๋งํ๋ ๋ ธ๋์ ์ํ๋ฅผ ์ง์ ํฉ๋๋ค.
์ด ๊ฒฝ์ฐ ๋ช ๊ฐ์ง ์ ๋๋ฉ์ด์ ์ธ๋ถ ์ ๋ณด๊ฐ ์ค์ ๋ ์ํ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ก์ปฌ ์ํ ๋ถ์กฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ผ๋ฏ๋ก ์ ๋๋ฉ์ด์ ์ ํธ๋ฆฌ๊ฑฐํ๊ณ ์ ๋๋ฉ์ด์ ์ ์ผ์ ๊ธฐ๊ฐ ๋์ ์คํํ๋ ๋ฑ์ ์์ ์ ์ํ ํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ์ค์ํ ์ ์ ์ด๋ฌํ ์ ๋๋ฉ์ด์ ์ ์ํํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ ๋๋ง์ ์ผ๋ถ๋ก ์ํํ๊ณ "์ํ ํจ์๋ก์์ UI"๋ฉํํฌ๋ฅผ ๊ทธ๋๋ก ์ ์งํ๊ฑฐ๋ DOM์ ๊ฐ๋ณ์ ์ผ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋๋ค. ๊ฑฐ์ ํญ์ ๋ ๋์ ๋๋ต์ ๋ณ๊ฒฝํ๋ ๋์ ๋ค์ ๋ ๋๋งํ๋ ๊ฒ์ ๋๋ค.
์ด์ ์ผ๋ถ ์ ๋๋ฉ์ด์ ์ํ๋ฅผ ๋ก์ปฌ๋ก ์ ์งํ ์์๋ ๊ธฐ๋ฅ์ด์๋ ์๋ฅผ ์ดํด ๋ณด๊ฒ ์ต๋๋ค. ๊ทธ ์์ React ๊ธฐ๋ฐ UI๊ฐ์๋ ๋ธ๋ผ์ฐ์ ๊ฒ์์ ๋น๋ํฉ๋๋ค.
์ : ์คํ๋ผ์ดํธ ์บ๋ฆญํฐ๋ 10 ๊ฐ์ ํ๋ ์์ผ๋ก ๊ตฌ์ฑ๋ ์ ๋๋ฉ์ด์ ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ 400ms ์ด์ ์ ๋๋ฉ์ด์ ์ ์ฌ์ํ๋ ค๊ณ ํ๋ฏ๋ก 2 ํฑ ์ ๋๋ง๋ค ๊ทธ๋ ค์ง๋ ์คํ๋ผ์ดํธ๋ฅผ ๋ณ๊ฒฝํด์ผํฉ๋๋ค.
๋ ๋์ ํด์๋๋ฅผ ์ํ๋ค๋ฉด ํฑ์ด ํ์ ์คํฌํ๊ฐ ๋ ์๋ ์์ต๋๋ค.
์ด ๊ฒ์ ์์ ์์๋ tick
์ก์
์ ์ผ๋ถ๋ก ํฑ์ ์ฆ๊ฐ์ํค๋ ๊ฒ์ ์ํ์ง ์์ต๋๋ค. ๋์ ๊ด์ฐฐ ๊ฐ๋ฅํ ๊ตฌ์กฐ์์ ํฑ์ ๊ฐ๋ณ์ ์ผ๋ก ์ฆ๊ฐ ์ํค๋ ค๊ณ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํค๋ณด๋ ์บ๋ฆญํฐ ์ด๋์ด๋ ๊ณต๊ฒฉ๊ณผ ๊ฐ์ Redux ์ก์
์ ๋์คํจ์นํ๋ฉด ํ์ฌ ํฑ ๋๋ ํ์ฌ ์๊ฐ์ ๊ทธ๋ค์๊ฒ ์ ๋ฌํ์ฌ ์ด๋ค ํฑ์์ ์ก์
์ด ๋ฐ์ํ๋์ง ๊ธฐ๋ก ํ ์ ์๊ณ UI ๊ตฌ์ฑ ์์๋ ์ ๋๋ฉ์ด์
์ด ์์๋ ์๊ฐ์ ๋ก์ปฌ๋ก ๊ธฐ๋ก ํ ์ ์์ต๋๋ค. .
์ด์ ์ ์ญ ์ ๋๋ฉ์ด์ ์ํ๋ฅผ ์ํธ ์์ฉ ์ํ์์ ๋ถ๋ฆฌํ์ต๋๋ค. Redux ์ํ ๋ง ์ฌ์ฉํ๊ฑฐ๋ ์์ ์ ์ฌ์ํ์ฌ "์ฌ์"์ ์ํํ๋ ค๋ ๊ฒฝ์ฐ ์ํ์ ์ผ๋ถ๋ก ํฑ์ ์ฆ๊ฐ์ํค๋ ๋ฐ ๋ถ๋ด์์ฃผ์ง ์์ต๋๋ค. ๋๋ฌด.
์ผ๋ฐ์ ์ผ๋ก Redux๋ฅผ ํตํด ์์ / ์ค์ง ์๊ฐ์ ์ ๋ฌํ๊ณ ๊ตฌ์ฑ ์์๊ฐ ๋๋จธ์ง ์ํ๋ฅผ ๋ก์ปฌ๋ก ์ ์งํ๋๋กํ์ฌ ์ ๋๋ฉ์ด์ ์ ์กฐ์ ํ๋ ๊ฒ์ด ํจ์ฌ ์ข์ต๋๋ค.
์ด๊ฒ์ ๊ฒ์์๋ง ์ ์ฉ๋๋ ๊ฒ์ด ์๋๋๋ค. React๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ดํธ์์ ์ผ๋ จ์ ์ฅ๊ธฐ ์คํ ์ ๋๋ฉ์ด์ ์ ์ํํ๋ ค๋ ๊ฒฝ์ฐ์ ๊ฐ์ด ํ์ฅ ๋ ์ ๋๋ฉ์ด์ ์ํ์ค๊ฐ์ด๋ฅผ ํต๊ณผ ํ ์ ์์ต๋๋ค.
@jsonnull ๋ฉ์ง๋ค์ , ์ข์ ์์ ๋๋ค. ๊ณต์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์ ๋ ๊ฐ๋จํ ๋งํ๊ณ ์ถ์ต๋๋ค-Redux์์๋ ์๋ก์ ๋ํ ๋งํฌ๊ฐ์๋ ์ํ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด-์ฌ์ฉ์๋ ๋ง์ ๊ฒ์๋ฌผ์ ๊ฐ์ง ์ ์๊ณ ๊ฒ์๋ฌผ์ ๋ง์ ๋๊ธ์ ๊ฐ์ง ์ ์์ผ๋ฉฐ ์ด๋ฌํ ๊ฐ์ฒด๋ฅผ ๋ฐฉ์์ผ๋ก ์ ์ฅํ๊ณ ์ถ์ต๋๋ค.
var user = {id: 'user1', posts: [], comments: []}
var post = {id: 'post1', user: user, comments: []}
user.posts.push(post);
var comment = {id: 'comment1', post: post, user: user}
post.coments.push(comment)
user.comments.push(comment)
appState.user = user
Redux๋ ์ํ ์ฐธ์กฐ๊ฐ์๋ ๊ฐ์ฒด ๊ณ์ธต์ ์ฌ์ฉ์ ํ์ฉํ์ง ์์ต๋๋ค. Mobx (๋๋ Cellx)์์๋ ๋จ์ํ ๊ฐ์ฒด์ ํจ๊ป ์ผ๋ ๋ค ๋ฐ ๋ค ๋๋ค ์ฐธ์กฐ๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ ๋น์ฆ๋์ค ๋ก์ง์ ์ฌ๋ฌ ๋ฒ ๋จ์ํํ์ต๋๋ค.
@bgnorlov ๋๋ ์๋ฌด๊ฒ๋ ์๊ฐํ์ง ์๋๋ค redux
๋น์ ์ ๋ํด ์๊ธฐ์ฒ๋ผ ํจํค์ง๋ฅผ ์ํ ์ฐธ์กฐ๋ฅผ ๊ธ์งํฉ๋๋ค - ๊ทธ๋ค์ ๋จ์ง ๋ ์ด๋ ค์ ๋ณต์ ํ ์ ์๋๋ก state
๋น์ ์ ๊ฐ์๊ธฐ์ ์์ต๋๋ค. ๋ํ ํ์คํ์ง๋ ์์ง๋ง Immutable.js๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฅผ ๋ํ๋ด๋ ๊ฒฝ์ฐ ์ํ ์ฐธ์กฐ๋ก ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ๋ ์ฌ์ธ ์ ์์ต๋๋ค.
์ธ๋ ํค๋ฅผ ์ฌ์ฉํ์ฌ redux ์ํ์ ๊ด๊ณ๋ฅผ ๋ชจ๋ธ๋ง ํ ์๋ ์์ง๋ง ORM๊ณผ ์ ์ฌํ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ง ํผ ํธ๋ฆฌํ์ง ์๋ค๋ ๊ฒ์ ์ดํดํฉ๋๋ค.
var user = {id: 'user1', postIds: [], commentIds: []}
var post = {id: 'post1', userId: user.id, commentIds: []}
user.postIds.push(post.id);
var comment = {id: 'comment1', postId: post.id, userId: user.id}
post.commentIds.push(comment.id)
user.commentIds.push(comment.id)
appState.userId = user.id
appState.posts = {[post.id]: post}
appState.comments = {[comment.id]: comment}
// then join things like so:
var postsWithComments = _.map(appState.posts, post => ({
...post,
comments: post.commentIds.map(id => appState.comments[id]),
})
@ jedwards1211 ์ ์ฌ์ฉํ์ฌ redux์์ ์ํ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฅผ ๋ณต์ ํ๋ ค๋ฉด ๊ฐ์๊ธฐ๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ์ํฅ์๋ฐ์ ๊ฐ์ฒด์ ๋ชจ๋ ์ ๋ณต์ฌ๋ณธ์ ๋ฐํํด์ผํฉ๋๋ค. ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๊ด๋ จ ๊ฐ์ฒด๋ ์ ๋ณต์ฌ๋ณธ์ด์ด์ผํ๋ฉฐ ์ด๋ ๋ฐ๋ณต์ ์ธ ๋ฐฉ์์ผ๋ก ๋ฐ๋ณต๋๋ฉฐ ๋ชจ๋ ๋ณ๊ฒฝ์ ๋ํด ์์ ํ ์๋ก์ด ์ํ๋ฅผ ์์ฑํฉ๋๋ค. Immutable.js๋ ์ํ ์ฐธ์กฐ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค.
์ผ๋ถ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ํ์๋ก ํ ๋ ์ ๊ทํ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ ์ญ ์ํ์์ ID๋ก ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ฌ ๋๋ง๋ค ํ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด-์ด๋ฒคํธ ํธ๋ค๋ฌ ์ด๋๊ฐ์์ ์์
ํ์ ๋ฅผ ํํฐ๋งํด์ผํฉ๋๋ค (์์
์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์ ์์). redux๋ฅผ ์ฌ์ฉํ๋ฉด ์ฑ ์ํ์ ์ก์ธ์คํ๊ธฐ ์ํด ์ฝํฌ๋ฅผ ๋ฐ์กํด์ผํฉ๋๋ค.
var prevTask = dispatch((_, getState)=>getState().tables.tasks[task.parentId]).children.map(childId=>dispatch((_, getState)=>getState().tables.tasks[childId])).filter(task=>...) [0]
๋๋ ์ ํ์์ ํจ๊ป
var prevTask = dispatch(getTaskById(task.parentId)).children.map(childId=>dispatch(getTaskById(childId)).filter(task=>...)[0]
์ด ์์ฉ๊ตฌ๋ ์ฝ๋๋ฅผ mobx ๋ฒ์ ๊ณผ ๋น๊ตํ์ฌ ์๋ง์ผ๋ก ๋ง๋ญ๋๋ค.
var prevTask = task.parent.children.filter(task=>...)[0]
@ jedwards1211 , @bgnorlov : FWIW, ์ด๊ฒ์ด ์ ๊ฐ Redux-ORM์ ์ข์ํ๋ ์ด์ ์ค ํ๋์ ๋๋ค. ์ด๋ฅผ ํตํด Redux ์คํ ์ด๋ฅผ ์ ๊ทํ ํ ์ ์์ง๋ง ๊ด๊ณํ ์ ๋ฐ์ดํธ ๋ฐ ์กฐํ๋ฅผ ๋ ๊ฐ๋จํ๊ฒ ์ํ ํ ์ ์์ต๋๋ค. ์ค์ ๋ก ๋ง์ง๋ง ์์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก Redux-ORM๊ณผ ๋์ผํฉ๋๋ค.
๋ฐฉ๊ธ Redux-ORM ๊ธฐ๋ณธ ์ฌํญ ๊ณผ ํต์ฌ ๊ฐ๋ ๋ฐ ๊ณ ๊ธ ์ฌ์ฉ๋ฒ์ ์ค๋ช ํ๋ ๋ช ๊ฐ์ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์์ฑํ์ต๋๋ค.
@markerikson ๋ฉ์ง๋ค, ํ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
@gaearon
ํ ๊ฐ์ง ์ฃผ๋ชฉํ ์ ์ Redux๊ฐ ๋ชจ๋ ์ํ์ ์ฌ์ฉ๋๋๋ก ์๋ํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์ฑ์ ์ค์ํด ๋ณด์ด๋ ๋ชจ๋ ๊ฒ. ์ ๋ ฅ๊ณผ ์ ๋๋ฉ์ด์ ์ํ๋ React (๋๋ ๋ค๋ฅธ ์์ ์ํ ์ถ์ํ)์์ ์ฒ๋ฆฌํด์ผํ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. Redux๋ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ ๋ฐ ๋ก์ปฌ์์ ์์ ๋ ๋ชจ๋ธ๊ณผ ๊ฐ์ ์์ ์ ๋ ์ ํฉํฉ๋๋ค.
์ด ์๊ฒฌ์ด ๋งค์ฐ ์ ์ฉํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ๋ด๊ฐ ํํฐ์ ๋ฆ์๋ค๋ ๊ฑด ์์ง๋ง ๊ทธ๊ฒ ๋ด ์์ ์ ์ผ๋ถ์ผ์ง๋ ๋ชฐ๋ผ ๊ทธ ๋๊ธ์ด ๊ฒ์ ๋ ์ง 1 ๋ ์ด ๋์๊ณ ์ด ์์ด๋์ด๊ฐ ํํ ๋ ์ ์ผํ ๊ณณ์ ์ด๊ณณ๋ฟ์ ๋๋ค.
๊ฐ๋๊ฐ ์๊ณ ํ์คํ๊ฒ ๋น ํ๋ญ์ค / ๋ฆฌ๋์ค ๋ฐฐ๊ฒฝ์์ ๋์จ ์์ด๋์ด๋ฅผ ์ค์ค๋ก ๊ณต์ํํ๋ ๊ฒ์ ๋งค์ฐ ์ด๋ ต์ต๋๋ค. ํนํ ๋ง์ ์์ ๊ฐ ์ฌ์ ํ ํ ์คํธ ์์์ ๋ชจ๋ ํค์ ์ ๋ํ ์์ ์ ์์ฑ ํ ๋. ๋๊ตฐ๊ฐ๊ฐ ๋ชจ๋ Redux ๋ฌธ์ ํ์ด์ง์ ์๋จ์ 50px ํ ์คํธ๋ก ๊ทธ ์ธ์ฉ๋ฌธ์ ๋ฃ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@leff ๋์ํฉ๋๋ค. ๋๋ ๊ทธ ์ ํํ ์์ด๋์ด๋ฅผ ์ผ๋ง ์ ์ ํฉ์ฑํ์ง๋ง ์ถฉ๋ถํ ์ธ๊ธ๋์ง ์์์ต๋๋ค. ๊ธฐ๋ก ๊ด๋ฆฌ์ Redux๋ฅผ ์ฌ์ฉํ๋๋ผ๋ Redux ์คํ์ผ์ ์ํ ๊ด๋ฆฌ์ ๋ถ๋ด์์ฃผ์ง ์์๋๋๋ ๋ง์ ์์ ์ํ๊ฐ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
์์ ํ ๊ธฐํ๋ฅผ ๊ฐ์ก๋ ์ฌ๋๋ค, ์๋ฅผ ๋ค์ด ํ๋ถํ ์คํ ์ทจ์ / ๋ค์ ์คํ์ ์ํํ๋ ์ฑ์ํ ๋ฐ์คํฌํ ์ฑ์๊ฒ ๋ฐ๋์ ๋๋ผ์ด ์ผ์ ์๋๋๋ค. ๊ทธ๋ฌ๋ Redux๋ฅผ ํตํด ์ด๋ฌํ ์์ด๋์ด๋ฅผ ์ป๋ ์๋ก์ด ์ด๋ฏผ์๋ค์ ๋ฐ๋ค์๋ ๊ณ์๊ฐ ๋ ๊ฒ์ ๋๋ค.
@bgnorlov ๋ Immutable.js๋ก ์ํ ์ฐธ์กฐ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ์ข์ ์ ์ ๋๋ค. ๊ทธ๋๋ ์ข์ ๊ธฐ๋ฅ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์์ฆ์๋ ์ปจํ
์คํธ ์ธ๋ถ์์ ์ฌ์ฉํ์ง ์๋ ์ผ์์ ์ธ ๋ทฐ ํน์ ์ํ (์ : redux-form
์ธ์คํด์ค์ ์ํ) ์ธ ๊ฒฝ์ฐ์๋ ๊ฑฐ์ ๋ชจ๋ ๊ฒ์ Redux์ ์ ์ฅํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ฌธ์ ์์ด ์ด๋ฌํ ์ํ๋ฅผ redux์์ ์ฎ๊ธธ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฅ์ ์ ๋ฏธ๋์ ๋์ํ๊ธฐ ์ํด ์ธ๋ถ ๊ตฌ์ฑ ์์๊ฐ ํ์ํ ๊ฒฝ์ฐ์ ๋๋นํ๋ค๋ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด, ์์์ ์ค๋ฅ๊ฐ ์๊ฑฐ๋ ์ ์ถ ์ค์ผ ๋ ๋ณ๊ฒฝ๋๋ ํ์ ๋ชจ์์ ์์ด์ฝ์ด์์ ์ ์์ต๋๋ค.
๋ช ์ฌํด์ผ ํ ๊ฐ์ฅ ์ค์ํ ์ ์ ๋ชจ๋ ์ ๊ทํ ๋ ์ํ๋ฅผ Redux์ ๋ฃ๋ ๊ฒ (์ฆ ๋ทฐ๋ฅผ ๋ ๋๋งํ๊ธฐ ์ํด ํจ๊ป ๊ฒฐํฉํด์ผํ๋ ๋ชจ๋ ๊ฒ)์ด ์ฌ์ฉํ๊ธฐ ๊ฐ์ฅ ์ฝ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ค ๊ฒ๊ณผ๋ ๊ฒฐํฉ ํ ํ์๊ฐ์๋ ์ํ๋ ์๋ง๋ ๋น์ ์๊ฒ ์ด๋ ค์์์ฃผ์ง ์๊ณ Redux ์ธ๋ถ์์ ์ด ์ ์์ง๋ง, ๋ณดํต Redux์ ๋ฃ๋ ๊ฒ๋ ์ํ์ง ์์ต๋๋ค.
FWIW, ๋ฌธ์๋ http://redux.js.org/docs/faq/OrganizingState.html#organizing -state-only-redux-state์ ๋ฐ๋ผ ๋ชจ๋ ๊ฒ์ด Redux๋ก ์ด๋ํด์ผํ๋ ๊ฒ์ ์๋๋ผ๊ณ ์ง์ ํฉ๋๋ค.
Redux๊ฐ "์ ์ ํ"๊ฒ์ ๋ํด ์ต๊ทผ ์จ๋ผ์ธ์์ ๊ฝค ๋ง์ ๋ํ๊ฐ์์์ต๋๋ค. ์ด๋ค ์ฌ๋๋ค์ ๋ง ๊ทธ๋๋ก ๋ชจ๋ ๊ฒ์ Redux์ ๋ฃ๋ ๊ฒ์ ์ด์ ์๋ณด๊ณ , ๋ค๋ฅธ ์ฌ๋๋ค์ ๋๋ฌด ๋ฒ๊ฑฐ๋กญ๊ณ ์๋ฒ์์ ๊ฒ์๋ ๋ฐ์ดํฐ ๋ง ์ ์ฅํ๊ณ ์ถ์ดํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ ์ฌ๊ธฐ์๋ ๊ณ ์ ๋ ๊ท์น์ด ์์ต๋๋ค.
ํญ์ ๊ทธ๋ ๋ฏ์ด ์ฌ๋๋ค์ด ๋ฌธ์ ๊ฐ์ ์ ๋ํ ์์ด๋์ด๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด PR์ ์ ์ ์ผ๋ก ํ์ํฉ๋๋ค. :)
๋ฆฌ๋์๋ฅผ ์ฌ์ฌ์ฉํด์ผํ๊ณ redux ์ํ์์ "ํ์ ์ํ"๋ฅผ ํ ๋น ํ ์ ์์ด์ผํ๋ค๋ฉด ์ฝ๊ฒ ํ ์์๋ ํ๋ฌ๊ทธ์ธ์ ๊ฐ๋ฐํ์ต๋๋ค (React ํตํฉ ํฌํจ).
@eloytoro IMO ์ํ์์ ํ๋ ์ฝ๋ฉ ๋ ์์ ์ ํ์ด๋ ์์น๊ฐ์๋ ์ผ๋ถ ํ์ฌ ๊ฐ์๊ธฐ์ ๋ฌธ์ ๊ฐ์๋ ๊ฒฝ์ฐ ํ๋ก์ ํธ์์ ๋ฌธ์ ๋ฅผ ์ด์ด์ผํฉ๋๋ค. ํฌ๋ฆฌ์์ดํฐ ํจํด.
@eloytoro ๊ทธ๋ฐ ์์ผ๋ก ์ฐ๋ ค๊ณ ํ์ด์. ์ฐธ๊ณ ํด์ฃผ์ ์ ๋๋จํ ๊ฐ์ฌํฉ๋๋ค!
@ jedwards1211 ๋๋ ๋น์ ์ด ์๋ชป๋ ์๊ฐ์ ๊ฐ์ง๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ 3 ์ ๋ฆฌ๋์ ๋ ๊ทธ ๋ฌธ์ ์ ๋ํด ์ธ๊ธ ํ ์ ์ ์์ง๋ง, ๋ด ์ค ๋ํซ์ด ๋ฆฌ๋์๋ฅผ ๋์ ํฌ๊ธฐ์ ์ปฌ๋ ์ ์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ ์ ์๋์ง ๋ณด์ฌ ์ฃผ๋ ค๊ณ ํฉ๋๋ค.
@avesus ๊ฐ ๋น์ ์ ์ํด ์ผํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@eloytoro ์, ๋ ์๋ฏธ๊ฐ ์์ต๋๋ค.
์๋ ์ ์ ๋ Redux๋ฅผ ์ฌ์ฉํ์ฌ ์๋นํ ๋ณต์กํ ๊ฒ์์ ๋ง๋ค์์ต๋๋ค. ๋ํ Redux๋ฅผ ์ฌ์ฉํ์ง ์๋ ๋ค๋ฅธ ํ๋ก์ ํธ์ ์ฐธ์ฌํ์ต๋๋ค. ๋์ ๋ชจ๋ ๊ฒ์ UI ์ ์ฅ์์ ์๋ฒ ์ ์ฅ์ (์ ๋ ฅ ํฌํจ)๋ก ๋ถ๋ฆฌํ๋ ์ฌ์ฉ์ ์ ์ ๊ตฌ์ถ ๋ ์ต์ํ์ ํ๋ ์ ์ํฌ์ ์ฐธ์ฌํ์ต๋๋ค. ๋๋ฌด ๋ง์ ์ธ๋ถ ์ฌํญ์ ๋ค๋ฃจ์ง ์๊ณ ์ง๊ธ๊น์ง ๋ด ๊ฒฐ๋ก ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋จ์ผ ์ํ๊ฐ ํญ์ ๋ ์ข์ง๋ง ๊ณผ๋ํ๊ฒํ์ง ๋ง์ญ์์ค. ๋ชจ๋ keyDown ()์ ์ ์ฅ์๋ฅผ ํตํด ๋ค์๋ณด๊ธฐ๋ก ๊ฐ์ ธ ์ค๋ ๊ฒ์ ํผ๋์ค๋ฝ๊ณ ๋ถํ์ํฉ๋๋ค. ๋ฐ๋ผ์ ์ผ์์ ์ธ ์ํ๋ ๋ก์ปฌ ๊ตฌ์ฑ ์์ ์ํ (์ : React 's)์ ์ํด ์ฒ๋ฆฌ๋์ด์ผํฉ๋๋ค.
๋๋ redux์ ๋ฐ์์ด ๊ด์ฐฐ ๊ฐ๋ฅํ ์น์ ๋ถ์ ๋ถ ์๊ธฐ ๋๋ฌธ์ ํ์ด์ง์์ ์ข์ ์ ๋๋ฉ์ด์ ์ ์์ด ๊ฐ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@ mib32 ๋น์ ์ด
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
Redux๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋น ํ ๋จ์ผ ํ๋ก์ ์ ์ด์๋ ์ด๋ฒคํธ ์์ฑ์ ๋๋ค.
๋ถ์ฐ ์์คํ ์๋ ์ผ๋ฐ์ ์ผ๋ก ํ๋์ ์ด๋ฒคํธ ๋ก๊ทธ (์ : Kafka)์์ด ๋ก๊ทธ๋ฅผ ์๋ก ๋ค๋ฅธ ์๋ฒ์์ ํธ์คํ ๋๋ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค / ์คํ ์ด (์ผ๋ฐ์ ์ผ๋ก DB ๋ณต์ ๋ณธ์ด ์ค์ ๋ก ๊ฐ์๊ธฐ)๋ก ํ๋ก์ ์ / ์ถ์ ํ ์์๋ ์ฌ๋ฌ ์๋น์๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ถ์ฐ ๋ ์ธ๊ณ์์๋๋ก๋ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋ถ์ฐ๋ฉ๋๋ค. ๋ฐ๋ฉด Redux์์๋ ๋ชจ๋ ๋ก์ปฌ ์ํ๋ฅผ ๊ฐ์ง ์๋ฐฑ ๊ฐ์ ์์ ฏ์ด ์๊ณ ์ด ๋ชจ๋ ๊ฒ์ด ๋จ์ผ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ฉฐ ๋ชจ๋ ์ํ ๋ณ๊ฒฝ์๋ ๋ถ๋ณ์ผ๋ก ์ธํด ์ฝ๊ฐ์ ์ค๋ฒ ํค๋๊ฐ ์์ต๋๋ค. ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ด ์ค๋ฒ ํค๋๋ ํฐ ๋ฌธ์ ๊ฐ ์๋์ง๋ง ํ ์คํธ ์ ๋ ฅ์ ์ข์ง ์์ ์ํ ๋ชจ์์ผ๋ก ๋ง์ดํธํ๊ณ ๋๋ฆฐ ๋ชจ๋ฐ์ผ ์ฅ์น์์ ๋น ๋ฅด๊ฒ ์ ๋ ฅ ํ ๋ ํญ์ ์ฑ๋ฅ์ด ์ถฉ๋ถํ์ง๋ ์์ต๋๋ค.
๋ด ๊ฒฝํ์ ๊ทธ ์ํ๋ฅผ ๋งจ ์์์ ๋ ๋๋งํ๋ ๊ฒ์ ํธ๋ฆฌํ์ง ์๊ณ ํญ์ ์ฑ๋ฅ์ด ์ถฉ๋ถํ์ง๋ ์์ต๋๋ค (์ ์ด๋ ๊ฐ์ฅ ๋น ๋ฅธ VDom ๊ตฌํ์ด ์๋ React์์๋). Redux๋
connect
๋ก์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ง ์ฐ๊ฒฐ ์๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๋ณ๋ชฉ ํ์์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ํด๊ฒฐ์ฑ ์ด๋ํ ImmutableJS์ ๊ฐ์ ์๊ตฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ํฐ ๋ชฉ๋ก์ ์์ ์์ธ์ ํญ๋ชฉ์ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ผ๋ถ ์์ ์์ ํญ์ ์ต์์ ์ฑ๋ฅ์ ์ ๊ณตํ์ง๋ ์์ต๋๋ค ( ์ฌ๊ธฐ์์ ํฐ ๋ชฉ๋ก์ ๋ ๋๋ง ํ ๊ฒฝํ ์ฐธ์กฐ).
Redux๋ ํธ๋ฆฌํ๊ณ ๋๋ถ๋ถ์ ์ฌ์ฉ ์ฌ๋ก์ ์ ํฉํ๊ธฐ ๋๋ฌธ์ ์ด๋ฒคํธ ๋ก๊ทธ์ ํ๋ก์ ์ ์ ๋ชจ๋ ํฌํจํ์ง๋ง redux ์ธ๋ถ์์ ์ด๋ฒคํธ ๋ก๊ทธ๋ฅผ ์ ์งํ๊ณ 2 ๊ฐ ์ด์์ redux ์ ์ฅ์์ ํฌ์ ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ชจ๋ redux ์ ์ฅ์๋ฅผ ๋ค๋ฅธ ํค์์ ์ปจํ ์คํธ์ ๋ฐ์ํ๊ณ ์ฐ๊ฒฐํ ์ ์ฅ์๋ฅผ ์ง์ ํ์ฌ ์ค๋ฒ ํค๋๋ฅผ ์ค์ ๋๋ค. ์ด๊ฒ์ ์ ๋์ ์ผ๋ก ๊ฐ๋ฅํ์ง๋ง, ์ด์ ์ ์ฅ์์ ์ด๋ฒคํธ ๋ก๊ทธ๋ฅผ ๋ช ํํ๊ฒ ๊ตฌ๋ถํด์ผํ๋ฏ๋ก api์ devtools๋ฅผ ๊ตฌํํ๊ธฐ๊ฐ ๋ ์ด๋ ค์์ง๋๋ค.
@jquense ์๋ ๋์ํฉ๋๋ค.
๋ชจ๋ ์ํ๋ฅผ Redux ์ ์ฅ์์ ๋ง์ดํธํ๋ ค๋ฉด ๋ ๋ง์ ์์ฉ๊ตฌ๊ฐ ํ์ํฉ๋๋ค. Elm ์ํคํ ์ฒ๋ ์๋ง๋์ด ๋ฌธ์ ๋ฅผ๋ณด๋ค ์ฐ์ํ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ์ง๋ง ๋ง์ ์์ฉ๊ตฌ๊ฐ ํ์ํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ชจ๋ ์ํ๋ฅผ ์ ์ดํ๋ โโ๊ฒ๋ ๊ฐ๋ฅํ๊ฑฐ๋ ์ํ ํ ์ ์์ต๋๋ค. ๋๋๋ก ์ฐ๋ฆฌ๋ ์ ์ธ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ด๋ ค์ด ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์ผ๋ถ ์ํ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก redux ์ ์ฅ์์ ๋ง์ดํธํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.