์ ๋ redux์์ ๋น๋๊ธฐ ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋์์ ๋ชจ์ํด ์์ผ๋ฉฐ, ์ ๊ฐ ํ ์ผ์ ๋ํด ๋ค๋ฅธ ์ฌ๋๋ค์ด ์๊ฒฌ์ ์ ์ํด ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
๋ด ์ ๊ทผ ๋ฐฉ์์ ์ค๋ช ํ๊ธฐ ์ํด redux ๋ณต์ ๋ณธ์์ ๋น๋๊ธฐ ์์ ๋ฅผ ๋ณ๊ฒฝํ์ต๋๋ค. https://github.com/winstonewert/redux/tree/master/examples/async
์ผ๋ฐ์ ์ผ๋ก ์ธ๋ถ ์์ ์ ์์ ์์ฑ์๋ฅผ ๋น๋๊ธฐ์์ผ๋ก ๋ง๋ค์ด ์ํ๋ฉ๋๋ค. ๋น๋๊ธฐ ์์ ์ ๊ฒฝ์ฐ fetchPosts ์์ ์์ฑ์๋ ์์ฒญ ์์์ ๋ํ๋ด๊ธฐ ์ํด REQUEST_POSTS ์์ ์ ๋์คํจ์นํ๊ณ , ๊ฒ์๋ฌผ์ด API์์ ๋์์ค๋ฉด RECEIVE_POSTS๊ฐ ๋ค๋ฐ๋ฆ ๋๋ค.
๋ด ์์์ ๋ชจ๋ ์์ ์์ฑ์๋ ๋๊ธฐ์์ ๋๋ค. ๋์ ์ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ ๋ฐ์ํด์ผ ํ๋ ๋น๋๊ธฐ ์์ ๋ชฉ๋ก์ ๋ฐํํ๋ ํจ์๊ฐ ์์ต๋๋ค. ์ฌ๊ธฐ์์ ๋ด ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค. https://github.com/rackt/redux/compare/master...winstonewert :master#diff-8a94dc7aa7bdc6e5390c9216a69761f8R12
doReactions ํจ์๋ ์ ์ฅ์๋ฅผ ๊ตฌ๋ ํ๊ณ ํ์ฌ ์์ฒญ์ ์ค์ ์ํ๊ฐ ์์ฒญ์ ์์ํ๊ฑฐ๋ ์ทจ์ํ์ฌ doReactions ์ํ์์ ๋ฐํ๋ ์ํ์ ์ผ์นํ๋์ง ํ์ธํฉ๋๋ค.
์ฐจ์ด์ ์ ๋ฌด์์ ๋๊น?
1) ๋ฐ์ ํจ์๋ ์ํ์ ์์ ํจ์์
๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๊ฒ ํ
์คํธํ ์ ์์ต๋๋ค.
2) ์์ฒญ์ ํ๋ ์ค์ ๋ก์ง์ด ๋ ๊ฐ๋จํฉ๋๋ค. ์ด์ ์ ์ปจํ
์ด๋ ๋ฐ ์์
์์ฑ์๋ฅผ ํตํด ํ์ฐ๋ ๋ค์ํ ๋
ผ๋ฆฌ ์กฐ๊ฐ๊ณผ ๋น๊ตํ์ฌ ๋ด ์์ ๋ช ์ค ํจ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
3) ์์ฒญ์ ์ฝ๊ฒ ์ทจ์ํ ์ ์์ต๋๋ค.
์ด๊ฒฌ์๋ ์ฌ๋?
ํฅ๋ฏธ๋ก์ด ์ ๊ทผ! XHR์ ์คํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์ด๋ ์น ์์ฒญ์ด ์ ์ด์ ๋น๋๊ธฐ์ ์์ค์ธ ๊ฒ์ฒ๋ผ ๋น๋๊ธฐ์ ํน์ฑ์์ ์ด์์ ์ผ๋ก ๋ถ๋ฆฌ๋์ด์ผ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ redux์์ ๋ถ์์ฉ์ ์ฒ๋ฆฌํ๋ ๋์์ ์ธ ๋ฐฉ๋ฒ์ ๋ํด ๋ง์ด ์๊ฐํ๊ณ ์์ผ๋ฉฐ ํ์ฌ ์ ๊ทผ ๋ฐฉ์์์ ๋ณผ ์ ์๋ ๋ช ๊ฐ์ง ๋ฌธ์ ์ ์ด๊ฒ์ด ์ ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ์๊ฐํ๋์ง ๋ธ๋ ์ธ ๋คํํ ๋ ์ค๋ ๋๋ฅผ ๊ฐ๋ก์ฑ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๊ฒ๋ณด๊ธฐ์ ๋จ์ํจ์๋ ๋ถ๊ตฌํ๊ณ ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ผ๋ก ํฐ ๋ฐ๊ฑธ์์ ๋ด๋๋ ์ต๋๋ค.
์์ ํจ์ํ ์ธ์ด์์ ๋ถ์์ฉ์ ํญ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฐ์ฅ์๋ฆฌ๋ก ๋ค์ด ์ฌ๋ ค์ง๊ณ ์คํ์ ์ํด ๋ฐํ์์ผ๋ก ๋ฐํ๋ฉ๋๋ค. Elm์์ ๋ฆฌ๋์๋ ์๋ก์ด ์ํ์ ์คํ๋์ด์ผ ํ๋ ํจ๊ณผ๋ฅผ ํฌํจํ๋ ํํ์ ๋ฐํํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด ์๋ช ์ด ์๋ ๋ฉ์๋๋ ์์ง ๋ค๋ฅธ redux ๋ฆฌ๋์๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
redux์์ ๋ถ์์ฉ์ ์ํํ ์ ์๋ ๋ช ๋ฐฑํ(ํ์ง๋ง ๊ฐ์ฅ ์ข์ ๊ฒ์ ์๋) ์์ ์์ฑ์๊ฐ ๋์์ผ๋ฉฐ ์ด ํจํด์ ์ง์ํ๊ธฐ ์ํด ์ฌ๋ฌ ๋ค๋ฅธ ๋ฏธ๋ค์จ์ด ์ต์ ์ด ๊ฐ๋ฐ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์ฌ์ ๋ฏธ๋ค์จ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ฆฌ๋์์ ์ผ๊ธ ๊ฐ๋ ์ผ๋ก ๋ถ์์ฉ์ ๋ฐํํ ์ ์๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ฐ๊น๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฌ๋๋ค์ ์ฌ์ ํ โโredux๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์ง ๊ฒ์ ๋ง๋ค๊ณ ์์ผ๋ฉฐ ํฐ ์ง์ ์ ์ด๋ฃจ๊ณ ๋๋ถ๋ถ์ ๋์๋ณด๋ค ํจ์ฌ ๊ฐ๋จํ๊ณ ์ค์ฉ์ ์ด์ง๋ง, ์ก์ ์ ์์ ๋ด๋ถ์์ ๋ถ์์ฉ์ด ๋ฐ์ํ๋ ๋ฐ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์นด์ดํฐ ์์ฉ ํ๋ก๊ทธ๋จ์์ incrementAsync๋ ์๊ฐ ์ด๊ณผ๋ฅผ ์์ฑํ๊ณ ์๋ฃ ์์๋ง ์์ฉ ํ๋ก๊ทธ๋จ ์ํ๊ฐ ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ฆ๋ถ ์์ ์ด ์งํ ์ค์ด๋ผ๋ ์๊ฐ์ ํ์๊ธฐ๋ฅผ ํ์ํ๋ ค๋ ๊ฒฝ์ฐ ๋ณด๊ธฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ํ์์ ์ด๋ฅผ ์ ์ถํ ์ ์์ต๋๋ค. ์ด ์ํ๋ ์์์ ์ด๋ฉฐ ์จ๊ฒจ์ ธ ์์ต๋๋ค.
๋๋๋ก ์ฐ์ํ๊ธด ํ์ง๋ง ์์์ ์ํ๊ฐ ์จ๊ฒจ์ ธ ์๊ณ ์ฝ๊ฒ ์ง๋ ฌํํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ฑ๊ธฐ๋ฅผ ์์ ์์ฑ์์ ์กฐ์ ์ ๋ก ์ฌ์ฉํ๋
redux-thunk ๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ ์ฌ์ฉํ๋ฉด ์ฆ๊ฐ ์์ ์ด ์์๋๊ณ ์๋ฃ๋ ๋ ์ด๋ฅผ ์๋ฆฌ๋ ์ฌ๋ฌ ๋ฉ์์ง๋ฅผ ๊ฐ์๊ธฐ์ ๋ณด๋ผ ์ ์์ง๋ง ์ด๋ ๋ค๋ฅธ ๋ฌธ์ ์ธํธ๋ฅผ ์์ฑํฉ๋๋ค.
ํจ๊ณผ๊ฐ ์๋ฃ๋ ํ ์ฆ๊ฐ ์์ ์ด ์งํ ์ค์ธ ๊ฒ์ผ๋ก ํ์๋๋ ์ง์ ์ผ๋ก ์ํ๋ฅผ ๋๊ฐ๋ ๊ฒ์ ์ค์ ๋ก ๋ถ์์ฉ์ ์ฌ์์ฑํ์ง ์์ผ๋ฏ๋ก ๋ฌด๊ธฐํ ์งํ ์ํ๋ก ์ ์ง๋ฉ๋๋ค.
๊ทํ์ ์ ์์ด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ๋ถ์์ฉ์ ์ํ์์ ์์ฑ๋๊ธฐ ๋๋ฌธ์ ์๋๋ ์ด๋ค ํํ๋ก๋ ๊ฒฐ๊ณผ ์ํ๋ก ํํ๋์ด์ผ ํ๋ฏ๋ก ์ ์ฅ์๋ฅผ ์์ ์ด ์์๋ ์ด์ ์ํ๋ก ๋๋๋ฆฌ๋ฉด ๋ฐ์์ ํจ๊ณผ๋ฅผ ๋ค์ ์์ํ๋ ๋์ ํจ๊ณผ๋ฅผ ๋ค์ ์์ํฉ๋๋ค. ์ํ๋ฅผ ๋ฆผ๋ณด ์ํ๋ก ๋์ญ์์ค.
์ ํ๋ฆฌ์ผ์ด์ ์ด ํน์ ์ํ์ผ ๋๋ง ์ก์ ์ด ๋ถ์์ฉ์ ์ผ์ผํค๋ ๊ฒ์ ๋น์ฐํ๋ค. redux์์ ์ก์ ์์ฑ์๊ฐ ์ํ๋ฅผ ์๊ตฌํ๋ค๋ฉด ๊ทธ๊ฒ์ ๋จ์ํ๊ณ ์์ํ ํจ์์ด๊ฑฐ๋ ๋ช ์์ ์ผ๋ก ์ํ์ ํจ๊ป ์ ๊ณต๋์ด์ผ ํฉ๋๋ค.
๊ฐ๋จํ ์๋ก, ์์ ์นด์ดํฐ ์์ฉ ํ๋ก๊ทธ๋จ์ผ๋ก ์์ํ์ฌ ์นด์ดํฐ๊ฐ 5์ ๋ฐฐ์์ผ ๋๋ง๋ค ์นด์ดํฐ๋ฅผ ์์์ ๊ธ๊ผด ์์์ผ๋ก ๋ณ๊ฒฝํ๋ ค๊ณ ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
๋์ ์์ฑ์ ์์ํ์ง ์์ผ๋ฏ๋ก ์ด ๋์์ ๋๋ ์ ์๋ ์์น๋ ์์ ์์ฑ์์ ๋๋ค. ๊ทธ๋ฌ๋ ์นด์ดํฐ, ์ฆ๋ถ, ๊ฐ์, incrementAsync, incrementIfOdd(์ด ๊ฒฝ์ฐ ์์ ํ ํ์๊ฐ ์์) ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ๋ช ๊ฐ์ง ๋ค๋ฅธ ์์ ์ด ์์ต๋๋ค.
์ด์ ์ ์ฆ๊ฐ ๋ฐ ๊ฐ์๋ ์ด์ ์ ๊ฐ์๊ธฐ์์ ์ฒ๋ฆฌ๋์์ผ๋ฏ๋ก ํ์ฌ ๊ฐ์ ์ก์ธ์คํ ์ ์์๊ธฐ ๋๋ฌธ์ ์ํ๊ฐ ํ์ํ์ง ์์์ง๋ง ๊ฐ์๊ธฐ๋ ๋ถ์์ฉ(๋์ ์์ฑ)์ ๊ฐ์ง๊ฑฐ๋ ๋ฐํํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด์ ์ด๋ฌํ ํจ์๋ ์๋ก์ด ์์์ ๊ธ๊ผด ์์์ ์ ํํด์ผ ํ๊ณ ์ด ๋ ผ๋ฆฌ๋ฅผ ๋ชจ๋ ๋์ ์กฐ์น ์์ฑ์์์ ๋ณต์ ํด์ผ ํ๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ํ์ฌ ์นด์ดํฐ ๊ฐ์ ์์์ผ ํฉ๋๋ค.
ํ์ฌ ์ํ๋ฅผ ๋ช ์์ ์ผ๋ก ์ ๊ณตํ๋ ํ ๊ฐ์ง ๊ฐ๋ฅํ ๋์์ redux-thunk๋ฅผ ์ฌ์ฉํ๊ณ ํ์ฌ ์ํ์ ์ก์ธ์คํ๊ธฐ ์ํด ์ฝ๋ฐฑ์ ๋ฐํํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํ์ฌ ๊ฐ์ ์ ๊ณตํ๊ธฐ ์ํด ์์ฑ๋ ๋ชจ๋ ์ฅ์ ์์ ์ ์์ ํ๋ ๊ฒ์ ํผํ ์ ์์ง๋ง ์ด์ ์์ ์์ฑ์๋ ์ ์ญ ์์ฉ ํ๋ก๊ทธ๋จ ์ํ์์ ๊ฐ์ด ์ ์ฅ๋ ์์น๋ฅผ ์์์ผ ํ๋ฉฐ ์ด๋ ๋์ผํ ์์ฉ ํ๋ก๊ทธ๋จ ๋๋ ์ํ๊ฐ ๋ค๋ฅด๊ฒ ๊ตฌ์ฑ๋ ์ ์๋ ๋ค๋ฅธ ์์ฉ ํ๋ก๊ทธ๋จ์์.
์นด์ดํฐ ์์ ๋ฅผ ๋ค์ ๋ฐฉ๋ฌธํ๋ฉด ์นด์ดํฐ ์ธ์คํด์ค๊ฐ ํ๋๋ง ์์์ ์ ์ ์์ต๋๋ค. ๋์ผํ ์ํ๋ฅผ ๋ณด๊ฑฐ๋ ์ ๋ฐ์ดํธํ๋ ๋ง์ ์นด์ดํฐ๊ฐ ํ์ด์ง์ ์๋ ๊ฒ์ ์ฝ์ง๋ง ๊ฐ ์นด์ดํฐ๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ์ฌ์ฉํ๋๋ก ํ๋ ค๋ฉด ์นด์ดํฐ๋ฅผ ์ถ๊ฐ๋ก ์์ ํด์ผ ํฉ๋๋ค.
์ด๊ฒ์ ๊ฐ์๊ธฐ ๋ฐ ๊ตฌ์ฑ ์์ ํฅ์๊ธฐ๋ก ์ผ๋ฐ ๋ชฉ๋ก์ ๋ง๋๋ ๋ฐฉ๋ฒ ์ด์ ์ ๋ ผ์๋์์ต๋๋ค
์นด์ดํฐ๊ฐ ๋จ์ ์์ ์ ํ๋ง ์ฌ์ฉํ๋ค๋ฉด ๋๋ฆ ๋๋ฌด ์ํคํ ์ฒ ๋ฅผ ์ ์ฉํ๋ ๊ฒ์ ๋น๊ต์ ๊ฐ๋จํฉ๋๋ค.
์ด ๊ฒฝ์ฐ ๋ถ๋ชจ๋ ๋จ์ํ ์ก์ ์์ฑ์ ๋๋ ๋์คํจ์ฒ๋ฅผ ๋ํํ์ฌ ํ์ํ ์ปจํ ์คํธ๋ก ๋ฉ์์ง๋ฅผ ๋ณด๊ฐํ ๋ค์ ํ์งํ๋ ์ํ๋ก ์ง์ ๋ฆฌ๋์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
React Elmish ์์ ๊ฐ ์ธ์์ ์ผ๋ก
incrementIfOdd๋ ํ์ฌ ์ํ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ๋ฏธ๋ค์จ์ด์ ์์กดํ๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ํ ๋ด์์์ ์์น๋ฅผ โโ์์์ผ ํฉ๋๋ค.
incrementAsync๋ ๊ฒฐ๊ตญ ๋ถ๋ชจ ๊ตฌ์ฑ ์์์ ๋ ธ์ถ๋์ง ์์ผ๋ฏ๋ก ์ถ๊ฐ ์ปจํ ์คํธ๋ก ๋ํํ ์ ์๋ ์ฆ๋ถ ์์ ์ ์ง์ ์ ๋ฌํฉ๋๋ค.
๊ทํ์ ์ ์์ด ์ด ๋ฌธ์ ๋ฅผ ์ง์ ํด๊ฒฐํ์ง๋ ์์ง๋ง incrementAsync๊ฐ ์ํ๋ฅผ {counter: 0, incrementAfterDelay: 1000}
๋ก ๋ณ๊ฒฝํ์ฌ ์คํ ์ด ๋ฆฌ์ค๋์์ ๋ถ์์ฉ์ ์ ๋ฐํ๋ ๊ฐ๋จํ ์์
์ผ๋ก ๊ตฌํ๋ ๊ฒฝ์ฐ incrementAsync๋ ๊ฐ๋จํ ๋ฉ์์ง๊ฐ ๋ฉ๋๋ค. incrementIfOdd๋ ์์ํ๋ฏ๋ก ๊ฐ์๊ธฐ์์ ๊ตฌํํ๊ฑฐ๋ ๋ช
์์ ์ผ๋ก ์ํ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.... ๋ฐ๋ผ์ ์ํ๋ ๊ฒฝ์ฐ elm ์ํคํ
์ฒ๋ฅผ ๋ค์ ์ ์ฉํ ์ ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ๋ถ์์ฉ์ ํ ์คํธํ๊ธฐ๊ฐ ๋ ์ด๋ ค์ธ ๊ฒ์ด๋ผ๋ ๊ฒ์ด ๋งค์ฐ ๋ถ๋ช ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ผ๋จ ๋ถ์์ฉ์ด ํ์ฌ ์ํ์ ๋น์ฆ๋์ค ๋ ผ๋ฆฌ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ฉด ํ ์คํธ๊ฐ ๋ ์ด๋ ค์ธ ๋ฟ๋ง ์๋๋ผ ๋ ์ค์ํด์ง๋๋ค.
๊ทํ์ ์ ์์ ํตํด ์ํ ์ ํ์ด ์ค์ ๋ก ์ด๋ค ๋ฐ์๋ ์คํํ์ง ์๊ณ ์ํ๋ ๋ฐ์์ ํฌํจํ๋ ์ํ๋ฅผ ์์ฑํ๋ค๋ ํ ์คํธ๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์์ต๋๋ค. ๋ฐ์์ ๋ํ ์กฐ๊ฑด๋ถ ์ํ๋ ๋น์ฆ๋์ค ๋ก์ง์ด ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ํ ์คํธํ๊ธฐ ๋ ์ฝ์ต๋๋ค.
John A De Goes์ ์ต๊ทผ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ํจ๊ณผ๋ฅผ ํํํ๊ธฐ ์ํ IO ๋๋ ํ์คํฌ์ ๊ฐ์ ๋ถํฌ๋ช ํ ๋ฐ์ดํฐ ์ ํ์ ๋ฌธ์ ์ ๋ํด ๋ ผ์ํ์ต๋๋ค. ๋ถํฌ๋ช ํ ์ ํ๋ณด๋ค ๋ถ์์ฉ์ ๋ํ ์ ์ธ์ ์ค๋ช ์ ์ฌ์ฉํ๋ฉด ๋์ค์ ํจ๊ณผ๋ฅผ ์ต์ ํํ๊ฑฐ๋ ๊ฒฐํฉํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
FP๋ฅผ ์ํ ํ๋ ์ํคํ ์ฒ
์ฝํฌ, ์ฝ์ ๋ฐ ์์ฑ๊ธฐ๋ ๋ถํฌ๋ช
ํ๋ฏ๋ก ์ผ๊ด ์ฒ๋ฆฌ ๋ฐ/๋๋ ์ค๋ณต API ํธ์ถ ์ต์ ์ ๊ฐ์ ์ต์ ํ๋ fetchPostsIfNeeded
์ ์ ์ฌํ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ช
์์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
๊ทํ์ ์ ์์ fetchPostsIfNeeded
์ ๊ฑฐ reactions
๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ฒ์ด ์์ ํ ์คํ ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ ์ต๊ทผ์ ์๋ก์ด ์ํ๋ฅผ ๋ฐํํ๋ ๋ฆฌ๋์๋ฅผ ๋ง๋ค ์ ์๋ redux ์
๊ธฐ์กด ๋ฆฌ๋์ ์ฝ๋์์ ํธํ์ฑ์ ์ ์งํ๊ธฐ ์ํด ๊ธฐ์กด ๋ฆฌ๋์์ ๋ํ ํจ๊ณผ๋ฅผ ๋์ด๊ธฐ ์ํด compose ๋ฐ CombineReducers๋ฅผ ์์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ redux๋ฅผ ๋ถ๊ธฐํ์ง ์๊ณ ์ด ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ํ์ ํ์ง ๋ชปํ์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ทํ์ ์ ์์ redux๋ฅผ ์์ ํ ํ์๊ฐ ์๋ค๋ ์ ์์ ๊ฝค ์ข์ต๋๋ค. ๋ํ ๊ทํ์ ์๋ฃจ์ ์ด ์์์ ์๋ ์ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋ ๋์ ์์ ์ ์ํํ๊ณ ๊ฒฐ๊ณผ ๋ฐ์์ ๊ฒฐํฉํ๊ฑฐ๋ ์ต์ ํํ๊ธฐ๊ฐ ๋ ์ฌ์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
React๊ฐ "๋จ์ง UI"์ด๊ณ ์ค์ ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ์ ์ฅํ๊ฑฐ๋ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ทธ๋ค์ง ๊ท๋ฒ์ ์ด์ง ์์ ๊ฒ์ฒ๋ผ Redux๋ ๋๋ถ๋ถ "๊ทธ๋ฅ ์์ "์ด๋ฉฐ ๋ถ์์ฉ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ทธ๋ค์ง ๊ท๋ฒ์ ์ด์ง ์์ต๋๋ค.
๋๋ ์ค์ฉ์ ์ด๊ณ ์์ ์ ์๋ฃํ ์ฌ๋์ ํํ์ง ์์ผ๋ฉฐ redux์ ๋ฏธ๋ค์จ์ด์ ๋ํ ๋ง์ ๊ธฐ์ฌ์๋ค์ ์ฌ๋๋ค์ด ์ด์ ๋ณด๋ค ๋ ๋น ๋ฅด๊ณ ๋ ๋์ ์ ๋ง ๋ฉ์ง ๊ฒ์ ๋ง๋ค ์ ์๊ฒ ํด์ฃผ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ๊น์ง ์ฌ ์ ์์๋ ๊ฒ์ ๊ทธ๋ค์ ๊ณตํ ๋๋ถ์ ๋๋ค. ๊ณตํํ ๋ชจ๋ ๋ถ๋ค๊ป ํนํ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
Redux๋ ๊ต์ฅํฉ๋๋ค. ์ด๊ฒ๋ค์ Redux ์์ฒด์ ํ์ ๋ฌธ์ ๋ ์๋์ง๋ง ํ์ฌ ์ํคํ ์ฒ ํจํด์ ๋ํ ๊ฑด์ค์ ์ธ ๋นํ๊ณผ ์ํ ์์ ์ด์ ์ด ์๋ ์ดํ์ ํจ๊ณผ๋ฅผ ์คํํ๋ ๋๊ธฐ ๋ฐ ์ ์ฌ์ ์ธ ์ด์ ์ด ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์๊ณผ redux-saga์ ์ฐจ์ด์ ์ ์ดํดํ๋ ค๊ณ ํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์์์ ์ผ๋ก ์์ฑ๊ธฐ์ ์ํ๋ฅผ ์จ๊ธด๋ค๋ ์ฃผ์ฅ์ ๊ด์ฌ์ด ์์ต๋๋ค. ์ฒ์์๋ ๊ฐ์ ์ผ์ ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฌ๋ io.take
๊ฐ ๊ตฌํ๋๋ ๋ฐฉ์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ๊ฐ๊ฐ ํ์ฌ ํด๋น yield
์์ ์ฐจ๋จ๋ ๊ฒฝ์ฐ์๋ง ์์
์ ์ฒ๋ฆฌํ๋ค๋ฉด ๋ฌด์จ ๋ง์ธ์ง ํ์คํ ์๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ redux-saga๊ฐ io.take
๊ฐ ๊ณผ๊ฑฐ ์์
์ ๋ฐํํ๋๋ก ์์
์ ๋๊ธฐ์ด์ ๋ฃ์ผ๋ฉด ๋์ผํ ์์
์ ์ํํ๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. ์ด๋ ์ชฝ์ด๋ , ์ก์
์คํธ๋ฆผ์ ์์ ํ์ฌ ํธ๋ฆฌ๊ฑฐ๋๋ ๋น๋๊ธฐ์์ผ๋ก dispatch
์์
์ ์ํํ ์ ์๋ ๋ช ๊ฐ์ง ๋
ผ๋ฆฌ๊ฐ ์์ต๋๋ค.
๊ทธ๋๋ ํฅ๋ฏธ๋ก์ด ๊ฐ๋ ์ ๋๋ค. Redux๋ฅผ ์ํ ์ ํ ๋ฐ ํจ๊ณผ๊ฐ ํธ๋ฆฌ๊ฑฐ๋๋ ์์ ์คํธ๋ฆผ์ผ๋ก ๊ฐ๋ ํํฉ๋๋ค. ๊ทธ๊ฒ์ ๋์๊ฒ ์ํ ํ๋ก์ธ์๋ง์ ๊ณ ๋ คํ๋ ๊ฒ๋ณด๋ค ๋์์ ์ธ ๊ด์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๋ฒคํธ ์์ฑ ๋ชจ๋ธ์์ Redux ์์ ์ด "๋ช ๋ น"(์กฐ์น๋ฅผ ์ทจํ๊ธฐ ์ํ ์ฐ๋ฐ์ ์์ฒญ)์ธ์ง ๋๋ "์ด๋ฒคํธ"(ํํํ ๋ณด๊ธฐ์ ๋ฐ์๋ ์ํ์ ์์์ ์ ํ)์ธ์ง์ ๋ฐ๋ผ ์์ฝํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ ์ชฝ์ด๋ ์๊ฐํ ์ ์์ ๋งํผ ์ถฉ๋ถํ ์ ์ฐํ ๋๊ตฌ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ ์ญ์ "์ค๋งํธ ์ก์ ์ ์์"์ ํ์ฌ ์ํ์ ์ฝ๊ฐ ๋ง์กฑํ์ง ์์ง๋ง Redux๊ฐ ๋ ๋ง์ ์ด๋ฒคํธ ์ ์ฅ์์ธ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ ๊ทผํ์ต๋๋ค. ์ฌ๊ธฐ์ ์ก์ ์ ๊ฐ๋ฅํ ๋ง์ ํจ๊ณผ ์ค ํ๋์ ๋๋ค. ์ผ๋ถ ์ธ๋ถ "์ปจํธ๋กค๋ฌ" ๊ณ์ธต์ ์ํด ํธ๋ฆฌ๊ฑฐ๋ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ฐ๋ฅด๋ ์ฝ๋๋ฅผ react-redux-controller ๋ก ์ธ์ํํ์ง๋ง, ์ด๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํ ์ ์ฌ์ ์ผ๋ก ๋ ๊ฐ๋ฒผ์ด ๋ฐฉ๋ฒ์ ๋ํ ๋ฐ์ฏค ๊ตฌ์ด ์์ด๋์ด๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์ฌ ๊ฐ์ง๊ณ ์์ง ์์ ํํฌ๋ฅผ ๊ฐ์ง๋ ค๋ฉด react-redux๊ฐ ํ์ํ๊ณ ์ผ๋ถ ์์ ์์๋ ์์ง ํด๊ฒฐํ์ง ๋ชปํ hijinks๋ฅผ ํฌ์ฅํด์ผ ํฉ๋๋ค.
์คํ ์ด hijinks ์ค๋ช https://github.com/rackt/redux/issues/1200
์ด ์ ๊ทผ ๋ฐฉ์๊ณผ redux-saga์ ์ฐจ์ด์ ์ ์ดํดํ๋ ค๊ณ ํฉ๋๋ค.
๋๋ ๋ด ์ ๊ทผ ๋ฐฉ์์ ์๊ฐํด ๋ธ ์ดํ๊น์ง redux-saga๋ฅผ ๋ณด์ง ์์์ง๋ง ํ์คํ ๋ช ๊ฐ์ง ์ ์ฌ์ ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ฌ์ ํ ๋ช ๊ฐ์ง ์ฐจ์ด์ ์ด ์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ด ์ ๊ทผ ๋ฐฉ์์ ์์ ๊ธฐ๋ฅ์ ๊ฐ์กฐํ๊ณ ๋ชจ๋ ๊ฒ์ redux ์ํ๋ก ์ ์งํฉ๋๋ค. redux-saga ์ ๊ทผ ๋ฐฉ์์ ํํ๋ ฅ์ ๊ฐ์กฐํฉ๋๋ค. ์ฅ์ ๋ ๋จ์ ๋ ์์ง๋ง ์ ๋ ์ ๊ฒ ๋ ์ข์ต๋๋ค. ํ์ง๋ง ์ ๋ ํธ๊ฒฌ์ด ์์ต๋๋ค.
์ ๋ง ์ ๋งํ๊ฒ ๋ค๋ฆฝ๋๋ค. ๋๋ฉ์ธ ๋ ผ๋ฆฌ์์ ๋ฐ์ ๊ธฐ๊ณ๋ฅผ ๋ถ๋ฆฌํ๋ ์๋ฅผ ๋ณด๋ ๊ฒ์ด ๋ ์ค๋๋ ฅ์ด ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ทํ์ ์ ์์ fetchPostsIfNeeded๋ฅผ ์ ๊ฑฐํ์ผ๋ฉฐ ๋ ๋ง๊ฑฐ๋ ๋ ์ ์ ๋ฐ์ดํฐ๊ฐ ์์ฒญ๋์์ ๋ ํ์์ ๋ฐ๋ผ ์ฌ๋ฌ ์์ฒญ์ ์ต์ ํํ๊ฑฐ๋ ๋ค๋ฅธ API ์ธํธ๋ฅผ ์ฌ์ฉํ ์ ์๋ ๋ฐ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ฒ์ด ์์ ํ ์คํ ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋๋ก ๋ฐ์ ๊ธฐ๋ฅ์์๋ ์ค์ ๋ก ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค. ์ด๋ค ์์ ์ด ์ด๋ฏธ ์์๋์๋์ง ์์์ผ ํ๋ ๋ ผ๋ฆฌ๊ฐ ์์ง๋ง(๋ ์ด์ ์์ ์ ์ผ๊ด ์ฒ๋ฆฌํ ์ ์์) ๋ฐ์ ๊ธฐ๋ฅ์๋ ์ ๋ณด๊ฐ ์์ต๋๋ค. ๋ฐ์() ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐ์ ๊ธฐ๊ณ๋ ํ์คํ ๊ทธ๋ฐ ์ผ์ ํ ์ ์์ต๋๋ค.
๋๋ฉ์ธ ๋ ผ๋ฆฌ์์ ๋ฐ์ ๊ธฐ๊ณ๋ฅผ ๋ถ๋ฆฌํ๋ ์๋ฅผ ๋ณด๋ ๊ฒ์ด ๋ ์ค๋๋ ฅ์ด ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
doReactions() ํจ์๊ฐ XMLHttpRequest์ ์์/์ค์ง๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ์๋ฏธํ๋ค๊ณ ๊ฐ์ ํฉ๋๊น? ๋ค์ํ ๋ฐฉ๋ฒ์ ๋ชจ์ํ๊ณ ์์ต๋๋ค. ๋ฌธ์ ๋ ๋ ๋ฐ์์ด ์ค์ ๋ก ๋์ผํ ๋ฐ์์ธ์ง ์ฌ๋ถ๋ฅผ ๊ฐ์งํ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ์ฐพ๊ธฐ๊ฐ ์ด๋ ต๋ค๋ ๊ฒ์ ๋๋ค. Lodash์ isEqual์ ๊ฑฐ์ ์๋ํ์ง๋ง ํด๋ก์ ์๋ ์คํจํฉ๋๋ค.
doReactions() ํจ์๊ฐ XMLHttpRequest์ ์์/์ค์ง๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ์๋ฏธํ๋ค๊ณ ๊ฐ์ ํฉ๋๊น?
์๋์, ์ ๋ง์ ๊ทํ์ ์์์ ๋ฐ์์ ๊ฐ๋ ์ ์ค์ ํ๊ธฐ ์ํ ๋ชจ๋ ๊ตฌ์ฑ์ด ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋์ง์ ๋ํ ๋๋ฉ์ธ ๋ ผ๋ฆฌ์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ๋ํ ์ธ๋ถ ์ ๋ณด๊ฐ ํผํฉ๋์ด ์๋ค๋ ์๋ฏธ์ ๋๋ค. ์ผ๋ฐ์ ์ธ ์ธก๋ฉด์ ์์ ์ ๊ด๋ จ๋ ์ธ๋ถ ์ฌํญ๊ณผ ๋ ๊ฒฐํฉ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๋์, ์ ๋ง์ ๊ทํ์ ์์์ ๋ฐ์์ ๊ฐ๋ ์ ์ค์ ํ๊ธฐ ์ํ ๋ชจ๋ ๊ตฌ์ฑ์ด ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋์ง์ ๋ํ ๋๋ฉ์ธ ๋ ผ๋ฆฌ์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ๋ํ ์ธ๋ถ ์ ๋ณด๊ฐ ํผํฉ๋์ด ์๋ค๋ ์๋ฏธ์ ๋๋ค. ์ผ๋ฐ์ ์ธ ์ธก๋ฉด์ ์์ ์ ๊ด๋ จ๋ ์ธ๋ถ ์ฌํญ๊ณผ ๋ ๊ฒฐํฉ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํ ... ๋๋ฉ์ธ ๋ ผ๋ฆฌ๋ก ๊ฐ์ ์๋ฏธ๊ฐ ์๋ ์๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ด๊ฐ ๋ณผ ๋ ๋ฐ์() ํจ์๋ ๋๋ฉ์ธ ๋ ผ๋ฆฌ๋ฅผ ์บก์ํํ๊ณ ๋ฐ์์ด ์ ์ฉ๋๋ ๋ ผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๋ doReactions() ํจ์์ ๋ณ๊ฐ์ ๋๋ค. ๊ทผ๋ฐ ๋ญ๊ฐ ๋ค๋ฅธ ๋ป์ด์ ๋ฏ...
๊ทธ๋๋ก ๋ฐ์ ๊ธฐ๋ฅ์์๋ ์ค์ ๋ก ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค. ์ด๋ค ์์ ์ด ์ด๋ฏธ ์์๋์๋์ง ์์์ผ ํ๋ ๋ ผ๋ฆฌ๊ฐ ์์ง๋ง(๋ ์ด์ ์์ ์ ์ผ๊ด ์ฒ๋ฆฌํ ์ ์์) ๋ฐ์ ๊ธฐ๋ฅ์๋ ์ ๋ณด๊ฐ ์์ต๋๋ค. ๋ฐ์() ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐ์ ๊ธฐ๊ณ๋ ํ์คํ ๊ทธ๋ฐ ์ผ์ ํ ์ ์์ต๋๋ค.
๋๋ ์ฃผ๋ก ๋จ์ผ ์ด๋ฒคํธ๊ฐ ์ฌ๋ฌ ๊ตฌ์ฑ ์์๊ฐ ๋์ผํ ์ ๋ณด๋ฅผ ์์ฒญํ๋ ์ํ ๋ณ๊ฒฝ์ ํธ๋ฆฌ๊ฑฐํ ๊ฒฝ์ฐ ์ด๋ฅผ ์ต์ ํํ ์ ์์์ ์๋ฏธํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด์ ์ํ ๋ณ๊ฒฝ์ผ๋ก ์ธํ ๋ถ์์ฉ์ด ์์ง ๋ณด๋ฅ ์ค์ธ์ง ํ์ธํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ผ๋ฏ๋ก ์ถ๊ฐ ์์ฒญ์ด ํ์ํ์ง ์๋ค๋ ๊ฒ์ ๋ง์ต๋๋ค.
์ฒ์์๋ ์ฑ ์ํ ๋ด์์ ๋ชจ๋ ์ํ๋ฅผ ์ ์งํ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง ์ต๊ทผ ์คํฑ์์น ๋ฌธ์ ์ ๋ํด ์๊ฐํ๊ธฐ ์์ํ์ ๋ ์คํฑ์์น isOn
๊ฐ ์ ํ๋ฆฌ์ผ์ด์
์ํ์ ์ ์ฅ๋์ด์ผ ํ๋ค๋ ์ฌ์ค์ ๊นจ๋ฌ์์ต๋๋ค. ์ค์ interval
์ด ์คํฑ์์น์ ์ฐ๊ฒฐ๋ isOn
๋ ์ฑ ์ํ์ฌ์ผ ํ์ง๋ง ์ด ๊ฒฝ์ฐ ๋จ๋
์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
๋๋ ์ฃผ๋ก ๋จ์ผ ์ด๋ฒคํธ๊ฐ ์ฌ๋ฌ ๊ตฌ์ฑ ์์๊ฐ ๋์ผํ ์ ๋ณด๋ฅผ ์์ฒญํ๋ ์ํ ๋ณ๊ฒฝ์ ํธ๋ฆฌ๊ฑฐํ ๊ฒฝ์ฐ ์ด๋ฅผ ์ต์ ํํ ์ ์์์ ์๋ฏธํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด์ ์ํ ๋ณ๊ฒฝ์ผ๋ก ์ธํ ๋ถ์์ฉ์ด ์์ง ๋ณด๋ฅ ์ค์ธ์ง ํ์ธํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ผ๋ฏ๋ก ์ถ๊ฐ ์์ฒญ์ด ํ์ํ์ง ์๋ค๋ ๊ฒ์ ๋ง์ต๋๋ค.
์์ฒญ์ ๋ณํฉํ๊ฑฐ๋ ์ผ๊ด ์ฒ๋ฆฌํ ์๊ฐ์ด์์ต๋๋ค. ์ค๋ณต ์ ๊ฑฐ๋ ์ ์๋ํฉ๋๋ค. ์ค์ ๋ก ๋ณด๋ฅ ์ค์ธ ์ํ ๋ณ๊ฒฝ์ ๊ฒฝ์ฐ๋ ์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ์๋ฒ ์๋ต์ด ๋์์ฌ ๋๊น์ง ๋ฐ์ ํจ์์์ ๋ฐํ๋๋ฏ๋ก ์ค๋ณต์ด ์ ๊ฑฐ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฒ์์๋ ์ฑ ์ํ ๋ด์์ ๋ชจ๋ ์ํ๋ฅผ ์ ์งํ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง ์ต๊ทผ ์คํฑ์์น ๋ฌธ์ ์ ๋ํด ์๊ฐํ๊ธฐ ์์ํ์ ๋ ์คํฑ์์น isOn์ด ์ ํ๋ฆฌ์ผ์ด์ ์ํ์ ์ ์ฅ๋์ด์ผ ํ๋ค๋ ์ฌ์ค์ ๊นจ๋ฌ์์ต๋๋ค. ์ด ์คํฑ์์น์ ๊ด๋ จ๋ ์ค์ ๊ฐ๊ฒฉ ๊ฐ์ฒด ๋ค๋ฅธ ๊ณณ์ ์ ์ฅํด์ผ ํฉ๋๋ค. isOn์ ์ฑ ์ํ์ฌ์ผ ํ์ง๋ง ์ด ๊ฒฝ์ฐ ๋จ๋ ์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
๋ด๊ฐ ์๊ฐํ๋ ๋ฐฉ์์ผ๋ก ํ์ฌ ๋ณด๋ฅ ์ค์ธ ๋ฐ์์ ๋ฐ์ ๊ตฌ์ฑ ์์์ ๊ฐ์ต๋๋ค. ๊ธฐ์ ์ ์ผ๋ก ๋ด๋ถ ์ํ๊ฐ ์์ง๋ง ํ์ฌ ์ํ์ ํจ์๋ก ๋ชจ๋ธ๋งํฉ๋๋ค.
ํ ... ๋๋ฉ์ธ ๋ ผ๋ฆฌ๋ก ๊ฐ์ ์๋ฏธ๊ฐ ์๋ ์๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ด๊ฐ ๋ณผ ๋ ๋ฐ์() ํจ์๋ ๋๋ฉ์ธ ๋ ผ๋ฆฌ๋ฅผ ์บก์ํํ๊ณ ๋ฐ์์ด ์ ์ฉ๋๋ ๋ ผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๋ doReactions() ํจ์์ ๋ณ๊ฐ์ ๋๋ค. ๊ทผ๋ฐ ๋ญ๊ฐ ๋ค๋ฅธ ๋ป์ด์ ๋ฏ...
๋๋ /reactions/index
๋ชจ๋ ์ ์ฒด๋ฅผ ์ทจํ์ง๋ง, ์, reactions
ํจ์๊ฐ ์์ ํ ๋๋ฉ์ธ ๋
ผ๋ฆฌ๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ฉ์ธ ํน์ ๋ชจ๋์ ์๋ ๊ฒ์ด ์๋๋ผ doReactions
์ ์์ฉ๊ตฌ์ ํจ๊ป ๋ํ๋ฉ๋๋ค. ๋ฐฉ๋ฒ๋ก ์ ๋
ธํฌํ๋ ๊ฒ์ด ์๋๋ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋์ ์ฑ ์ฝ๋์ ๊ตฌ๋ถ์ ํ ๋์ ์ดํดํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
๊ทธ๋ฌ๋ฉด doReactions
์์ฒด๊ฐ API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ํน์ ํ์์ ํน์ ๋ฉ์๋์ ๋ค์ ๋ฐ์ ํ๊ฒ ๊ฒฐํฉ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ์ด์ ๋ถ์ธ ๋ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ค์ํ ์ ํ์ ํจ๊ณผ์ ๋ํ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ์ผ ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๊ทธ๊ฒ์ ๋น์ ์ ๋ฐฉ๋ฒ์ ๋ ธํฌํ๋ ๊ฒ์ด ์๋๋๋ค. ์ ๋ ์ด ์ ๊ทผ ๋ฐฉ์์ด ์ ๋ง ๋งค๋ ฅ์ ์ด๋ผ๊ณ โโ์๊ฐํฉ๋๋ค.
๋ฐ์ ๊ตฌ์ฑ ์์ ์ํ๊ฐ ๋๋ถ๋ถ์ ๋ฐ์ ์ํ์ ์ข์ ๋น์ ์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ฑ ์ํ์ ์์ด์ผ ํ์ง๋ง ๋ถ๋ช
ํ ์ด๋ค ๋ฐฉ์์ผ๋ก๋
๋ฐฐ์นํ ์ ์๋ ๋์คํจ์น ์ด๋ฒคํธ ์ฌ์ด์ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํด
๊ฐ๊ฒ.
๋๋ ์ด๋ฐ ์ข
๋ฅ์ ์ํ๊ฐ @yelouafi ๊ฐ ์ ์ด ์ํ
์๋ง๋ sagas๋ ์ง๋ ฌํํ ์ ์๋ ์ํ๋ฅผ ๋ชจ๋ธ๋งํ๋ ๊ด์ฐฎ์ ๋ฐฉ๋ฒ์ผ ๊ฒ์
๋๋ค.
๋
๋ฆฝ์ ์ธ ๊ด์ฐฐ์/ํ์์๋ก์์ ์์คํ
.
์ฌ๊ฐ๋ผ๋ฉด ์จ๊ฒจ์ง ์ฌ๊ฐ ์ํ์ ๋ํด ๋ ๊ฑฑ์ ํ ๊ฒ ๊ฐ์์
์ฌ์ฉ์ ๋์ ์ ํ๋ฆฌ์ผ์ด์
์์ฑ ์ด๋ฒคํธ(๋ฐ์)์๋ง ์๋ต
์ฑ ๋ฆฌ๋์๊ฐ
ํ์ฌ ์ํ ๋ฐ ๋ชจ๋ ์กฐ๊ฑด๋ถ ๋น์ฆ๋์ค ๋ก์ง์ด
์์ฉ ํ๋ก๊ทธ๋จ์ ๋ณต์ ์์ด ์ํ๋ ๋ถ์์ฉ์ ํ์ฉํด์ผ ํฉ๋๋ค.
๋น์ฆ๋์ค ๋
ผ๋ฆฌ.
2016๋
1์ 4์ผ ์์์ผ ์คํ 5:56 Winston Ewert [email protected]
์ผ๋ค:
๋๋ ์ฃผ๋ก ๋จ์ผ ์ด๋ฒคํธ๊ฐ ์ํ ๋ณ๊ฒฝ์ ์ ๋ฐํ๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํ์ต๋๋ค.
์ฌ๋ฌ ๊ตฌ์ฑ ์์๊ฐ ๋์ผํ ์ ๋ณด๋ฅผ ์์ฒญํ ๊ฒฝ์ฐ
์ต์ ํํ์ญ์์ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์๋ค๋ ๊ฒ์ด ์ณ์ต๋๋ค.
์ด์ ์ํ ๋ณ๊ฒฝ์ ๋ถ์์ฉ์ด ์์ง ๋ณด๋ฅ ์ค์ธ์ง ํ์ธ
๋ฐ๋ผ์ ์ถ๊ฐ ์์ฒญ์ด ํ์ํ์ง ์์ต๋๋ค.์์ฒญ์ ๋ณํฉํ๊ฑฐ๋ ์ผ๊ด ์ฒ๋ฆฌํ ์๊ฐ์ด์์ต๋๋ค. ์ค๋ณต ์ ๊ฑฐ
์ ์๋ํด์ผํฉ๋๋ค. ์ค์ ๋ก๋ ๋ณด๋ฅ ์ํ์ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
๋ณ๊ฒฝ ์ฌํญ๋ ๊ด์ฐฎ์ต๋๋ค.
์๋ฒ๊ฐ ์๋ตํ ๋๊น์ง ๋ฐ์ ๊ธฐ๋ฅ(๋ฐ๋ผ์ ์ค๋ณต ์ ๊ฑฐ)
๋์์ค๋ค.์ฒ์์๋ ์ฑ ๋ด์์ ๋ชจ๋ ์ํ๋ฅผ ์ ์งํ ์ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
ํ์ง๋ง ์ต๊ทผ์ ์คํฑ์์น ๋ฌธ์ ์ ๋ํด ์๊ฐํ๊ธฐ ์์ํ์ ๋
์คํฑ์์น๊ฐ ์ผ์ ธ ์์ด์ผํ๋ค๋ ์ฌ์ค์ ๊นจ๋ฌ์์ต๋๋ค.
์์ฉ ํ๋ก๊ทธ๋จ์ ์ด๊ฒ๊ณผ ๊ด๋ จ๋ ์ค์ ๊ฐ๊ฒฉ ๊ฐ์ฒด๋ฅผ ๋ํ๋ ๋๋ค.
์คํฑ์์น๋ ๋ค๋ฅธ ๊ณณ์ ์ ์ฅํด์ผ ํฉ๋๋ค. isOn์ ์ฑ์ ์์ด์ผ ํฉ๋๋ค.
state but is is not ํผ์๋ ์ด ๊ฒฝ์ฐ์ ์ถฉ๋ถํ์ง ์์ต๋๋ค.๋ด๊ฐ ์๊ฐํ๋ ๋ฐฉ์์ผ๋ก ํ์ฌ ๋ณด๋ฅ ์ค์ธ ๋ฐ์์
๋ฐ์ ์ฑ๋ถ. ๊ธฐ์ ์ ์ผ๋ก ๋ด๋ถ ์ํ๊ฐ ์์ง๋ง ์ฐ๋ฆฌ๋
๊ทธ๊ฒ๋ค์ ํ์ฌ ์ํ์ ํจ์๋ก.โ
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
https://github.com/rackt/redux/issues/1182#issuecomment -168858051.
๋ฐฉ๋ฒ๋ก ์ ๋ ธํฌํ๋ ๊ฒ์ด ์๋๋ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋์ ์ฑ ์ฝ๋์ ๊ตฌ๋ถ์ ํ ๋์ ์ดํดํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
๊ทธ๊ฒ์ ์์ ํ ๊ณต์ ํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ doReactions ์์ฒด๋ API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ํน์ ์์ ์ ํน์ ๋ฉ์๋์ ๋ค์ ๋ฐ์ ํ๊ฒ ๊ฒฐํฉ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ์ด์ ๋ถ์ธ ๋ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ค์ํ ์ ํ์ ํจ๊ณผ์ ๋ํ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ์ผ ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
์. ๋๋ ์ฌ์ ํ ๊ทธ๊ฒ์ ๋ถํ ํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์์ ๋ด๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค. ํ๋ฑ ๊ฒ์ฌ ๋ฌธ์ ๋ก ์ธํด ๋ณต์กํฉ๋๋ค.
๋ฐ์ ๊ตฌ์ฑ ์์ ์ํ๊ฐ ๋๋ถ๋ถ์ ๋ฐ์ ์ํ์ ์ข์ ๋น์ ์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ฑ ์ํ์ ์์ด์ผ ํ์ง๋ง ๋ถ๋ช ํ ์ด๋ค ๋ฐฉ์์ผ๋ก๋
๋ฐฐ์นํ ์ ์๋ ๋์คํจ์น ์ด๋ฒคํธ ์ฌ์ด์ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํด
๊ฐ๊ฒ.
๋ฏธ์, ๋ด๊ฐ ๋น์ ๋ฅผ ๋ง์น ๊ฒ ๊ฐ์. ๋ด ์์ ์ DOM์ ์ํ๋งํผ ์ปดํฌ๋ํธ ์ํ์ ๋ฐ์ํ๊ธฐ ์ํด ์ธ๋ถ ์ก์ ์ํ๋ฅผ ๋น๊ตํ๋ ๊ฒ์ด ์๋๋ผ๋ ๊ฒ์ ๋๋ค. ๊ฐ๊ฒฉ ๋๋ XMLHttpRequest๋ ์์ฑ ๋ฐ ์๋ฉธ ๋ฐ์์ ์ํํ๋ DOM ์์์ ๋น์ทํฉ๋๋ค. ๋น์ ์ ๋จ์ํ ํ์ฌ DOM์ด ๋ฌด์์ ํด์ผ ํ๋์ง ๋ฐ์ํ๊ณ ๊ทธ๊ฒ์ด ์ผ์ด๋๋๋ก ํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ํ์ฌ ์ธ๋ถ ๋ฐ์ ์งํฉ์ ๋ฐํํ๊ธฐ๋ง ํ๋ฉด ํ๋ ์์ํฌ๊ฐ ์ทจ์ํ๊ฑฐ๋ ์์ ์ ์์ํ์ฌ ์ฌ์ค๋ก ๋ง๋ญ๋๋ค.
๋๋ ๊ทธ ์ ๊ทผ ๋ฐฉ์๋ ๋งค์ฐ ํฅ๋ฏธ๋กญ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ค๋ฅธ ์ํ ๋งคํ์ ์ฌ์ฉํ๋ ์ฌ๋ฌ doReactions
์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์
จ์ต๋๊น? ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋๋ผ์ด๋ฒ๋ฅผ ๋น๋ํ ์ ์๋ cyclejs์ ๋น์ทํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
function main(action$) {
const state$ = action$.startWith(INITIAL_STATE).scan(reducer);
return {
DOM: state$.map(describeDOM),
HTTP: state$.map(describeRequests),
...
};
}
ํ ๊ฐ์ง ์ฐจ์ด์ ์ ์์
์คํธ๋ฆผ( const someEvent$ = sources.DOM.select('.class').events('click')
)์ ๊ฐ์ ธ์ค๊ธฐ ์ํด ๋๋ผ์ด๋ฒ์ ์ด๋ฒคํธ๋ฅผ ์ฟผ๋ฆฌํ์ง ์๊ณ HTTP ์์ฒญ์ ๋ํด ์ํํ ๊ฒ์ฒ๋ผ ์ฑํฌ์์ ์ง์ ์์
( <button onClick={() => dispatch(action())} />
)์ ์ง์ ํ๋ค๋ ๊ฒ์
๋๋ค. ๋ํ.
๋๋ React ๋น์ ๊ฐ ๊ฝค ์ ์๋ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. DOM์ ๋ด๋ถ ์ํ๋ก ๊ฐ์ฃผํ์ง ์๊ณ API์ ํจ๊ป ์๋ํ๋ ๋ฐ๋ฉด ๋ด๋ถ ์ํ๋ ๊ตฌ์ฑ ์์ ์ธ์คํด์ค์ ๊ฐ์ DOM์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
๋ค์์ API์ ๋ํ ์์ด๋์ด์ ๋๋ค(React ์ฌ์ฉ, HTTP๋ ์ด์ ๊ฐ์ด ๋น๋ํ ์ ์์).
// usage
const describe = (state, dispatch) => <MyComponent state={state} dispatch={dispatch} />;
const driver = createReactDOMDriver({ container } /* opts */);
store.subscribe(() => driver.update(describe(store.getState(), store.dispatch));
// (could be simplified further to eg. `store.use(driver, describe)` )
// implementation
const createReactDOMDriver = ({ container }) => {
return {
update: (element) => ReactDOM.render(element, container),
destroy: () => ReactDOM.unmountComponentAtNode(container),
};
};
describe
๊ฐ getState
(์ํ ์ค๋
์ท ๋์ ) ๋ฐ dispatch
ํฉ๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ์ํ๋ ๋งํผ ๋๊ธฐํ๋ ์ ์์ต๋๋ค.
๋ค๋ฅธ ์ํ ๋งคํ์ ์ฌ์ฉํ๋ ์ฌ๋ฌ doReactions๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ จ์ต๋๊น?
๋๋ ๊ทธ๊ฒ์ ๋ํด ๊ฐ๋จํ ์๊ฐํ๊ณ , ์ง๊ธ์ ๊ทธ๊ฒ์ ๋ํด ์ฝ๊ฐ ์๋ค๋ก ๊ฐ๊ณ ์์ต๋๋ค. DOM์ ์ํ ๊ฒ, http๋ฅผ ์ํ ๊ฒ, ํ์ด๋จธ๋ฅผ ์ํ ๊ฒ, ์น ์ค๋์ค๋ฅผ ์ํ ๊ฒ ๋ฑ ๋ค๋ฅธ ์ผ์ ํ๋ ๋ค๋ฅธ ๋ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ๋ ๊ฒ์ด ์์ฐ์ค๋ฝ์ต๋๋ค. ๊ฐ๊ฐ์ ์์ ์ ๊ฒฝ์ฐ์ ์ ํฉํ ์ต์ ํ/๋์์ ์ํํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ผํ์ฑ ์ธ๋ถ ์์ ์ ๋ง์ด ์ํํ๋ ์ฑ์ด ์๋ ๊ฒฝ์ฐ์๋ ๋ ๋์์ด ๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ค๋ช ์ด getState(์ํ ์ค๋ ์ท ๋์ )๋ฅผ ๊ฐ์ ธ์ค๊ณ ๋์คํจ์นํ๋๋ก ํฉ๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ์ํ๋ ๋งํผ ๋๊ธฐํ๋ ์ ์์ต๋๋ค.
๋๋ํ์ง ์์ ๊ฒ์ด๋ค. ์ ์๊ฐ์๋ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๋น๋๊ธฐ๋ฅผ ์ ํํ๊ณ ์ถ๊ฐ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง ์์ผ๋ ค๊ณ ํฉ๋๋ค. getState()๋ฅผ ํธ์ถํ๋ ค๋ ๋ชจ๋ ๊ฒ์ ๊ฐ์๊ธฐ ๋๋ ๋ฐ์ ํจ์์์ ์ํํด์ผ ํฉ๋๋ค. (๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋์ ์์ํ ์ฌ๊ณ ๋ฐฉ์์ด๋ฉฐ, ์๋ง๋ ๊ทธ๊ฒ์ ๋ฐ๋ฅด์ง ์๋ ์ค์ฉ์ ์ธ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.)
๊ณต์ ํ ์ง์ ์
๋๋ค. ๋๋ ๋น์ ์ ์์ด๋์ด์ @taurose ์ ์ ์ฌ์ด์ ๋งคํ์ ๋ํด ์ถฉ๋ถํ ์๊ฐํ์ง ์์์ต๋๋ค. ์ฑ๊ธํ๊ฒ describe
๊ฐ reactions
ํจ์๋ผ๊ณ ๊ฐ์ ํ์ง๋ง ์ฌ์ค์ด ์๋ ์๋ ์์ต๋๋ค.
ํ์ง๋ง ๋ค, ์ ๋ ๋น๋๊ธฐ๋ฅผ ์ ํํ๋ ๊ฒ์ด ์ด์์ ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ์๋ํ๋ฉด ์ ๊ฐ ๋น์ ์ ์์ด๋์ด์ ์ทจ์ง๋ฅผ ์ดํดํ๋ค๋ฉด, ์ฐ๋ฆฌ๋ ์ฐ์์ฑ์ด ์์ํ๊ณ ์๋๋ฅผ ์ค๋ช ํ๋ ๋ฐฐ์ด ๊ตฌ์ฑ์์ ์กด์ฌ์ ๊ฐ์ ์ํ์ ํน์ ์ธก๋ฉด๊ณผ 1:1 ๋งคํ๋๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฃผ์ด์ง ํจ๊ณผ๊ฐ ์งํ ์ค์ ๋๋ค. ๊ทธ๋ ๊ฒํ๋ฉด ์ฌ๋ฌ ๋ฒ ์คํ๋๋ ๊ฒฝ์ฐ ์ค์ ๋ก ์ค์ํ์ง ์์ผ๋ฉฐ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์์์ ์ผ๋ก ์์กดํ ์ ์๋ ํ๋ฆ ์ค๊ฐ ์ด๋๊ฐ์์ ์ค๋จ๋๋ ํ๋ก์ธ์ค์ ์จ๊ฒจ์ง ์ธก๋ฉด์ด ์์ต๋๋ค.
์ค๋ช ์ด getState(์ํ ์ค๋ ์ท ๋์ )๋ฅผ ๊ฐ์ ธ์ค๊ณ ๋์คํจ์นํ๋๋ก ํฉ๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ์ํ๋ ๋งํผ ๋๊ธฐํ๋ ์ ์์ต๋๋ค.
describe
๋ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํธ์ถ๋๋ฏ๋ก ํ์ํ์ง ์์ต๋๋ค. ๋น๋๊ธฐ๋ฅผ ํ ์ ์๋ค๋ ์๋ฏธ๋ ์๋๋๋ค. ๋ฐ์ ๊ตฌ์ฑ ์์๋ฅผ ๊ณ ๋ คํ์ญ์์ค. ํ์ฌ ์ํ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ๋ ๋๋ง ๋ฉ์๋ ๋๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ด๋ถ์์ getState
ํธ์ถํ์ง ์๊ณ ์ํ์์ ์ฝ์ต๋๋ค.
๊ทธ๋ฌ๋ ์์ฒด์ ์ผ๋ก ๋น๋๊ธฐ์์ผ๋ก ์๋ฌด๊ฒ๋ ํ ์ ์๋ค๋ ์ ์์ ๋น์ ์ด ์ณ์ต๋๋ค. ๊ทธ๊ฒ์ ๋๋ผ์ด๋ฒ์ ๋งก๊ธฐ๊ณ ๋งคํ๋ ์ํ ๋ฐ/๋๋ ์ฝ๋ฐฑ์ ์ ๋ฌํด์ผ ํฉ๋๋ค.
์ค๋ช ์ด ๋ฐ์ ํจ์๋ผ๊ณ ๊ฐ์ ํ์ง๋ง ์ฌ์ค์ด ์๋ ์๋ ์์ต๋๋ค.
๋ด๊ฐ ๋งํ ์ ์๋ ํ, ๊ทธ๊ฒ์ ๊ฑฐ์ ๋์ผํฉ๋๋ค. ํ ๊ฐ์ง ์ฐจ์ด์ ์ reactions
๊ฐ dispatch
๋ฐ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ describe
๋ ์์
์ ์์ฑํ๊ณ ์ ๋ฌํ๋ ์ฝ๋ฐฑ์ ๋ฐํํ๋ ๋ฐ๋ฉด reactions
๋ ์์
์์ฑ์๋ฅผ ๋ฐํํฉ๋๋ค.
@winstonewert ๊ทธ๊ฒ์ ๊ธด ์ค๋ ๋์ด๋ฉฐ ์ง๊ธ ๋น์ฅ ์ฝ๊ฑฐ๋ ์ฝ๋๋ฅผ ํ์ธํ ์๊ฐ์ด ์์ง๋ง @yelouafi ๊ฐ ๋ต๋ณํ ์ ์์ต๋๋ค.
redux-saga ํ๋ก์ ํธ๋ ์ฌ๊ธฐ ์์ ๊ธด ํ ๋ก .
๋๋ ๋ํ ํ๋ก๋์ ์ฑ์์ 1๋ ๋๊ฒ saga ๊ฐ๋ ์ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ๊ตฌํ์ ๋ ํํ์ ์ด์ง๋ง ์ ๋๋ ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ง ์์ต๋๋ค. ๋ค์์ redux์ ๋ํ ๊ฐ๋ ์ ๋ํ ๋ช ๊ฐ์ง ์ ์ฌ ์์ ๋๋ค.
์ฌ๊ธฐ์ ๊ตฌํ์ ์๋ฒฝํ์ง ์์ง๋ง ์์ด๋์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
@yelouafi ๋ redux ์ธ๋ถ์์ ์ํ๋ฅผ ์จ๊ธฐ๋ ์์ฑ๊ธฐ ์ฌ์ฉ์ ๋ด์ฌ๋ ๋ฌธ์ ์ ๋ฐฑ์๋์์ ๋ฌด์ฉ๋ด์ ์์ํ๊ณ ์ ๋๋ฒ์ค ์ฑ์ ํ๋ก ํธ์๋์ ์จ๊ฒจ์ง ์ํ๋ฅผ ์ ์กํ๋ ๊ฒ์ด ๋ณต์กํ๋ค๋ ์ ์ ์๊ณ ์์ต๋๋ค(์ ๋ง ํ์ํ ๊ฒฝ์ฐ?)
redux-saga๋ Free๊ฐ IO ๋ชจ๋๋์ ๋ํ ๊ฒ์ฒ๋ผ redux-thunk์ ๋ํ ๊ฒ์ ๋๋ค. ํจ๊ณผ๋ ์ ์ธ์ ์ด๋ฉฐ ์ง๊ธ์ ์คํ๋์ง ์์ผ๋ฉฐ ๋ด๋ถ ๊ฒ์ฌ๊ฐ ๊ฐ๋ฅํ๊ณ ์ธํฐํ๋ฆฌํฐ์์ ์คํ๋ฉ๋๋ค(๋์ค์ ์ฌ์ฉ์ ์ ์ํ ์ ์์).
์ ๋๋ ์ดํฐ ๋ด๋ถ์ ์จ๊ฒจ์ง ์ํ์ ๋ํ ๊ทํ์ ์์ ์ ์ดํดํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ๋ก Redux ์คํ ์ด๊ฐ Redux ์ฑ์ ์ง์ ํ ์์ค ์ ๋๊น? ๋๋ ๊ทธ๋ ๊ฒ ์๊ฐํ์ง ์๋๋ค. Redux๋ ์์ ์ ๊ธฐ๋กํ๊ณ ์ฌ์ํฉ๋๋ค. ํญ์ ์ด๋ฌํ ์์ ์ ์ฌ์ํ์ฌ ์์ ์ ๋ค์ ๋ง๋ค ์ ์์ต๋๋ค. redux ์ ์ฅ์๋ ์ด๋ฒคํธ ๋ก๊ทธ์ CQRS ์ฟผ๋ฆฌ ๋ณด๊ธฐ์ ๊ฐ์ต๋๋ค. ํด๋น ์ด๋ฒคํธ ๋ก๊ทธ์ ์ ์ผํ ํฌ์์ด์ด์ผ ํจ์ ์๋ฏธํ์ง๋ ์์ต๋๋ค. ๋ค๋ฅธ ์ฟผ๋ฆฌ ๋ณด๊ธฐ์์ ๋์ผํ ์ด๋ฒคํธ ๋ก๊ทธ๋ฅผ ํฌ์ํ๊ณ ๊ธฐ์ ์ ์๊ด์์ด ์์ฑ๊ธฐ, ์ ์ญ ๋ณ๊ฒฝ ๊ฐ๋ฅ ๊ฐ์ฒด ๋๋ ๊ฐ์๊ธฐ๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ๋ฌด์ฉ๋ด์์ ์ด๋ฅผ ์์ ํ ์ ์์ต๋๋ค.
๋ฆฌ๋์๋ก ์ฌ๊ฐ ์ปจ์
์ ๋ง๋๋ ๊ฒ์ ๊ฐ๋
์ ์ผ๋ก ๋์ ์๊ฐ์ด ์๋๋ฉฐ ํธ๋ ์ด๋ ์ค๋ธ ๊ฒฐ์ ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ํ๋ก๋์
์์ 1๋
์ด์ saga๋ฅผ ์ฌ์ฉํ ํ์ saga์ ์ํ๋ฅผ ์ค๋
์ทํ๊ณ ๋์ค์ ๋ณต์ํ ์ ์๋ ๊ฒ์ด ์ ์ฉํ์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ๊ธฐ์ต๋์ง ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์์ด๋ ์ ๋๋ ์ดํฐ์ ํํ๋ ฅ์ ์ ํธํฉ๋๋ค. ํน์ง.
๋ด๊ฐ ๋งํ๋ ๊ฒ์ด redux-saga์ ๋ํ ๊ณต๊ฒฉ์ผ๋ก ๋ค๋ฆฌ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋ด๊ฐ ์๊ฐํด๋ธ ์ ๊ทผ ๋ฐฉ์๊ณผ ์ด๋ป๊ฒ ๋ค๋ฅธ์ง์ ๋ํด ์ด์ผ๊ธฐํ์ ๋ฟ์ ๋๋ค.
์ ๋๋ ์ดํฐ ๋ด๋ถ์ ์จ๊ฒจ์ง ์ํ์ ๋ํ ๊ทํ์ ์์ ์ ์ดํดํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ๋ก Redux ์คํ ์ด๊ฐ Redux ์ฑ์ ์ง์ ํ ์์ค์ ๋๊น? ๋๋ ๊ทธ๋ ๊ฒ ์๊ฐํ์ง ์๋๋ค. Redux๋ ์์ ์ ๊ธฐ๋กํ๊ณ ์ฌ์ํฉ๋๋ค. ํญ์ ์ด๋ฌํ ์์ ์ ์ฌ์ํ์ฌ ์์ ์ ๋ค์ ๋ง๋ค ์ ์์ต๋๋ค. redux ์ ์ฅ์๋ ์ด๋ฒคํธ ๋ก๊ทธ์ CQRS ์ฟผ๋ฆฌ ๋ณด๊ธฐ์ ๊ฐ์ต๋๋ค. ํด๋น ์ด๋ฒคํธ ๋ก๊ทธ์ ์ ์ผํ ํฌ์์ด์ด์ผ ํจ์ ์๋ฏธํ์ง๋ ์์ต๋๋ค. ๋ค๋ฅธ ์ฟผ๋ฆฌ ๋ณด๊ธฐ์์ ๋์ผํ ์ด๋ฒคํธ ๋ก๊ทธ๋ฅผ ํฌ์ํ๊ณ ๊ธฐ์ ์ ์๊ด์์ด ์์ฑ๊ธฐ, ์ ์ญ ๋ณ๊ฒฝ ๊ฐ๋ฅ ๊ฐ์ฒด ๋๋ ๊ฐ์๊ธฐ๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ๋ฌด์ฉ๋ด์์ ์ด๋ฅผ ์์ ํ ์ ์์ต๋๋ค.
๋๋ ๋น์ ์ ์์ ์ ์ฌ๊ธฐ์์ ์ ๋ง๋ก ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์ฌ๊ฐ๊ฐ ์ด๋ฒคํธ ๋ก๊ทธ์ ํฌ์์ด๋ผ๊ณ ์ฃผ์ฅํ๋ ๊ฒ ๊ฐ์ต๋๊น? ํ์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค. ์ก์ ์ ์ฌ์ํ๋ฉด ๋ฌด์ฉ๋ด์ด ๋น๋๊ธฐ์ ์ด๋ฒคํธ์ ์์กดํ๋ ๊ฒฝ์ฐ ๋ฌด์ฉ๋ด์์ ๊ฐ์ ์์น์ ๋๋ฌํ์ง ์์ต๋๋ค. sagas๊ฐ redux์ ์ํ ์ ์ฅ์๋ ์ด๋ฒคํธ ๋ก๊ทธ์ ํ๋ก์ ์ ์ ์๋ ์ํ๋ฅผ ์์ฑํ๋ ๊ฒ์ ํผํ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ด๊ฐ ๋งํ ์ ์๋ ํ, ๊ทธ๊ฒ์ ๊ฑฐ์ ๋์ผํฉ๋๋ค. ํ ๊ฐ์ง ์ฐจ์ด์ ์ ๋ฐ์์ด ๋์คํจ์น๋์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์ค๋ช ์ ์์ ์ ์์ฑํ๊ณ ์ ๋ฌํ๋ ์ฝ๋ฐฑ์ ๋ฐํํ์ง๋ง ๋ฐ์์ ์์ ์์ฑ์๋ฅผ ๋ฐํํฉ๋๋ค.
๋์. ์์น์ ์ผ๋ก ๋ฐ์์ ๋์ผํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋ชจ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ์ด๋ฒคํธ๊ฐ ์์๋ ๋ ์ ๋ฌ๋๋ ์์ ์์ฑ๊ธฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์๊ฐํ๋ฉด ํ ์๋ก ์ด ์ ๊ทผ ๋ฐฉ์๊ณผ ๋ฌด์ฉ๋ด ์ฌ์ด์ ๋ง์ ์๋์ง ํจ๊ณผ๊ฐ ์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. @winstonewert๊ฐ ์ค๋ช ํ 4๊ฐ์ง ์์ ์ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ๋ฐ์์ด ์ฌ์ฉ์๊ฐ ์์ํ ์์ ์ ๋ณผ ์ ์๋ ๊ฒ์ ์ข์ ์ผ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์จ๊ฒจ์ง ์ํ๊ฐ ๋ฐฉ์ง๋๊ณ ๋ฆฌ๋์์ ๋น์ฆ๋์ค ๋ ผ๋ฆฌ๊ฐ ์์ ์์ฑ์ ๋๋ ์ฌ๊ฐ์์ ๋ณต์ ๋ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ถ์์ฉ์ด ์ข ์ข ๋ฐ์ ์ ์ฅ์, ๊ฐ๊ฒฉ, dom ๊ฐ์ฒด, http ์์ฒญ ๋ฑ์ ์ ์ฅํ ์ ์๋ ์ง๋ ฌํ ๋ถ๊ฐ๋ฅํ ์ํ๋ฅผ ์์ฑํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. sagas, rxjs, baconjs ๋ฑ์ ์ด ์ธ๋ถ ์ง๋ ฌํ ๋ถ๊ฐ๋ฅํ ์ ์ด ์ํ์ ์๋ฒฝํฉ๋๋ค.
doReactions๋ ์ฌ๊ฐ๋ก ๋์ฒด๋ ์ ์์ผ๋ฉฐ ์ฌ๊ฐ์ ์ด๋ฒคํธ ์์ค๋ ์ก์ ์ด โโ์๋ ๋ฐ์์ด์ด์ผ ํฉ๋๋ค.
๋ด๊ฐ ๋งํ๋ ๊ฒ์ด redux-saga์ ๋ํ ๊ณต๊ฒฉ์ผ๋ก ๋ค๋ฆฌ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ณ๋ง์์ ์. ๋๋ ํ ๋ก ์ ๋ฐ๋ฅด๊ณ ์์ง๋ง ์ฝ๋๋ฅผ ๋ ์์ธํ ์ดํด๋ณด์ง ์๊ณ ๋๊ธ์ ๋ฌ๊ณ ์ถ์ง ์์์ต๋๋ค.
์ธ๋ป๋ณด๊ธฐ์. ์ํ ๋ณ๊ฒฝ์๋ง ๋ฐ์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ด๊ฐ ๋งํ๋ฏ์ด ๊ทธ๊ฒ์ ๋น ๋ฅธ ๋ชจ์ต์ด์๋ค. ๊ทธ๋ฌ๋ ๋ณต์กํ ํ๋ฆ์ ๊ตฌํํ๋ ๊ฒ์ด ๋๋ฆ ๋๋ฌด ์ ๊ทผ ๋ฐฉ์(์ํ์ ์์ ์ ๋ชจ๋ ์ํํ๋ ๊ฒฝ์ฐ)๋ณด๋ค ํจ์ฌ ๋ ์ด๋ ต๊ฒ ๋ง๋ค ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ ๋ ๋ง์ ์ ์ด ์ํ๋ฅผ ์คํ ์ด์ ์ ์ฅํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค(์ฑ ์ํ ๋ณ๊ฒฝ๋ง์ผ๋ก๋ ๊ด๋ จ ๋ฐ์์ ์ถ๋ก ํ๊ธฐ์ ๋ถ์ถฉ๋ถํจ).
๋ฌผ๋ก ์์ํ ๊ธฐ๋ฅ์ ๋ฅ๊ฐํ๋ ๊ฒ์ ์์ต๋๋ค. ๋ฆฌ๋์๋ ์ํ ์ ํ์ ํํํ๋ ๋ฐ ํ๋ฅญํ์ง๋ง ์ํ ๋จธ์ ์ผ๋ก ์ ํํ๋ฉด ์ ๋ง ์ด์ํด์ง๋๋ค.
์ด๋ ๋ ๋ง์ ์ ์ด ์ํ๋ฅผ ์คํ ์ด์ ์ ์ฅํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค(์ฑ ์ํ ๋ณ๊ฒฝ๋ง์ผ๋ก๋ ๊ด๋ จ ๋ฐ์์ ์ถ๋ก ํ๊ธฐ์ ๋ถ์ถฉ๋ถํจ).
๋ค. ์ด๊ฒ์ด ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฃผ์ ์ฐจ๋ณํ ์ธก๋ฉด์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ๋ก ๋ค๋ฅธ ํจ๊ณผ ์ ํ์ ๋ค๋ฅธ "๋๋ผ์ด๋ฒ"๋ก ๋ฌถ์ ์ ์๋ค๋ฉด ์ด ๋ฌธ์ ๋ฅผ ํฌ๋ช ํ๊ฒ ๋ง๋ค ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค. ๋๋ ์ฌ๋๋ค์ด ์ํ๋ ๋๋ผ์ด๋ฒ๋ฅผ ์ ํํ๊ฑฐ๋ ์๋ก์ด ํจ๊ณผ๋ฅผ ์ํด ์ง์ ์์ฑํ๋ ๊ฒ์ด ๋งค์ฐ ์ฝ๋ค๊ณ ์์ํ๊ณ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ถ์์ฉ์ด ์ข ์ข ๋ฐ์ ์ ์ฅ์, ๊ฐ๊ฒฉ, dom ๊ฐ์ฒด, http ์์ฒญ ๋ฑ์ ์ ์ฅํ ์ ์๋ ์ง๋ ฌํ ๋ถ๊ฐ๋ฅํ ์ํ๋ฅผ ์์ฑํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. sagas, rxjs, baconjs ๋ฑ์ ์ด ์ธ๋ถ ์ง๋ ฌํ ๋ถ๊ฐ๋ฅํ ์ ์ด ์ํ์ ์๋ฒฝํฉ๋๋ค.
๋๋ ๋น์ ์ด ์์ง ๋ฌด์์ธ์ง ๋ณผ ์ ์์ต๋๋ค.
๋ฆฌ๋์๋ ์ํ ์ ํ์ ํํํ๋ ๋ฐ ํ๋ฅญํ์ง๋ง ์ํ ๋จธ์ ์ผ๋ก ์ ํํ๋ฉด ์ ๋ง ์ด์ํด์ง๋๋ค.
๋๋ ๋์ํ๋ค. ๋ณต์กํ ์ํ ๊ธฐ๊ณ๋ฅผ ์์ผ๋ก ์์ฑํ๋ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. (์ฌ์ค ์ฐ๋ฆฌ๊ฐ ๋ฐ์ ๊ธฐ๋ฅผ ๊ฐ์๊ธฐ๋ก ๋ฐ๊ฟ ์ ์๋ค๋ฉด ๊ทธ๊ฒ์ ๊น๋ํ ๊ฒ์ ๋๋ค.)
๊ทธ๋ฌ๋ ์ค์ ๋ก ๋ค๋ฅธ ํจ๊ณผ ์ ํ์ ๋ค๋ฅธ "๋๋ผ์ด๋ฒ"๋ก ๋ฌถ์ ์ ์๋ค๋ฉด ์ด ๋ฌธ์ ๋ฅผ ํฌ๋ช ํ๊ฒ ๋ง๋ค ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค. ๋๋ ์ฌ๋๋ค์ด ์ํ๋ ๋๋ผ์ด๋ฒ๋ฅผ ์ ํํ๊ฑฐ๋ ์๋ก์ด ํจ๊ณผ๋ฅผ ์ํด ์ง์ ์์ฑํ๋ ๊ฒ์ด ๋งค์ฐ ์ฝ๋ค๊ณ ์์ํ๊ณ ์์ต๋๋ค.
์ฌ๊ธฐ์ ๋ฌด์จ ์๊ฐ์ ํ๊ณ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ค๋ฅธ ๋๋ผ์ด๋ฒ๊ฐ ๋ค๋ฅธ ์ ์ฉํ ์์ ์ ์ํํ์ง๋ง ์ ์ด ์ํ๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๊น?
@winstonewert ์๋์, ๊ณต๊ฒฉ์ผ๋ก
๋๋ ๋น์ ์ ์์ ์ ์ฌ๊ธฐ์์ ์ ๋ง๋ก ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์ฌ๊ฐ๊ฐ ์ด๋ฒคํธ ๋ก๊ทธ์ ํฌ์์ด๋ผ๊ณ ์ฃผ์ฅํ๋ ๊ฒ ๊ฐ์ต๋๊น? ํ์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค. ์ก์ ์ ์ฌ์ํ๋ฉด ๋ฌด์ฉ๋ด์ด ๋น๋๊ธฐ์ ์ด๋ฒคํธ์ ์์กดํ๋ ๊ฒฝ์ฐ ๋ฌด์ฉ๋ด์์ ๊ฐ์ ์์น์ ๋๋ฌํ์ง ์์ต๋๋ค. sagas๊ฐ redux์ ์ํ ์ ์ฅ์๋ ์ด๋ฒคํธ ๋ก๊ทธ์ ํ๋ก์ ์ ์ ์๋ ์ํ๋ฅผ ์์ฑํ๋ ๊ฒ์ ํผํ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์๋์. redux ์คํ ์ด๋ ํ๋ก์ ์ ์ด์ง๋ง saga๋ ํ๋ฒํ๊ณ ์ค๋๋ ๋จ์ํ ์ฒญ์ทจ์์ ๋๋ค.
saga(ํ๋ก์ธ์ค ๊ด๋ฆฌ์๋ผ๊ณ ๋ ํจ) ๋ ์๋ก์ด ๊ฐ๋ ์ด ์๋๋ฉฐ CQRS ์ธ๊ณ์์ ์์๋์์ผ๋ฉฐ ๊ณผ๊ฑฐ์ ๋ฐฑ์๋ ์์คํ ์์ ๋๋ฆฌ ์ฌ์ฉ๋์์ต๋๋ค.
saga๋ ์ด๋ฒคํธ ๋ก๊ทธ๋ฅผ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ํฌ์ํ๋ ๊ฒ์ด ์๋๋ผ ์์คํ ์์ ์ผ์ด๋๋ ์ผ์ ๋ฃ๊ณ ๋ฐ์์ ์์ฑํ ์ ์๋ ์ค์ผ์คํธ๋ ์ด์ ์ ์ผ๋ถ์ด๋ฉฐ ๋๋จธ์ง๋ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก saga๋ ์ด๋ฒคํธ ๋ก๊ทธ(๋ฐ ์๊ฐ๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ธ๋ถ ํญ๋ชฉ)๋ฅผ ์์ ํ๊ณ ์๋ก์ด ๋ช ๋ น/์ด๋ฒคํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋ํ ๋ฐฑ์๋ ์์คํ ์์ ์ด๋ฒคํธ๋ฅผ ์ฌ์ํ ๋ ์ผ๋ฐ์ ์ผ๋ก sagas์ ์ํด ํธ๋ฆฌ๊ฑฐ๋ ๋ถ์์ฉ ๋นํ์ฑํ๋ฅผ ๋นํ์ฑํํฉ๋๋ค.
์ฐจ์ด์ ์ ๋ฐฑ์๋ ์์คํ ์์ saga๋ ์ข ์ข ์ค์ ๋ก ์ด๋ฒคํธ ๋ก๊ทธ์ ํฌ์์ ๋๋ค. ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด ์ด๋ฒคํธ๋ฅผ ๋ด๋ณด๋ด๊ณ ์์ฒด์ ์ผ๋ก ์์ ํด์ผ ํฉ๋๋ค. ํ์ฌ ๊ตฌํ๋์ด ์๋ redux-saga์์๋ saga ์ํ๋ฅผ ๋ณต์ํ๊ธฐ ์ํด ์ด๋ฒคํธ ๋ก๊ทธ๋ฅผ ์ฌ์ํ๋ ๊ฒ์ด ๋ ์ด๋ ค์ธ ๊ฒ์ ๋๋ค.
์ฌ๊ธฐ์ ๋ฌด์จ ์๊ฐ์ ํ๊ณ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ค๋ฅธ ๋๋ผ์ด๋ฒ๊ฐ ๋ค๋ฅธ ์ ์ฉํ ์์ ์ ์ํํ์ง๋ง ์ ์ด ์ํ๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๊น?
์๋, ๊ทธ๊ฒ์ ์ ๊ฑฐํ๋ ๊ฒ์ด ์๋๋ผ ๋๋ถ๋ถ์ ๋ชฉ์ ์ ์ํด ๋ด๋ถ ๊ตฌํ ๋ฌธ์ ๋ก ๋ง๋๋ ๊ฒ์ ๋๋ค.
์คํ ์ด์ ๋๋ฉ์ธ ์ํ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด ํฐ ์น๋ฆฌ๋ผ๋ Redux ์ปค๋ฎค๋ํฐ์ ๊ฐ๋ ฅํ ํฉ์๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค(๊ทธ๋ ์ง ์์ผ๋ฉด Redux๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๊ฐ ๋ฌด์์ ๋๊น?). UI ์ํ๋ฅผ ๊ตฌ์ฑ ์์์ ์บก์ํํ๋ ๊ฒ๊ณผ๋ ๋์กฐ์ ์ผ๋ก UI ์ํ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด ์ ๋ฆฌํ๋ค๋ ํฉ์๋ ๋ค์ ์ ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ URL(redux-simple-router) ๋๋ ์์ ๋ฐ์ดํฐ์ ๊ฐ์ ์ ์ฅ์์ ๋ธ๋ผ์ฐ์ ์ํ๋ฅผ ๋๊ธฐํํ๋ ์์ด๋์ด๊ฐ ์์ต๋๋ค. ํ์ง๋ง ์ด๊ฒ์ ์คํ ์ด์ ์ฅ๊ธฐ ์คํ ํ๋ก์ธ์ค์ ์ํ/๋จ๊ณ๋ฅผ ์ ์ฅํ๋ ๋ง์ง๋ง ํ๋ก ํฐ์ด์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๊ฒ์ด ์ ์ ์ด๋ผ๋ฉด ์ ๊ฐ์ด์ง๋ง ๊ฐ๋ฐ์ ์ฌ์ฉ์ฑ์ด ์ข์ ๋งค์ฐ ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์๋ ๋ค์ ๊ธฐ๋ฅ์ด ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ ๋ ๋ฒ์งธ ์์ ์ ๋ํด์๋ redux-saga์ ๊ฝค ์ ์ฌํ ๊ฒ์ด ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. call
๋ํผ๋ก ๋ด๊ฐ ์๊ฐํ ๊ฒ๊ณผ ๊ฑฐ์ ๋น์ทํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฌด์ฉ๋ด์ ์ด๋ค ์๋ฏธ์์ ์ค๊ฐ ์ํ๋ก ์ญ์ง๋ ฌํํ ์ ์๋๋ก "๋นจ๋ฆฌ ๊ฐ๊ธฐ"๊ฐ ๊ฐ๋ฅํด์ผ ํฉ๋๋ค.
์ด๊ฒ์ ๋ชจ๋ ์ข ๋ฅ์ ์ด๋ ค์ด ์ฃผ๋ฌธ์ด์ง๋ง ์ค์ ๋ก๋ ์ง๋ ฌํ ๊ฐ๋ฅํ ํ๋์ ์ค์ ์์ ๋ ์ฝ๋๋ฅผ ๊ฐ๊ณ ์ ์ฒด ์ฑ์ ์ํ๋ฅผ ๋งค์ฐ ์ธ๋ถ์ ์ธ ์์ค์์ ์ถ์ ํจ์ผ๋ก์จ ํฐ โโ์น๋ฆฌ๋ฅผ ๊ฑฐ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก ํฐ ์น๋ฆฌ๊ฐ ์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ์ฉ์ ๋ฐ ์ฑ๋ฅ ๋ถ์์ผ๋ก ์ฑ์ ๊ณ์ธกํ๋ ํจ์ฌ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์์ํ๊ณ ์์ต๋๋ค. ๋ค๋ฅธ ํ์ ์์คํ ์ด ์ํ๋ฅผ ํตํด์๋ง ๊ฒฐํฉ๋๋ ์ ๋ง ๋๋ผ์ด ํ ์คํธ ๊ฐ๋ฅ์ฑ์ ์์ํ๊ณ ์์ต๋๋ค.
์ง๊ธ์ ๊ธธ์ ๋ฒ์ด ๋ฌ์ ์ ์์ผ๋ฏ๋ก ๊ทธ๋๋ก ๋๊ฒ ์ต๋๋ค. :)
@acjay ๋๋ ์ฐ๋ฆฌ๊ฐ ์ด๋ฌํ ์ ์ ๋ํด ๋น์ ๊ณผ ๋์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฌธ์ ๋ ์ด ๋ชจ๋ ๊ฒ์ ์ฌ๋ฐ๋ฅด๊ฒ ํด๊ฒฐํ๋ ์ด ๊ตฌํ์ ์ฐพ๋ ๊ฒ์ ๋๋ค :)
ํ์ง๋ง ์ ๋๋ ์ดํฐ๊ฐ ์๋ ํํํ API์ ์๊ฐ ์ฌํ ๋ฐ ์ํ ์ค๋ ์ท/๋ณต์ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒ ๋ชจ๋ ์ด๋ ค์ด ๊ฒ ๊ฐ์ต๋๋ค... ์ ๋๋ ์ดํฐ ์ํ๋ฅผ ์ฝ๊ฒ ๋ณต์ํ ์ ์๋๋ก ํจ๊ณผ์ ์คํ์ ๋ฉ๋ชจํ๋ ๊ฒ์ด ๊ฐ๋ฅํ ์๋ ์์ต๋๋ค...
ํ์คํ์ง ์์ง๋ง ์ด๊ฒ์ while(true) { ... }
์คํ์ผ์ ๋ฌด์ฉ๋ด์ ๋ฐฐ์ ํ ์ ์์ต๋๋ค. ๋ฃจํ๋ ์ํ ์งํ์ ๊ฒฐ๊ณผ์ผ ๋ฟ์
๋๊น?
@acjay @slorber
๋ด๊ฐ (https://github.com/yelouafi/redux-saga/issues/22#issuecomment-168872101)์์ ์ค๋ช ํ๋ฏ์ด sagas์์๋ ํผ์ (์ฆ, ํซ ๋ฆฌ๋ก๋ ์์ด) ์๊ฐ ์ฌํ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ฌ๊ฐ๋ฅผ ํน์ ์ง์ ์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ ์ํด ํ์ํ ๊ฒ์ ์์๋ถํฐ ํด๋น ์ง์ ๊น์ง์ ์ผ๋ จ์ ํจ๊ณผ์ ๊ฒฐ๊ณผ(ํด๊ฒฐ ๋๋ ๊ฑฐ๋ถ)๋ฟ์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํด๋น ์ํ์ค๋ก ๋ฐ์ ๊ธฐ๋ฅผ ๊ตฌ๋ํฉ๋๋ค.
์ค์ ๋ง์คํฐ ๋ธ๋์น์์(์์ง npm์ ์ถ์๋์ง ์์). Sagas๋ ๋ชจ๋ํฐ๋ง์ ์ง์ํ๋ฉฐ ๋ชจ๋ ์ฐ์ถ ํจ๊ณผ์ ๊ฒฐ๊ณผ๋ฅผ ์์ ์ ์ ๋ฌํฉ๋๋ค. ๋ํ ์ ์ด ํ๋ฆ ๊ทธ๋ํ๋ฅผ ์ถ์ ํ๊ธฐ ์ํ ๊ณ์ธต ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ทธ ํจ๊ณผ ๋ก๊ทธ๋ ์ฃผ์ด์ง ์์ ๊น์ง Saga๋ฅผ ์ฌ์ํ๊ธฐ ์ํด ์ ์ฉ๋ ์ ์์ต๋๋ค. ๋ก๊ทธ์ ์ด๋ฏธ ๊ณผ๊ฑฐ ์๋ต์ด ํฌํจ๋์ด ์์ผ๋ฏ๋ก ์ค์ API ํธ์ถ์ ํ ํ์๊ฐ ์์ต๋๋ค.
repo ์์ ์๋ saga ๋ชจ๋ํฐ ์ {type: 'LOG_EFFECT'}
์ ์์ ์ ์ ๋ฌํ์ฌ ํ๋ฆ์ ์ถ์ ์ ์ธ์ํ ์ ์์ต๋๋ค.
๋ค์์ ๋น๋๊ธฐ ์์ ์ ํจ๊ณผ ๋ก๊ทธ ์บก์ฒ์ ๋๋ค.
ํธ์ง: ์ฃ์กํฉ๋๋ค ๊ณ ์ ์ด๋ฏธ์ง ๋งํฌ
ํฅ๋ฏธ๋กญ๋ค! ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ฐ๋ฐ ๋๊ตฌ ์ด๋ฏธ์ง๋ _awesome_์ ๋๋ค.
๋ฉ์ง๋ค์ :)
์ฌ์ค, ๊ทธ ์ฌ๊ฐ ๋ชจ๋ํฐ๋ ๊ฝค ๋ฉ์ง๋ค.
์๊ฐํด๋ณด๋ฉด ์ฌ๊ฐ๋ ๋ ๊ฐ์ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฒซ์งธ, ๋น๋๊ธฐ ํจ๊ณผ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ๋์งธ, ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฆฌ๋์์์ ์์ผ๋ก ์ด ๋ถ์พํ ์ํ ๋จธ์ ์ด ํ์ํ์ ๋ณต์กํ ์ํ ์ํธ ์์ฉ์ ์ฒ๋ฆฌํฉ๋๋ค.
๋ด ์ ๊ทผ ๋ฐฉ์์ ์ฒซ ๋ฒ์งธ ๋ฌธ์ ๋ง ๋ค๋ฃน๋๋ค. ๋ ๋ฒ์งธ ๋ฌธ์ ์ ๋ํ ํ์์ฑ์ ์ฐพ์ง ๋ชปํ์ต๋๋ค. ์๋ง๋ ๋๋ ์์ง ์คํํ๊ธฐ์ ์ถฉ๋ถํ redux ์ฝ๋๋ฅผ ์์ฑํ์ง ์์์ ๊ฒ์ ๋๋ค.
์, ํ์ง๋ง ๋ ๊ฐ์ง ์์ด๋์ด๋ฅผ ์ตํฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋์ง ๊ถ๊ธํฉ๋๋ค. redux-saga์ call
๋ํผ๋ ํจ๊ณผ์ ๋ํ ๋งค์ฐ ๊ฐ๋จํ ์์ค์ ๊ฐ์ ์ฐธ์กฐ์ด์ง๋ง ๋ค์ํ ์ ํ์ ํจ๊ณผ์ ๋ํ ๋๋ผ์ด๋ฒ๋ก ๋ฏธ๋ค์จ์ด๋ฅผ ์ด๊ธฐํํ ์ ์๋ค๊ณ ๊ฐ์ ํ๋ฉด ํด๋น ํจ๊ณผ๋ฅผ ํจ์์์ ๋ถ๋ฆฌ๋ JSONable ๋ฐ์ดํฐ๋ก ๋ํ๋ผ ์ ์์ต๋๋ค. ์ค์ ๋ก ํธ์ถ๋๋ ๊ฒ์
๋๋ค. ๋๋ผ์ด๋ฒ๋ ๊ธฐ๋ณธ ์ํ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฅ์๋ก ์ ๋ฌํ๋ ์ธ๋ถ ์ฌํญ์ ์ฒ๋ฆฌํฉ๋๋ค.
์ค์ ์ ์ธ ์ด์ ์ ๊ฑฐ์ ์์ง๋ง ๋ณต์ก์ฑ์ด ๋ง์ด ์ถ๊ฐ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ์๊ฐ์ ์ ์ ๋๊น์ง ๋ฐ๋ฅด๋ ค๊ณ ํฉ๋๋ค.
์ข์, ๋๋ ๋ ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ๊ทธ๊ฒ์ ์ฌ์ฉํ๊ธฐ ์ํด ์ค์ ์์ ๋ฅผ ์ด์ํ๋ค.
์ฒซ์งธ, ๋ฐ์ ๊ตฌํ์ด ์์ต๋๋ค.
https://github.com/winstonewert/redux-reactions/blob/master/src/index.js
์ธํฐํ์ด์ค๋ ์ธ ๊ฐ์ง ๊ธฐ๋ฅ์
๋๋ค. startReactions๋ ์ ์ฅ์, ๋ฐ์ ๊ธฐ๋ฅ ๋ฐ ์ด๋ฆ์์ ๋๋ผ์ด๋ฒ๋ก์ ๋งคํ์ ์ทจํฉ๋๋ค. fromEmitter์ fromPromiseFactory๋ ๋ชจ๋ ๋๋ผ์ด๋ฒ๋ฅผ ์์ฑํฉ๋๋ค.
์ฌ๊ธฐ์์ ์์ ๋ ์์คํ
์ ํ์ฑํํ๊ธฐ ์ํด startReactions๋ฅผ ํธ์ถํฉ๋๋ค:
https://github.com/winstonewert/redux-reactions/blob/master/examples/real-world/store/configureStore.dev.js#L28
๋ฐ์์ ๊ธฐ๋ณธ ๊ตฌ์ฑ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
https://github.com/winstonewert/redux-reactions/blob/master/examples/real-world/reactions/index.js.
๋ฐ์ ํจ์๋ ์ค์ ๋ก ํด๋น ํ์ด์ง์ ๋ํด ์ค์ ๋ก ํ์ํ ๋ฐ์์ ํ์
ํ๊ธฐ ์ํด ๋ฐ์() ํจ์๊ฐ ์๋ ๊ตฌ์ฑ ์์๋ฅผ ์ฐพ๋ ๋ฐ์ ๋ผ์ฐํฐ ์ธ์คํด์คํ ๊ตฌ์ฑ ์์๋ฅผ ๋ฐ๋ณตํฉ๋๋ค.
github api ๋ฐ์ ์ ํ์ ๊ตฌํ์ https://github.com/winstonewert/redux-reactions/blob/master/examples/real-world/reactions/api.js์ ๋๋ค. ์ด๊ฒ์ ๋๋ถ๋ถ ์๋ณธ ์์ ์์ ์ฌ์ฉ๋ ๋ฏธ๋ค์จ์ด์์ ๋ณต์ฌ/๋ถ์ฌ๋ฃ๊ธฐ์ ๋๋ค. ์ค์ํ ์ ์ https://github.com/winstonewert/redux-reactions/blob/master/examples/real-world/reactions/api.js#L79 ์ ๋๋ค . ์ฌ๊ธฐ์ fromPromiseFactory๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์์ ์ํํ๋ ํจ์์์ ๋๋ผ์ด๋ฒ๋ฅผ ์์ฑํฉ๋๋ค. ์ฝ์์ ๋ฐํํฉ๋๋ค.
๊ตฌ์ฑ ์์๋ณ ๋ฐ์ ๊ธฐ๋ฅ์ https://github.com/winstonewert/redux-reactions/blob/master/examples/real-world/containers/RepoPage.js#L80์์ ํ์ธํ์ธ์.
๋ฐ์ ์์ฑ์์ ๊ณตํต ๋ ผ๋ฆฌ๋ https://github.com/winstonewert/redux-reactions/blob/master/examples/real-world/reactions/data.js ์
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ! Raise๋ Elm ์ํคํ ์ฒ์ ์ ์ฌํ ํจ๊ณผ ์์คํ ๋ ์ฌ์ฉํ ์ ์๋ ์คํ ์ด ์ธํธ์๋ฅผ ์ถ์ํ์ต๋๋ค! ์์ผ๋ก ์ปค๋ฎค๋ํฐ์ ๋ชจ๋ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๊ธฐ ์ํด ์ด๋ฌํ ๋ชจ๋ ์ ๊ทผ ๋ฐฉ์์ ๋ฐฐ์ฐ๊ณ ๊ฐ์ ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
ํ ๋ก ์ ๊ด์ฌ์ด ์๋ ์ฌ๋์ ์ฌ๊ธฐ์์ ๋ด ์์ด๋์ด์ ๋ํ ์ถ๊ฐ ํ ๋ก ์ ๋ณผ ์ ์์ต๋๋ค. https://github.com/winstonewert/redux-reactions/issues/7
์ฌ๊ธฐ์์ ๋ด ํจํด์ ์ฌ์ฉํ์ฌ ๋ elmish๊ฐ ๋๋๋ก ์นด์ดํฐ ์ฑ์ ์ฌ์์
ํ ๋ถ๊ธฐ๋ฅผ ๋ณผ ์๋ ์์ต๋๋ค.
https://github.com/winstonewert/redux-reactions/tree/elmish/examples/counter
๋๋ ๋ํ ์ฌ๊ธฐ์์ ์ฌ์ฉ๋ ์ ๊ทผ ๋ฐฉ์์ ์ฌ๋ฐ๋ช ํ๊ณ ์๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค: https://github.com/ccorcos/elmish
@yelouafi , ์ฌ๊ฐ ๋ชจ๋ํฐ ์์ด๋์ด์ ๋ํ ๋งํฌ๋ฅผ ๋ค์ ๊ฒ์ํ ์ ์์ต๋๊น? ์ ๋ง ์ข์ ๋ฌผ๊ฑด์ ๋๋ค! ๋งํฌ๊ฐ ์ฃฝ์ ๊ฒ ๊ฐ์ต๋๋ค(404). ๋ ๋ณด๊ณ ์ถ์ด์!
๊ด๋ จ ์๋ก์ด ํ ๋ก : https://github.com/reactjs/redux/issues/1528
(๊ด๋ จ๋ ๊ฒ ๊ฐ์์. ์๋ชป๋ ๊ณณ์ด๋ผ๋ฉด ์ฃ์กํฉ๋๋ค.)
๋ชจ๋ ํจ๊ณผ๋ฅผ DOM ๋ ๋๋ง๊ณผ ๋์ผํ๊ฒ ์ทจ๊ธํ ์ ์์ต๋๊น?
jQuery
๋ ๋ช
๋ นํ ์ธํฐํ์ด์ค๊ฐ ์๋ DOM ๋๋ผ์ด๋ฒ์
๋๋ค. React๋ ์ ์ธ์ ์ธํฐํ์ด์ค๊ฐ ์๋ DOM ๋๋ผ์ด๋ฒ์
๋๋ค. ๋ฐ๋ผ์ "๊ทธ ๋ฒํผ์ ๋นํ์ฑํํ์ญ์์ค"๋ผ๊ณ ๋ช
๋ นํ๋ ๋์ "์ ๋ฒํผ์ ๋นํ์ฑํํด์ผ ํฉ๋๋ค"๋ผ๊ณ ์ ์ธํ๊ณ ๋๋ผ์ด๋ฒ๊ฐ ์ํํ DOM ์กฐ์์ ๊ฒฐ์ ํฉ๋๋ค. " GET \product\123
"๋ฅผ ์ฃผ๋ฌธํ๋ ๋์ "์ฐ๋ฆฌ๋ ํด๋น ๋ฐ์ดํฐ๊ฐ ํ์ํฉ๋๋ค"๋ผ๊ณ ์ ์ธํ๊ณ ๋๋ผ์ด๋ฒ๋ ๋ณด๋ด๊ฑฐ๋ ์ทจ์ํ ์์ฒญ์ ๊ฒฐ์ ํฉ๋๋ค.<button ...>
- "์ผ๋ฐ" React ๊ตฌ์ฑ ์์์์ View ๋ ์ด์ด๋ฅผ ๋น๋ํฉ๋๋ค.<Map ...>
- "๋ํผ" ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ช
๋ นํ ์ธํฐํ์ด์ค๋ฅผ ์ ์ธ์ ์ธํฐํ์ด์ค๋ก ์ ํํฉ๋๋ค. "์ผ๋ฐ" ๊ตฌ์ฑ ์์์ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ์ง๋ง ๋ด๋ถ์ ์ผ๋ก๋ ์ค์ ๋ก ๋๋ผ์ด๋ฒ์
๋๋ค.<Chart ...>
- ๊ตฌํ์ ๋ฐ๋ผ ์ ์ค ํ๋์ผ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ "์ผ๋ฐ" ๊ตฌ์ฑ ์์์ ๋๋ผ์ด๋ฒ ๊ฐ์ ๊ฒฝ๊ณ๋ ์ด๋ฏธ ๋ชจํธํฉ๋๋ค.<Http url={'/product/'+props.selectedProductId} onSuccess={props.PRODUCT_LOADED} />
(๋๋ "์ค๋งํธ" <Service...>
) - (UI๊ฐ ์๋) ๋๋ผ์ด๋ฒ ๊ตฌ์ฑ ์์์์ ์๋น์ค ๊ณ์ธต์ ๊ตฌ์ถํฉ๋๋ค.๋ณด๊ธฐ ๋ฐ ์๋น์ค ๊ณ์ธต์ ๋ชจ๋ React ๊ตฌ์ฑ ์์๋ฅผ ํตํด ์ค๋ช
๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ์ ์ต์์(์ฐ๊ฒฐ๋) ๊ตฌ์ฑ ์์๋ ๊ทธ๊ฒ๋ค์ ์๋ก ๋ถ์
๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋ฆฌ๋์๊ฐ ์์ํ๊ฒ ์ ์ง๋๊ณ ํจ๊ณผ๋ฅผ ์ฒ๋ฆฌํ๋ ์๋ก์ด ์๋จ์ ๋์
ํ์ง ์์ต๋๋ค.
new Date
๋๋ Math.random
๊ฐ ์ฌ๊ธฐ์ ๋ง๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋ช
๋ นํ API๋ฅผ ์ ์ธ์ API๋ก ๋ณํํ๋ ๊ฒ์ด ํญ์ ๊ฐ๋ฅํฉ๋๊น?
์ด๊ฒ์ด ์คํ ๊ฐ๋ฅํ ๊ฒฌํด๋ผ๊ณ ์๊ฐํ์ญ๋๊น?
๊ฐ์ฌ ํด์
๋น๋๊ธฐ ์์ ์ ์ํ saga ๋ฐ ๊ธฐํ ๋ฉ์ง ๋๊ตฌ๊ฐ ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ ์ง๊ธ ์์ ํ๊ฒ ์ข ๋ฃํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. #1528์์ ๋ช ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ์๋ก์ด ๋ฐฉํฅ์ ํ์ธํ์ธ์(๋น๋๊ธฐ ๋ฟ๋ง ์๋๋ผ).
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋๋ redux์์ ๋ถ์์ฉ์ ์ฒ๋ฆฌํ๋ ๋์์ ์ธ ๋ฐฉ๋ฒ์ ๋ํด ๋ง์ด ์๊ฐํ๊ณ ์์ผ๋ฉฐ ํ์ฌ ์ ๊ทผ ๋ฐฉ์์์ ๋ณผ ์ ์๋ ๋ช ๊ฐ์ง ๋ฌธ์ ์ ์ด๊ฒ์ด ์ ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ์๊ฐํ๋์ง ๋ธ๋ ์ธ ๋คํํ ๋ ์ค๋ ๋๋ฅผ ๊ฐ๋ก์ฑ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๊ฒ๋ณด๊ธฐ์ ๋จ์ํจ์๋ ๋ถ๊ตฌํ๊ณ ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ผ๋ก ํฐ ๋ฐ๊ฑธ์์ ๋ด๋๋ ์ต๋๋ค.
์ก์ ํฌ๋ฆฌ์์ดํฐ์ ๋ถ์์ฉ ๋ฌธ์
์์ ํจ์ํ ์ธ์ด์์ ๋ถ์์ฉ์ ํญ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฐ์ฅ์๋ฆฌ๋ก ๋ค์ด ์ฌ๋ ค์ง๊ณ ์คํ์ ์ํด ๋ฐํ์์ผ๋ก ๋ฐํ๋ฉ๋๋ค. Elm์์ ๋ฆฌ๋์๋ ์๋ก์ด ์ํ์ ์คํ๋์ด์ผ ํ๋ ํจ๊ณผ๋ฅผ ํฌํจํ๋ ํํ์ ๋ฐํํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด ์๋ช ์ด ์๋ ๋ฉ์๋๋ ์์ง ๋ค๋ฅธ redux ๋ฆฌ๋์๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
redux์์ ๋ถ์์ฉ์ ์ํํ ์ ์๋ ๋ช ๋ฐฑํ(ํ์ง๋ง ๊ฐ์ฅ ์ข์ ๊ฒ์ ์๋) ์์ ์์ฑ์๊ฐ ๋์์ผ๋ฉฐ ์ด ํจํด์ ์ง์ํ๊ธฐ ์ํด ์ฌ๋ฌ ๋ค๋ฅธ ๋ฏธ๋ค์จ์ด ์ต์ ์ด ๊ฐ๋ฐ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์ฌ์ ๋ฏธ๋ค์จ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ฆฌ๋์์ ์ผ๊ธ ๊ฐ๋ ์ผ๋ก ๋ถ์์ฉ์ ๋ฐํํ ์ ์๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ฐ๊น๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฌ๋๋ค์ ์ฌ์ ํ โโredux๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์ง ๊ฒ์ ๋ง๋ค๊ณ ์์ผ๋ฉฐ ํฐ ์ง์ ์ ์ด๋ฃจ๊ณ ๋๋ถ๋ถ์ ๋์๋ณด๋ค ํจ์ฌ ๊ฐ๋จํ๊ณ ์ค์ฉ์ ์ด์ง๋ง, ์ก์ ์ ์์ ๋ด๋ถ์์ ๋ถ์์ฉ์ด ๋ฐ์ํ๋ ๋ฐ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์์์ ์ํ๊ฐ ์จ๊ฒจ์ง
์นด์ดํฐ ์์ฉ ํ๋ก๊ทธ๋จ์์ incrementAsync๋ ์๊ฐ ์ด๊ณผ๋ฅผ ์์ฑํ๊ณ ์๋ฃ ์์๋ง ์์ฉ ํ๋ก๊ทธ๋จ ์ํ๊ฐ ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ฆ๋ถ ์์ ์ด ์งํ ์ค์ด๋ผ๋ ์๊ฐ์ ํ์๊ธฐ๋ฅผ ํ์ํ๋ ค๋ ๊ฒฝ์ฐ ๋ณด๊ธฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ํ์์ ์ด๋ฅผ ์ ์ถํ ์ ์์ต๋๋ค. ์ด ์ํ๋ ์์์ ์ด๋ฉฐ ์จ๊ฒจ์ ธ ์์ต๋๋ค.
๋๋๋ก ์ฐ์ํ๊ธด ํ์ง๋ง ์์์ ์ํ๊ฐ ์จ๊ฒจ์ ธ ์๊ณ ์ฝ๊ฒ ์ง๋ ฌํํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ฑ๊ธฐ๋ฅผ ์์ ์์ฑ์์ ์กฐ์ ์ ๋ก ์ฌ์ฉํ๋
redux-thunk ๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ ์ฌ์ฉํ๋ฉด ์ฆ๊ฐ ์์ ์ด ์์๋๊ณ ์๋ฃ๋ ๋ ์ด๋ฅผ ์๋ฆฌ๋ ์ฌ๋ฌ ๋ฉ์์ง๋ฅผ ๊ฐ์๊ธฐ์ ๋ณด๋ผ ์ ์์ง๋ง ์ด๋ ๋ค๋ฅธ ๋ฌธ์ ์ธํธ๋ฅผ ์์ฑํฉ๋๋ค.
ํจ๊ณผ๊ฐ ์๋ฃ๋ ํ ์ฆ๊ฐ ์์ ์ด ์งํ ์ค์ธ ๊ฒ์ผ๋ก ํ์๋๋ ์ง์ ์ผ๋ก ์ํ๋ฅผ ๋๊ฐ๋ ๊ฒ์ ์ค์ ๋ก ๋ถ์์ฉ์ ์ฌ์์ฑํ์ง ์์ผ๋ฏ๋ก ๋ฌด๊ธฐํ ์งํ ์ํ๋ก ์ ์ง๋ฉ๋๋ค.
๊ทํ์ ์ ์์ด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ๋ถ์์ฉ์ ์ํ์์ ์์ฑ๋๊ธฐ ๋๋ฌธ์ ์๋๋ ์ด๋ค ํํ๋ก๋ ๊ฒฐ๊ณผ ์ํ๋ก ํํ๋์ด์ผ ํ๋ฏ๋ก ์ ์ฅ์๋ฅผ ์์ ์ด ์์๋ ์ด์ ์ํ๋ก ๋๋๋ฆฌ๋ฉด ๋ฐ์์ ํจ๊ณผ๋ฅผ ๋ค์ ์์ํ๋ ๋์ ํจ๊ณผ๋ฅผ ๋ค์ ์์ํฉ๋๋ค. ์ํ๋ฅผ ๋ฆผ๋ณด ์ํ๋ก ๋์ญ์์ค.
๋น์ฆ๋์ค ๋ก์ง์ ๋ณต์
์ ํ๋ฆฌ์ผ์ด์ ์ด ํน์ ์ํ์ผ ๋๋ง ์ก์ ์ด ๋ถ์์ฉ์ ์ผ์ผํค๋ ๊ฒ์ ๋น์ฐํ๋ค. redux์์ ์ก์ ์์ฑ์๊ฐ ์ํ๋ฅผ ์๊ตฌํ๋ค๋ฉด ๊ทธ๊ฒ์ ๋จ์ํ๊ณ ์์ํ ํจ์์ด๊ฑฐ๋ ๋ช ์์ ์ผ๋ก ์ํ์ ํจ๊ป ์ ๊ณต๋์ด์ผ ํฉ๋๋ค.
๊ฐ๋จํ ์๋ก, ์์ ์นด์ดํฐ ์์ฉ ํ๋ก๊ทธ๋จ์ผ๋ก ์์ํ์ฌ ์นด์ดํฐ๊ฐ 5์ ๋ฐฐ์์ผ ๋๋ง๋ค ์นด์ดํฐ๋ฅผ ์์์ ๊ธ๊ผด ์์์ผ๋ก ๋ณ๊ฒฝํ๋ ค๊ณ ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
๋์ ์์ฑ์ ์์ํ์ง ์์ผ๋ฏ๋ก ์ด ๋์์ ๋๋ ์ ์๋ ์์น๋ ์์ ์์ฑ์์ ๋๋ค. ๊ทธ๋ฌ๋ ์นด์ดํฐ, ์ฆ๋ถ, ๊ฐ์, incrementAsync, incrementIfOdd(์ด ๊ฒฝ์ฐ ์์ ํ ํ์๊ฐ ์์) ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ๋ช ๊ฐ์ง ๋ค๋ฅธ ์์ ์ด ์์ต๋๋ค.
์ด์ ์ ์ฆ๊ฐ ๋ฐ ๊ฐ์๋ ์ด์ ์ ๊ฐ์๊ธฐ์์ ์ฒ๋ฆฌ๋์์ผ๋ฏ๋ก ํ์ฌ ๊ฐ์ ์ก์ธ์คํ ์ ์์๊ธฐ ๋๋ฌธ์ ์ํ๊ฐ ํ์ํ์ง ์์์ง๋ง ๊ฐ์๊ธฐ๋ ๋ถ์์ฉ(๋์ ์์ฑ)์ ๊ฐ์ง๊ฑฐ๋ ๋ฐํํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด์ ์ด๋ฌํ ํจ์๋ ์๋ก์ด ์์์ ๊ธ๊ผด ์์์ ์ ํํด์ผ ํ๊ณ ์ด ๋ ผ๋ฆฌ๋ฅผ ๋ชจ๋ ๋์ ์กฐ์น ์์ฑ์์์ ๋ณต์ ํด์ผ ํ๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ํ์ฌ ์นด์ดํฐ ๊ฐ์ ์์์ผ ํฉ๋๋ค.
ํ์ฌ ์ํ๋ฅผ ๋ช ์์ ์ผ๋ก ์ ๊ณตํ๋ ํ ๊ฐ์ง ๊ฐ๋ฅํ ๋์์ redux-thunk๋ฅผ ์ฌ์ฉํ๊ณ ํ์ฌ ์ํ์ ์ก์ธ์คํ๊ธฐ ์ํด ์ฝ๋ฐฑ์ ๋ฐํํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํ์ฌ ๊ฐ์ ์ ๊ณตํ๊ธฐ ์ํด ์์ฑ๋ ๋ชจ๋ ์ฅ์ ์์ ์ ์์ ํ๋ ๊ฒ์ ํผํ ์ ์์ง๋ง ์ด์ ์์ ์์ฑ์๋ ์ ์ญ ์์ฉ ํ๋ก๊ทธ๋จ ์ํ์์ ๊ฐ์ด ์ ์ฅ๋ ์์น๋ฅผ ์์์ผ ํ๋ฉฐ ์ด๋ ๋์ผํ ์์ฉ ํ๋ก๊ทธ๋จ ๋๋ ์ํ๊ฐ ๋ค๋ฅด๊ฒ ๊ตฌ์ฑ๋ ์ ์๋ ๋ค๋ฅธ ์์ฉ ํ๋ก๊ทธ๋จ์์.
์ปจํ ์คํธ ๊ฐ์ ๋ฐ/๋๋ ์ข ์์ฑ์ ์ฌ์ฌ์ฉ์ฑ์ ๊ฐ์์ํต๋๋ค.
์นด์ดํฐ ์์ ๋ฅผ ๋ค์ ๋ฐฉ๋ฌธํ๋ฉด ์นด์ดํฐ ์ธ์คํด์ค๊ฐ ํ๋๋ง ์์์ ์ ์ ์์ต๋๋ค. ๋์ผํ ์ํ๋ฅผ ๋ณด๊ฑฐ๋ ์ ๋ฐ์ดํธํ๋ ๋ง์ ์นด์ดํฐ๊ฐ ํ์ด์ง์ ์๋ ๊ฒ์ ์ฝ์ง๋ง ๊ฐ ์นด์ดํฐ๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ์ฌ์ฉํ๋๋ก ํ๋ ค๋ฉด ์นด์ดํฐ๋ฅผ ์ถ๊ฐ๋ก ์์ ํด์ผ ํฉ๋๋ค.
์ด๊ฒ์ ๊ฐ์๊ธฐ ๋ฐ ๊ตฌ์ฑ ์์ ํฅ์๊ธฐ๋ก ์ผ๋ฐ ๋ชฉ๋ก์ ๋ง๋๋ ๋ฐฉ๋ฒ ์ด์ ์ ๋ ผ์๋์์ต๋๋ค
์นด์ดํฐ๊ฐ ๋จ์ ์์ ์ ํ๋ง ์ฌ์ฉํ๋ค๋ฉด ๋๋ฆ ๋๋ฌด ์ํคํ ์ฒ ๋ฅผ ์ ์ฉํ๋ ๊ฒ์ ๋น๊ต์ ๊ฐ๋จํฉ๋๋ค.
์ด ๊ฒฝ์ฐ ๋ถ๋ชจ๋ ๋จ์ํ ์ก์ ์์ฑ์ ๋๋ ๋์คํจ์ฒ๋ฅผ ๋ํํ์ฌ ํ์ํ ์ปจํ ์คํธ๋ก ๋ฉ์์ง๋ฅผ ๋ณด๊ฐํ ๋ค์ ํ์งํ๋ ์ํ๋ก ์ง์ ๋ฆฌ๋์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
React Elmish ์์ ๊ฐ ์ธ์์ ์ผ๋ก
incrementIfOdd๋ ํ์ฌ ์ํ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ๋ฏธ๋ค์จ์ด์ ์์กดํ๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ํ ๋ด์์์ ์์น๋ฅผ โโ์์์ผ ํฉ๋๋ค.
incrementAsync๋ ๊ฒฐ๊ตญ ๋ถ๋ชจ ๊ตฌ์ฑ ์์์ ๋ ธ์ถ๋์ง ์์ผ๋ฏ๋ก ์ถ๊ฐ ์ปจํ ์คํธ๋ก ๋ํํ ์ ์๋ ์ฆ๋ถ ์์ ์ ์ง์ ์ ๋ฌํฉ๋๋ค.
๊ทํ์ ์ ์์ด ์ด ๋ฌธ์ ๋ฅผ ์ง์ ํด๊ฒฐํ์ง๋ ์์ง๋ง incrementAsync๊ฐ ์ํ๋ฅผ
{counter: 0, incrementAfterDelay: 1000}
๋ก ๋ณ๊ฒฝํ์ฌ ์คํ ์ด ๋ฆฌ์ค๋์์ ๋ถ์์ฉ์ ์ ๋ฐํ๋ ๊ฐ๋จํ ์์ ์ผ๋ก ๊ตฌํ๋ ๊ฒฝ์ฐ incrementAsync๋ ๊ฐ๋จํ ๋ฉ์์ง๊ฐ ๋ฉ๋๋ค. incrementIfOdd๋ ์์ํ๋ฏ๋ก ๊ฐ์๊ธฐ์์ ๊ตฌํํ๊ฑฐ๋ ๋ช ์์ ์ผ๋ก ์ํ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.... ๋ฐ๋ผ์ ์ํ๋ ๊ฒฝ์ฐ elm ์ํคํ ์ฒ๋ฅผ ๋ค์ ์ ์ฉํ ์ ์์ต๋๋ค.๋ถ์์ฉ์ด ์๋ ์ก์ ์ ์์๋ ํ ์คํธํ๊ธฐ ์ด๋ ต์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ๋ถ์์ฉ์ ํ ์คํธํ๊ธฐ๊ฐ ๋ ์ด๋ ค์ธ ๊ฒ์ด๋ผ๋ ๊ฒ์ด ๋งค์ฐ ๋ถ๋ช ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ผ๋จ ๋ถ์์ฉ์ด ํ์ฌ ์ํ์ ๋น์ฆ๋์ค ๋ ผ๋ฆฌ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ฉด ํ ์คํธ๊ฐ ๋ ์ด๋ ค์ธ ๋ฟ๋ง ์๋๋ผ ๋ ์ค์ํด์ง๋๋ค.
๊ทํ์ ์ ์์ ํตํด ์ํ ์ ํ์ด ์ค์ ๋ก ์ด๋ค ๋ฐ์๋ ์คํํ์ง ์๊ณ ์ํ๋ ๋ฐ์์ ํฌํจํ๋ ์ํ๋ฅผ ์์ฑํ๋ค๋ ํ ์คํธ๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์์ต๋๋ค. ๋ฐ์์ ๋ํ ์กฐ๊ฑด๋ถ ์ํ๋ ๋น์ฆ๋์ค ๋ก์ง์ด ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ํ ์คํธํ๊ธฐ ๋ ์ฝ์ต๋๋ค.
์ต์ ํํ๊ฑฐ๋ ์ผ๊ด ์ฒ๋ฆฌํ ์ ์์
John A De Goes์ ์ต๊ทผ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ํจ๊ณผ๋ฅผ ํํํ๊ธฐ ์ํ IO ๋๋ ํ์คํฌ์ ๊ฐ์ ๋ถํฌ๋ช ํ ๋ฐ์ดํฐ ์ ํ์ ๋ฌธ์ ์ ๋ํด ๋ ผ์ํ์ต๋๋ค. ๋ถํฌ๋ช ํ ์ ํ๋ณด๋ค ๋ถ์์ฉ์ ๋ํ ์ ์ธ์ ์ค๋ช ์ ์ฌ์ฉํ๋ฉด ๋์ค์ ํจ๊ณผ๋ฅผ ์ต์ ํํ๊ฑฐ๋ ๊ฒฐํฉํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
FP๋ฅผ ์ํ ํ๋ ์ํคํ ์ฒ
์ฝํฌ, ์ฝ์ ๋ฐ ์์ฑ๊ธฐ๋ ๋ถํฌ๋ช ํ๋ฏ๋ก ์ผ๊ด ์ฒ๋ฆฌ ๋ฐ/๋๋ ์ค๋ณต API ํธ์ถ ์ต์ ์ ๊ฐ์ ์ต์ ํ๋
fetchPostsIfNeeded
์ ์ ์ฌํ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ช ์์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.๊ทํ์ ์ ์์
fetchPostsIfNeeded
์ ๊ฑฐreactions
๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ฒ์ด ์์ ํ ์คํ ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ต๋๋ค.๋ด ๊ตฌํ
๋๋ ์ต๊ทผ์ ์๋ก์ด ์ํ๋ฅผ ๋ฐํํ๋ ๋ฆฌ๋์๋ฅผ ๋ง๋ค ์ ์๋ redux ์
๊ธฐ์กด ๋ฆฌ๋์ ์ฝ๋์์ ํธํ์ฑ์ ์ ์งํ๊ธฐ ์ํด ๊ธฐ์กด ๋ฆฌ๋์์ ๋ํ ํจ๊ณผ๋ฅผ ๋์ด๊ธฐ ์ํด compose ๋ฐ CombineReducers๋ฅผ ์์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ redux๋ฅผ ๋ถ๊ธฐํ์ง ์๊ณ ์ด ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ํ์ ํ์ง ๋ชปํ์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ทํ์ ์ ์์ redux๋ฅผ ์์ ํ ํ์๊ฐ ์๋ค๋ ์ ์์ ๊ฝค ์ข์ต๋๋ค. ๋ํ ๊ทํ์ ์๋ฃจ์ ์ด ์์์ ์๋ ์ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋ ๋์ ์์ ์ ์ํํ๊ณ ๊ฒฐ๊ณผ ๋ฐ์์ ๊ฒฐํฉํ๊ฑฐ๋ ์ต์ ํํ๊ธฐ๊ฐ ๋ ์ฌ์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์์ฝ
React๊ฐ "๋จ์ง UI"์ด๊ณ ์ค์ ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ์ ์ฅํ๊ฑฐ๋ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ทธ๋ค์ง ๊ท๋ฒ์ ์ด์ง ์์ ๊ฒ์ฒ๋ผ Redux๋ ๋๋ถ๋ถ "๊ทธ๋ฅ ์์ "์ด๋ฉฐ ๋ถ์์ฉ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ทธ๋ค์ง ๊ท๋ฒ์ ์ด์ง ์์ต๋๋ค.
๋๋ ์ค์ฉ์ ์ด๊ณ ์์ ์ ์๋ฃํ ์ฌ๋์ ํํ์ง ์์ผ๋ฉฐ redux์ ๋ฏธ๋ค์จ์ด์ ๋ํ ๋ง์ ๊ธฐ์ฌ์๋ค์ ์ฌ๋๋ค์ด ์ด์ ๋ณด๋ค ๋ ๋น ๋ฅด๊ณ ๋ ๋์ ์ ๋ง ๋ฉ์ง ๊ฒ์ ๋ง๋ค ์ ์๊ฒ ํด์ฃผ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ๊น์ง ์ฌ ์ ์์๋ ๊ฒ์ ๊ทธ๋ค์ ๊ณตํ ๋๋ถ์ ๋๋ค. ๊ณตํํ ๋ชจ๋ ๋ถ๋ค๊ป ํนํ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
Redux๋ ๊ต์ฅํฉ๋๋ค. ์ด๊ฒ๋ค์ Redux ์์ฒด์ ํ์ ๋ฌธ์ ๋ ์๋์ง๋ง ํ์ฌ ์ํคํ ์ฒ ํจํด์ ๋ํ ๊ฑด์ค์ ์ธ ๋นํ๊ณผ ์ํ ์์ ์ด์ ์ด ์๋ ์ดํ์ ํจ๊ณผ๋ฅผ ์คํํ๋ ๋๊ธฐ ๋ฐ ์ ์ฌ์ ์ธ ์ด์ ์ด ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.