์๋ฌธ: https://code-cartoons.com/a-cartoon-intro-to-redux-3afb775501a6
Flux๋ฅผ ๋ ํผ๋์ค๋ฝ๊ฒ ๋ง๋๋ ๊ฒ์ Flux ๊ทธ ์์ฒด๋ณด๋ค๋ Flux์ Flux์์ ์๊ฐ์ ๋ฐ์ ๋ง๋ค์ด์ง Redux๊ฐ์ ์ฐจ์ด์ ์ด๋ค. ์ด ๊ธ์์๋ ์ด ๋์ ์ฐจ์ด์ ์ ๊ดํด ์ค๋ช ํ ๊ฒ์ด๋ค.
Flux์ ๋ํ ์ด์ ๊ธ์ ์ฝ์ง ์์๋ค๋ฉด ์ฝ์ ๊ฒ์ ์ถ์ฒํ๋ค.
์ Flux๋ฅผ ๋ฐ๊ฟ์ผํ๋?
Redux๋ Flux๊ฐ ํด๊ฒฐํ๋ ๋ฌธ์ ์ ์๋ค๊ฐ ์ถ๊ฐ์ ์ธ ๋ฌธ์ ์ ์ ๋ ํด๊ฒฐํ ์ ์๋ค.
Flux์ ๊ฐ์ด Redux๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ๋์ฑ ์์ธก ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ด์ค๋ค. ๋ง์ฝ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ๋ค๋ฉด ์ก์ ์ ๋ฐ์์์ผ์ผ ํ๋ค. ์ํ๋ฅผ ์ ์ฅํ๊ณ ์๋ ์คํ ์ด(store)๋ ์ ๊ทผ์(getter)๋ง ์๊ณ ์ค์ ์(setter)๋ ์์ผ๋ฏ๋ก ์ง์ ์ ์ผ๋ก ์ํ๋ฅผ ๋ฐ๊ฟ ๋ฐฉ๋ฒ์ด ์กด์ฌํ์ง ์๋๋ค. ์ด๋ฐ ๊ธฐ๋ณธ์ ์ธ ์ ์ Flux์ Redux๊ฐ ์์ฃผ ๋น์ทํ๋ค.
๊ทธ๋ผ ์ ๋ค๋ฅธ ํจํด์ด ํ์ํ ๊น? Redux๋ฅผ ๋ง๋ Dan Abramov๋ Flux๋ฅผ ๋ ํฅ์์ํฌ ์ ์๋ค๋ ์ฌ์ค์ ์ฐพ์๋๋ค. ๊ทธ๋ ๋ ๋์ ๊ฐ๋ฐ์ ๋๊ตฌ(developer tool)๋ฅผ ์ฌ์ฉํ๊ธธ ์ํ๊ณ , Flux์์ ๋ช๋ช ๋ถ๋ถ์ ์กฐ๊ธ ๋ฐ๊พธ๋ฉด ๋ ๋์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ธ ์ ์์ผ๋ฉด์๋ Flux์ ๊ฐ์ ์์ธก ๊ฐ๋ฅ์ฑ์ ๊ฐ์ง ์ ์๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ๋ค.
๊ทธ๋ ํซ ๋ฆฌ๋ก๋ฉ(hot reloading)๊ณผ ์๊ฐ ์ฌํ ๋๋ฒ๊น (time travel debugging)๋ฅผ ์ํ์ง๋ง(์ด๊ฒ์ ๋ํ ๋ ๋ค๋ฅธ ๊ธ์ด ์๋ค), Flux๋ก ์ฒ๋ฆฌํ๊ธฐ์๋ ์ด๋ ค์ด ๋ช๋ช ๋ฌธ์ ์ ๋ค์ด ์์๋ค.
๋ฌธ์ ์ 1: ์คํ ์ด์ ์ฝ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ์ญ์ ํ์ง ์๊ณ ๋ ๋ฆฌ๋ก๋ฉ(reloading)์ด ๋ถ๊ฐ๋ฅํ๋ค
Flux์์ ์คํ ์ด(store)๋ ๋ค์์ ๋ ๊ฐ์ง๋ฅผ ํฌํจํ๋ค:
- ์ํ ๋ณํ์ ์ํ ๋ก์ง
- ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ํ
์คํ ์ด ๊ฐ์ฒด ํ๋๊ฐ ์ด ๋ ๊ฐ์ง๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ํซ ๋ฆฌ๋ก๋ฉ์ ํ ๋ ๋ฌธ์ ์ ์ ๋ง๋ ๋ค. ์๋ก์ด ์ํ ๋ณํ ๋ก์ง(state change logic)์ ์ํด ์คํ ์ด ๊ฐ์ฒด๋ฅผ ๋ฆฌ๋ก๋ฉํ๋ฉด ์คํ ์ด์ ์ ์ฅ๋์ด์๋ ๊ธฐ์กด์ ์ํ๊น์ง ์์ด๋ฒ๋ฆฌ๋ ๋ฐ๋ค๊ฐ ์คํ ์ด์ ์์คํ ์ ๋๋จธ์ง ๋ถ๋ถ ์ฌ์ด์ ์๋ ์ด๋ฒคํธ ๊ตฌ๋ (event subscription)๊น์ง ๋ง๊ฐ์ ธ ๋ฒ๋ฆฐ๋ค.
ํด๊ฒฐ๋ฐฉ๋ฒ
๋ ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํ์. ํ ๊ฐ์ฒด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ง์ ๊ฐ์ง๊ฒ ํ๊ณ , ์ด ๊ฐ์ฒด๋ ๋ฆฌ๋ก๋ฉํ์ง ์๋๋ก ํ์. ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ ๋ชจ๋ ์ํ ๋ณํ ๋ก์ง์ ๊ฐ์ง๋๋ก ํ์. ์ด ๊ฐ์ฒด๋ ์ํ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ผ๋ฏ๋ก ๊ฑฑ์ ์์ด ๋ฆฌ๋ก๋ฉ ํ ์ ์์ ๊ฒ์ด๋ค.
๋ฌธ์ ์ 2: ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ ๋งค ์ก์ ๋ง๋ค ์ฌ๊ธฐ๋ก๋๋ค
์๊ฐ ์ฌํ ๋๋ฒ๊น ์ ์ํด์๋ ์ํ ๊ฐ์ฒด์ ๋ชจ๋ ๋ฒ์ ๋ค์ ๊ธฐ๋กํด๋์ด์ผ ํ๋ค. ๊ทธ๊ฑธ ๊ฐ์ง๊ณ ์ฝ๊ฒ ์ด์ ์ํ๋ก ๋์๊ฐ ์ ์๋ค.
๋งค๋ฒ ์ํ๊ฐ ์๋ก ๋ฐ๋ ๋๋ง๋ค ์ด์ ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ์ํ ๊ฐ์ฒด์ ๋ฒ์ ๋ค์ ์ ์ฅํ๋ ๋ฐฐ์ด์ ์ถ๊ฐํ ํ์๊ฐ ์๋ค. ํ์ง๋ง JavaScript์ ๋์๋ฐฉ์ ๋๋ฌธ์ ๋จ์ํ ์ํ๋ฅผ ๊ฐ์ง ๋ณ์๋ฅผ ๋ฐฐ์ด์๋ค๊ฐ ์ถ๊ฐํ๋ ๊ฒ๋ง์ผ๋ก๋ ๋ถ์กฑํ๋ค. ์ด ๋ฐฉ์์ผ๋ก๋ ์ ํ๋ฆฌ์ผ์ด์ ์ํ์ ์ค๋ ์ท(snapshot)์ ์์ฑํ๋๊ฒ ์๋๋ผ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ์๋ก์ด ํฌ์ธํฐ(pointer)๋ฅผ ๋ง๋ค ๋ฟ์ด๋ค.
์ ๋๋ก ๋์ํ๊ฒ ๋ง๋ค๊ธฐ ์ํด์๋, ๊ฐ๊ฐ์ ๋ฒ์ ์ด ์๋ฒฝํ ๋ ๋ฆฝ๋ ๊ฐ์ฒด๊ฐ ๋ ํ์๊ฐ ์๋ค. ๊ทธ๋ฌ๋ฉด ์ด์ ์ํ๋ค์ด ์ค์๋ก ์์ ๋๋ ์ผ์ ์ผ์ด๋์ง ์์ ๊ฒ์ด๋ค.
ํด๊ฒฐ๋ฐฉ๋ฒ
์ก์ ์ด ์คํ ์ด๋ก ์ ๋ฌ๋์์๋ ๊ธฐ์กด์ ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ์์ ํ๋ ๋์ , ๊ทธ ์ํ๋ฅผ ๋ณต์ฌํ ๋ค ๋ณต์ฌ๋ณธ์ ์์ ํ๋ฉด ๋๋ค.
๋ฌธ์ ์ 3: ์๋ํํฐ ํ๋ฌ๊ทธ์ธ(third-party plugin)์ด ๋ค์ด๊ฐ ์ข์ ์ฅ์๊ฐ ์๋ค
๊ฐ๋ฐ์ ๋๊ตฌ๋ ์ฌ๋ฌ ๊ณณ์ ์ฝ๊ฒ ์ฐ์ผ ์ ์๋๋ก ๋ง๋ค์ด์ผ ํ๋ค. ์ฌ์ฉ์๋ ์์ ์ ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ ๊ฐ๋จํ ์ฝ๋ ๋ช ์ค์ ์ง์ด๋ฃ๋ ๊ฒ๋ง์ผ๋ก ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ค.
์ด๋ ๊ฒ ํ๊ธฐ ์ํด์๋ ๊ธฐ์กด์ ์ฝ๋์ ์๋ํํฐ ํ๋ฌ๊ทธ์ธ์ ์ถ๊ฐํ ์ ์๋ ์ฅ์์ธ ํ์ฅ์ (extension point)์ด ํ์ํ๋ค.
๊ด๋ จ ์์ ์ค ํ๋๋ก๋ ๋ก๊น
(logging)์ด ์๋ค. ๋งค ์ก์
๋ง๋ค console.log()
๋ฅผ ์คํํ๋ค๊ณ ๊ฐ์ ํด๋ณด๋ฉด, ์ก์
์ด ๋ค์ด์์ ๋ ๊ทธ ์ก์
์ ๊ฒฐ๊ณผ๋ก์ ๋ง๋ค์ด์ง๋ ์๋ก์ด ์ํ๋ฅผ ๋ก๊น
ํ ๊ฒ์ด๋ค. Flux์์๋ ๋์คํจ์ณ(dispatcher)์ ์
๋ฐ์ดํธ์ ๊ฐ ์คํ ์ด์ ์
๋ฐ์ดํธ๋ฅผ ๊ตฌ๋
(subscribe)ํด์ผ๋ง ํ๋ค. ํ์ง๋ง ์ด๊ฒ์ ์๋ํํฐ ๋ชจ๋(third-party module)์ด ์ฝ๊ฒ ํ ์ ์๋ ๊ฒ์ด ์๋๋ค.
ํด๊ฒฐ๋ฐฉ๋ฒ
์์คํ ์ ๋ถ๋ถ์ ๋ค๋ฅธ ๊ฐ์ฒด๋ค๋ก ์ฝ๊ฒ ๊ฐ์ ์ ์๊ฒ ๋ง๋ค์ด๋ณด์. ์ด ๊ฐ์ฒด๋ค์ ์ฝ๊ฐ์ ์ถ๊ฐ ๊ธฐ๋ฅ๋ค์ ์์คํ ์ ๋ถ๋ถ์ ์ถ๊ฐํ๋ค. ์ด๋ฐ ํ์ฅ์ (extension point)์ โenhancerโ ๋๋ โhigher orderโ ๊ฐ์ฒด ํน์ ๋ฏธ๋ค์จ์ด(middleware)๋ผ๊ณ ๋ถ๋ฅธ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
๋ํ, ์ํ ๋ณํ ๋ก์ง(state change logic)์ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ๊ตฌ์กฐํํ์. ์ํ๊ฐ ๋ณํ๋ค๋ ๊ฒ์ ๋ทฐ์๊ฒ ์๋ฆฌ๊ธฐ ์ํด ์คํ ์ด๋ ๋จ ํ๋์ ์ด๋ฒคํธ๋ง ๋ณด๋ด๋ฉด ๋ ๊ฒ์ด๋ค. ์ด ์ด๋ฒคํธ๋ ๋ชจ๋ ์ํ ํธ๋ฆฌ๊ฐ ์ฒ๋ฆฌ ๋ ๋ค์ ๋ณด๋ธ๋ค.
Note: ์ด๋ฐ ๋ฌธ์ ์ ๋ค๊ณผ ํด๊ฒฐ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ๋ฐ์ ๋๊ตฌ ํ์ฉ ์ฌ๋ก๋ฅผ ์ค์ ์ ์ผ๋ก ๋ณด์๋ค. ํ์ง๋ง ์ด๋ฐ ๋ณํ๋ค์ ๋ค๋ฅธ ํ์ฉ ์ฌ๋ก์๋ ๋์์ด ๋๋ค. ์ด ์ธ์๋ Redux๊ณผ Flux ์ฌ์ด์๋ ๋ ๋ง์ ์ฐจ์ด์ ์ด ์๋ค. ์๋ฅผ ๋ค์ด, Redux๋ ๋ณด์ผ๋ฌํ๋ ์ดํธ(boilerplate)๋ฅผ ์ค์ด๊ณ ์คํ ์ด ๋ด์ ๋ก์ง์ ์ฌ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ๋ง๋ ๋ค. ์ฌ๊ธฐ์ Redux์ ๋ ๋ค๋ฅธ ์ฅ์ ๋ฆฌ์คํธ๊ฐ ์๋ค.
์๋ก์ด ์บ๋ฆญํฐ๋ค
Flux์์ Redux๋ก ์ค๋ฉด์ ์บ๋ฆญํฐ์ ๋ฐฐ์ญ์ด ์ฝ๊ฐ ๋ฌ๋ผ์ก๋ค.
์ก์ ์์ฑ์(action creators)
Redux๋ Flux์์ ์ก์ ์์ฑ์๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด ํญ์ ์ก์ ์ ๋ณด๋ด์ผ๋ง ํ๋ค. ์ด๊ฒ์ด ์ํ๋ฅผ ๋ฐ๊พธ๊ธฐ ์ํ ์ ์ผํ ๋ฐฉ๋ฒ์ด๋ค.
Flux์ ๋ํ ์ด์ ๊ธ์์ ์ด์ผ๊ธฐํ๋ฏ์ด ์ก์ ์์ฑ์๋ ์ ๋ณด๊ธฐ์ฌ(telegraph operator)์ ํ๋ ์ผ์ด ๋น์ทํ๋ค. ์ด๋ค ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ณ ์ถ์์ง ์ก์ ์์ฑ์์๊ฒ ์๋ ค์ฃผ๋ฉด ๋๋จธ์ง ์์คํ ์ด ์ดํดํ ์ ์๋ ํฌ๋งท์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
Flux์๋ ๋ค๋ฅด๊ฒ Redux์ ์ก์ ์์ฑ์๋ ๋์คํจ์ณ(dispatcher)๋ก ์ก์ ์ ๋ณด๋ด์ง๋ ์๋๋ค. ๋์ , ํฌ๋งท์ ๋ฐ๊พผ ๋ค ์ก์ ์ ๋๋ ค์ค๋ค.
์คํ ์ด(store)
Flux์ ์คํ ์ด๋ ๋ชจ๋ ๊ฒ์ ๊ด๋ฆฌํ๋ ์ ๋ถ๊ด๋ฃ์ ๊ฐ๋ค๊ณ ์ด์ผ๊ธฐํ์๋ค. ๋ชจ๋ ์ํ ๋ณํ๋ ์คํ ์ด์ ์ํด์ ์ด๋ฃจ์ด์ ธ์ผ ํ๊ณ ์คํ ์ด๋ก ์ง์ ์์ฒญํ๋ ๋์ ์ก์ ํ์ดํ๋ผ์ธ์ ๋ฐ๋ผ๊ฐ์ผ ํ๋ค. Redux์ ์คํ ์ด๋ ์ญ์ ๊ฐ์ ์ญํ ์ ํ์ง๋ง Flux์ ๊ทธ๊ฒ๊ณผ๋ ์ฝ๊ฐ ๋ค๋ฅด๋ค.Flux์์๋ ๋ค์์ ์คํ ์ด๋ฅผ ๊ฐ์ง ์ ์๋ค. ๊ฐ ์คํ ์ด๋ ๊ฐ์์ ๋ฒ์๋ฅผ ๊ฐ๊ณ ๊ทธ ๋ด๋ถ์ ๋ชจ๋ ์ปจํธ๋กค์ ๊ฐ์ง๋ค. ๊ทธ๋ฆฌ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ํ ์ค ํ ์กฐ๊ฐ์ ๊ฐ์ง๊ณ ์๊ณ , ๊ทธ ์ํ ์กฐ๊ฐ๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ๋ณํย ๋ก์ง์ ๊ฐ์ง๋ค.
๋ฐ๋ฉด Redux์ ์คํ ์ด๋ ์ข ๋ ์ผ์ ๋ค๋ฅธ ๊ณณ์ ์์ํ๋ ๊ฒฝํฅ์ด ์์ผ๋ฉฐ, ๊ทธ๋ ๊ฒ ํด์ผ๋ง ํ๋ค. ์๋ํ๋ฉด, Redux๋ ๋จ ํ๋์ ์คํ ์ด๋ง์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ด๋ค. ๋ง์ฝ ํผ์์ ๋ชจ๋ ๊ฒ์ ์ฒ๋ฆฌํ๋ ค๊ณ ํ๋ค๋ฉด ์๋ง ์ฒ๋ฆฌํ ์์ด ๋๋ฌด ๋ง์ ๊ฒ์ด๋ค.
๋์ , Redux์ ์คํ ์ด๋ ์ํ ํธ๋ฆฌ(state tree) ์ ์ฒด๋ฅผ ์ ์งํ๋ ์ฑ ์์ ์ง๋ค. ์ก์ ์ด ๋ค์ด์์ ๋ ์ด๋ค ์ํ๋ณํ๊ฐ ํ์ํ์ง์ ๋ํ ์ผ์ ์์ํ๋ฉฐ, ๋ฐ๋ก ๋ค์์ ์ด์ผ๊ธฐํ ๋ฆฌ๋์(reducer)๊ฐ ๊ทธ ์ผ์ ๋งก๋๋ค.
์๋ง ๋์คํจ์ณ(dispatcher)๊ฐ ์๋ค๋ ๊ฒ์ ๋์น์ฑ์์ง๋ ๋ชจ๋ฅธ๋ค. ์ด๊ฒ์ ์คํ ์ด๊ฐ ์ด ์ผ์ ๋๊ฒจ๋ฐ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฆฌ๋์(the reducers)
์คํ ์ด๋ ์ก์ ์ด ์ด๋ค ์ํ ๋ณํ๋ฅผ ๋ง๋๋์ง ์ ํ์๊ฐ ์์ ๋ ๋ฆฌ๋์์๊ฒ ๋ฌป๋๋ค. ๋ฃจํธ ๋ฆฌ๋์(root reducer)๋ ์ ํ๋ฆฌ์ผ์ด์ ์ํ ๊ฐ์ฒด์ ํค(key)๋ฅผ ๊ธฐ์ค ์ผ์ ์ํ๋ฅผ ์กฐ๊ฐ์กฐ๊ฐ ๋๋๋ค. ์ด๋ ๊ฒ ๋๋์ด์ง ์ํ ์กฐ๊ฐ์ ๊ทธ ์กฐ๊ฐ์ ์ฒ๋ฆฌํ ์ค ์๋ ๋ฆฌ๋์๋ก ๋๊ฒจ์ค๋ค.
๋ฆฌ๋์๋ ๋ง์น ์๋ฅ ๋ณต์ฌ์ ์ง๋์น๊ฒ ์ด์ฑ์ ์ธ ์ฌ๋ฌด์ค ์ง์๋ค๊ณผ ๊ฐ๋ค. ์ผ์ ๋ง์น๋ ๊ฒ์ ์์ฃผ ๋ฏผ๊ฐํ๋ฏ๋ก ๋๊ฒจ๋ฐ์ ์์ ์ํ๋ ๋ณ๊ฒฝํ์ง ์๋๋ค. ๋์ ์๋ก์ด ๋ณต์ฌ๋ณธ์ ๋ง๋ ํ ๊ฑฐ๊ธฐ์๋ค๊ฐ ๋ชจ๋ ๋ณ๊ฒฝ์ฌํญ์ ์ ์ฉํ๋ค.
์ด๊ฒ์ด ๋ฐ๋ก Redux์ ํค ์์ด๋์ด ์ค ํ๋์ด๋ค. ์ํ ๊ฐ์ฒด๋ ์ง์ ๋ณ๊ฒฝ๋์ง ์๋๋ค. ๋์ , ๊ฐ๊ฐ์ ์ํ ์กฐ๊ฐ์ด ๋ณต์ฌ ํ ๋ณ๊ฒฝ๋๊ณ ์๋ก์ด ์ํ ๊ฐ์ฒด ํ๋๋ก ํฉ์ณ์ง๋ค.
๋ฆฌ๋์๋ ๋ณต์ฌ๋๊ณ ์ ๋ฐ์ดํธ๋ ์ํ ๊ฐ์ฒด๋ฅผ ๋ฃจํธ ๋ฆฌ๋์์๊ฒ ๋๊ฒจ์ฃผ๊ณ , ๋ฃจํธ ๋ฆฌ๋์๋ ์ด ๊ฐ์ฒด๋ฅผ ์คํ ์ด๋ก ๋ณด๋ธ๋ค. ๊ทธ๋ฆฌ๊ณ ์คํ ์ด๋ ์ด ๊ฐ์ฒด๋ฅผ ์๋ก์ด ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ก ๋ง๋ ๋ค.
๋ง์ฝ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ผ๋ฉด ํ๋์ ๋ฆฌ๋์๋ง ๊ฐ์ง๊ณ ๋ ์ ์ฒด ์ํ์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค๊ณ ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค. ์์ฃผ ํฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ผ๋ฉด, ๋ง์ ๋ฆฌ๋์๋ฅผ ๊ฐ์ง ํฐ ๋ฆฌ๋์ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค. ์ด๊ฒ์ด Flux์ Redux์ ๋ ๋ค๋ฅธ ์ ์ด๋ค. Flux๋ ์คํ ์ด๊ฐ ์๋ก ์ฐ๊ฒฐ๋ ํ์๋ ์๊ณ ์ํ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ก๋ค. ๋ฐ๋ฉด Redux๋ ๋ฆฌ๋์๊ฐ ํธ๋ฆฌ ๋ชจ์์ ๊ณ๊ธ๊ตฌ์กฐ ์์ ์กด์ฌํ๋ค. ์ด ๊ตฌ์กฐ๋ ์ปดํฌ๋ํธ ๊ตฌ์กฐ์ฒ๋ผ ํ์ํ ๋งํผ์ ๋ ๋ฒจ(ํธ๋ฆฌ์ ๋์ด)์ ์ผ๋ง๋ ์ง ๊ฐ์ง ์ ์๋ค.
๋ทฐ: ์๋ฏผํ ์ปดํฌ๋ํธ์ ์ฐ์งํ ์ปดํฌ๋ํธ(the views: smart and dumb components)
Flux๋ ์ปจํธ๋กค๋ฌ ๋ทฐ(controller view)์ ์ผ๋ฐ ๋ทฐ(regular view)๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์ปจํธ๋กค๋ฌ ๋ทฐ๋ ์ค๊ฐ ๊ด๋ฆฌ์ ๊ฐ์์ ์คํ ์ด์ ์์ ๋ทฐ ์ฌ์ด์์ ์ปค๋ฎค๋์ผ์ด์ ์ ๊ด๋ฆฌํ๋ค.
Redux๋ ๋น์ทํ ์ปจ์ ์ ๊ฐ์ง๊ณ ์๋ค. ์๋ฏผํ ์ปดํฌ๋ํธ์ ์ฐ์งํ ์ปดํฌ๋ํธ๊ฐ ๊ทธ๊ฒ์ด๋ค. ์๋ฏผํ ์ปดํฌ๋ํธ๋ ๊ด๋ฆฌ์์ฒ๋ผ ํ๋ํ๋๋ฐ, Flux์ ์ปจํธ๋กค๋ฌ ๋ทฐ๋ณด๋ค ๋ช๋ช ๊ท์น์ ๋ ๋ฐ๋ฅธ๋ค.
- ์๋ฏผํ ์ปดํฌ๋ํธ๋ ์ก์ ์ฒ๋ฆฌ๋ฅผ ์ฑ ์์ง๋ค. ์๋ฏผํ ์ปดํฌ๋ํธ ๋ฐ์ ์ฐ์งํ ์ปดํฌ๋ํธ๊ฐ ์ก์ ์ ๋ณด๋ผ ํ์๊ฐ ์์ ๋, ์๋ฏผํ ์ปดํฌ๋ํธ๋ props๋ฅผ ํตํด์ ์ฐ์งํ ์ปดํฌ๋ํธ์ ํจ์๋ฅผ ๋ณด๋ธ๋ค. ์ฐ์งํ ์ปดํฌ๋ํธ๋ ๋ฐ์ ํจ์๋ฅผ ์ฝ๋ฐฑ์ผ๋ก์จ ๋จ์ํ ํธ์ถ๋ง ํ๋ค.
- ์๋ฏผํ ์ปดํฌ๋ํธ๋ ์๊ธฐ ์์ ์ CSS style์ ๊ฐ์ง๊ณ ์์ง ์๋ค.
- ์๋ฏผํ ์ปดํฌ๋ํธ๋ ์๊ธฐ ์์ ์ DOM์ ๊ฑฐ์ ๊ฐ์ง๊ณ ์์ง ์๋ค. ๋์ , DOM ์์๋ค์ ๊ด๋ฆฌํ๋ ์ฐ์งํ ์ปดํฌ๋ํธ๋ค์ ๊ด๋ฆฌํ๋ค.
์ฐ์งํ ์ปดํฌ๋ํธ๋ ์ก์ ์ ์ง์ ์์กด์ฑ์ ๊ฐ์ง์ง๋ ์๋๋ค. ์ด๋ ๋ชจ๋ ์ก์ ์ props๋ฅผย ํตํด์ ๋๊ฒจ๋ฐ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ง์ธ ์ฆ์จ, ์ฐ์งํ ์ปดํฌ๋ํธ๋ ๋ค๋ฅธ ๋ก์ง์ ๊ฐ์ง ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฌ์ฉ๋ ์ ์๋ค๋ ๋ป์ด๋ค. ๋ํ ์ด๋์ ๋ ๋ณด๊ธฐ์ข๊ฒ ํ ๋งํผ์ CSS style๋ ํฌํจํ๊ณ ์๋ค (๋ฐ๋กย style props๋ฅผย ๋ฐ์ ๊ธฐ๋ณธ style์ ๋ณํฉ์์ผ์ style์ ๋ฐ๊ฟ์๋ ์๋ค).
๋ทฐ ๋ ์ด์ด ๋ฐ์ธ๋ฉ(the view layer binding)
์คํ ์ด๋ฅผ ๋ทฐ์ ์ฐ๊ฒฐํ๊ธฐ ์ํด์ Redux๋ ์ฝ๊ฐ์ ๋์์ด ํ์ํ๋ค. ๊ทธ ๋์ ํจ๊ป ๋ฌถ์ด์ค ๋ฌด์ธ๊ฐ๊ฐ ํ์ํ๋ฐ, ์ด๊ฑธ ํด์ฃผ๋ ๊ฒ์ด ๋ฐ๋ก ๋ทฐ ๋ ์ด์ด ๋ฐ์ธ๋ฉ์ด๋ค. React๋ฅผ ์ฌ์ฉํ๋ค๋ฉด react-redux๊ฐ ๊ทธ๊ฒ์ด๋ค.
๋ทฐ ๋ ์ด์ด ๋ฐ์ธ๋ฉ์ ๋ทฐ ํธ๋ฆฌ(view tree)๋ฅผ ์ํ IT ๋ถ์์ ๊ฐ๋ค. ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ ์คํ ์ด์ ์ฐ๊ฒฐํ๋ ์ญํ ์ ํ๋ฉฐ, ๋ง์ ๊ธฐ์ ์ ์ธ ์ธ๋ถ์ฌํญ๋ค์ ์ฒ๋ฆฌํด์ ํธ๋ฆฌ ๊ตฌ์กฐ๊ฐ ์ธ๋ถ์ฌํญ์ ์ ๊ฒฝ ์ฐ์ง ์๋๋ก ํด์ค๋ค.
๋ทฐ ๋ ์ด์ด ๋ฐ์ธ๋ฉ์ ์ธ ๊ฐ์ ์ปจ์ ์ ๊ฐ์ง๊ณ ์๋ค:
- ๊ณต๊ธ ์ปดํฌ๋ํธ(provider component): ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ๊ฐ์ธ๋ ์ปดํฌ๋ํธ์ด๋ค.
connect()
๋ฅผ ์ด์ฉํด ๋ฃจํธ ์ปดํฌ๋ํธ ๋ฐ์ ์ปดํฌ๋ํธ๋ค์ด ์คํ ์ด์ ์ฐ๊ฒฐ๋๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด์ค๋ค. connect()
: react-redux๊ฐ ์ ๊ณตํ๋ ํจ์์ด๋ค. ์ปดํฌ๋ํธ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ํ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ๊ณ ์ถ์ผ๋ฉดconnect()
๋ฅผ ์ด์ฉํด์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ์ฃผ๋ฉด ๋๋ค. ๊ทธ๋ฌ๋ฉดconnect()
๊ฐ ์ ๋ ํฐ(select)๋ฅผ ์ด์ฉํด์ ํ์ํ ๋ชจ๋ ์ฐ๊ฒฐ์ ๋ง๋ค์ด์ค๋ค.- ์ ๋ ํฐ(selector): ์ง์ ๋ง๋ค์ด์ผ ํ๋ ํจ์์ด๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ํ ์์ ์ด๋ ๋ถ๋ถ์ด ์ปดํฌ๋ํธ์ props๋ก์จ ํ์ํ ๊ฒ์ธ์ง ์ง์ ํ๋ค.
๋ฃจํธ ์ปดํฌ๋ํธ(the root component)
๋ชจ๋ React ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฃจํธ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ง๋ค. ์ด๊ฒ์ ๋จ์ง ์ปดํฌ๋ํธ ๊ณ์ธต ๊ตฌ์กฐ์์ ๊ฐ์ฅ ์์ ์์นํ๋ ์ปดํฌ๋ํธ์ผ ๋ฟ์ด๋ค. ํ์ง๋ง Redux์์๋ ๋ฃจํธ ์ปดํฌ๋ํธ๋ ์ถ๊ฐ๋ก ์ฑ ์์ ธ์ผ ํ ๊ฒ์ด ์กด์ฌํ๋ค.
๋ฃจํธ ์ปดํฌ๋ํธ๊ฐ ๋งก๋ ์๋ฌด๋ ๋ง์น C-level ์์๊ณผ ๊ฐ๋ค โ C-level ์์์๋ CEO, CTO, CFO ๋ฑ์ด ์๋ค. ๋ฃจํธ ์ปดํฌ๋ํธ๋ ๋ชจ๋ ํ์ด ์ผ์ ํ๋๋ก ํ๋ ์๋ฌด๋ฅผ ๊ฐ์ง๋ค. ์คํ ์ด๋ฅผ ์์ฑํ๊ณ ๋ฌด์จ ๋ฆฌ๋์๋ฅผ ์ฌ์ฉํ ์ง ์๋ ค์ฃผ๋ฉฐ ๋ทฐ ๋ ์ด์ด ๋ฐ์ธ๋ฉ๊ณผ ๋ทฐ๋ฅผ ๋ถ๋ฌ์จ๋ค.
ํ์ง๋ง ๋ฃจํธ ์ปดํฌ๋ํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๊ธฐํํ ๋ค๋ก๋ ๊ฑฐ์ ํ๋ ์ผ์ด ์๋ค. ํ๋ฉด์ ๊ฐฑ์ ๋ ๋๋ ์ ๊ฒฝ ์ฐ์ง ์๋๋ค. ํ๋ฉด ๊ฐฑ์ ์ ๋ทฐ ๋ ์ด์ด ๋ฐ์ธ๋ฉ์ ๋์์ผ๋ก ์๋์ ์ปดํฌ๋ํธ๋ค์ด ๋งก์์ ์ฒ๋ฆฌํ๋ค.
์ด๋ป๊ฒ ํจ๊ป ๋์ํ๋๊ฐ
์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ๊ธฐ ์ํด ์ด๋ป๊ฒ ์ด ์บ๋ฆญํฐ๋ค์ด ํจ๊ป ์ผํ๋์ง ์ดํด๋ณด์.
์ค๋น(the setup)
์ค๋น ๋จ๊ณ์์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ ๋ถ๋ถ์ด ๋ชจ๋ ํจ๊ป ์ฐ๊ฒฐ๋๋ค.
- ์คํ ์ด๋ฅผ ์ค๋นํ๋ค.ย ๋ฃจํธ ์ปดํฌ๋ํธ๋
createStore()
๋ฅผ ์ด์ฉํด์ ์คํ ์ด๋ฅผ ์์ฑํ๊ณ ๋ฌด์จ ๋ฆฌ๋์๋ฅผ ์ฌ์ฉํ ์ง ์๋ ค์ค๋ค. ๋ฃจํธ ์ปดํฌ๋ํธ๋ ์ด๋ฏธ ํ์ํ ๋ชจ๋ ๋ฆฌ๋์๋ฅผ ๊ฐ์ง๊ณ ์๋ค.combineReducers()
๋ฅผ ์ด์ฉํด์ ๋ค์์ ๋ฆฌ๋์๋ฅผ ํ๋๋ก ๋ฌถ๋๋ค. - ์คํ ์ด์ ์ปดํฌ๋ํธ ์ฌ์ด์ ์ปค๋ฎค๋์ผ์ด์
์ ์ค๋นํ๋ค. ๋ฃจํธ ์ปดํฌ๋ํธ๋ ๊ณต๊ธ ์ปดํฌ๋ํธ๋ก ์๋ธ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ๊ณ ์คํ ์ด์ ๊ณต๊ธ ์ปดํฌ๋ํธ ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํ๋ค.
๊ณต๊ธ ์ปดํฌ๋ํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ์ ๋ฐ์ดํธํ๊ธฐ ์ํ ๋คํธ์ํฌ๋ฅผ ์์ฑํ๋ค. ์๋ฏผํ ์ปดํฌ๋ํธ๋connect()
๋ก ๋คํธ์ํฌ์ ์ฐ๊ฒฐํ๋ค. ์ด๋ ๊ฒ ์ํ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์๊ฒ ๋ง๋ ๋ค. - ์ก์
์ฝ๋ฐฑ(action callback)์ ์ค๋นํ๋ค. ์ฐ์งํ ์ปดํฌ๋ํธ๊ฐ ์ก์
๊ณผ ์ฝ๊ฒ ์ผํ ์ ์๊ฒ ํ๊ธฐ ์ํด ์๋ฏผํ ์ปดํฌ๋ํธ๋
bindActionCreators()
๋ก ์ก์ ์ฝ๋ฐฑ์ ์ค๋นํ๋ค. ์ด๋ ๊ฒ ๊ฐ๋จํ ์ฝ๋ฐฑ์ ์ฐ์งํ ์ปดํฌ๋ํธ์ ๋๊ฒจ์ค ์ ์๋ค. ์ก์ ์ ํฌ๋งท์ด ๋ฐ๋ ๋ค ์๋์ ์ผ๋ก ๋ณด๋ด์ง๋ค.
๋ฐ์ดํฐ ํ๋ฆ(the data flow)
์ด์ ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํ ์ค๋น๊ฐ ๋์๋ค. ์ก์ ์ ํ๋ ๋ณด๋ด๊ณ ๋ฐ์ดํฐ ํ๋ฆ์ ํ์ธํด๋ณด์.
- ๋ทฐ๊ฐ ์ก์ ์ ์์ฒญํ๋ค. ์ก์ ์์ฑ์๊ฐ ํฌ๋งท์ ๋ณํํ ๋ค ๋๋ ค์ค๋ค.
bindActionCreators()
๊ฐ ์ค๋น๊ณผ์ ์์ ์ฌ์ฉ๋์์ผ๋ฉด ์๋์ผ๋ก ์ก์ ์ด ๋ณด๋ด์ง๋ค. ๊ทธ๊ฒ ์๋๋ผ๋ฉด ๋ทฐ๊ฐ ์ง์ ์ก์ ์ ๋ณด๋ธ๋ค.- ์คํ ์ด๊ฐ ์ก์ ์ ๋ฐ๋๋ค. ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ํ ํธ๋ฆฌ์ ์ก์ ์ ๋ฃจํธ ๋ฆฌ๋์์๊ฒ ๋ณด๋ธ๋ค.
- ๋ฃจํธ ๋ฆฌ๋์๋ ์ํ ํธ๋ฆฌ๋ฅผ ์กฐ๊ฐ์ผ๋ก ๋๋ ๋ค ์๋ง์ ์๋ธ ๋ฆฌ๋์๋ก ์ํ ์กฐ๊ฐ๋ค์ ๋๊ฒจ์ค๋ค.
- ์๋ธ ๋ฆฌ๋์๋ ๋ฐ์ ์ํ ์กฐ๊ฐ์ ๋ณต์ฌํ ๋ค, ๊ทธ ๋ณต์ฌ๋ณธ์ ๋ณ๊ฒฝํ๋ค. ๋ฃจํธ ๋ฆฌ๋์์๊ฒ ๋ณ๊ฒฝ๋ ๋ณต์ฌ๋ณธ์ ๋๋ ค์ค๋ค.
- ๋ชจ๋ ์๋ธ ๋ฆฌ๋์๊ฐ ๋ณ๊ฒฝ ๋ ์ํ ์กฐ๊ฐ๋ค์ ๋๋ ค์ฃผ๋ฉด, ๋ฃจํธ ๋ฆฌ๋์๋ ์ด ์ํ ์กฐ๊ฐ๋ค์ ํ๋ฐ ๋ชจ์ ์ํ ํธ๋ฆฌ๋ก ๋ง๋ ๋ค ์คํ ์ด๋ก ๋๋ ค์ค๋ค. ์คํ ์ด๋ ์๋ก์ด ์ํ ํธ๋ฆฌ๋ฅผ ์๋ ์ํ ํธ๋ฆฌ์ ๋ฐ๊พผ๋ค.
- ์คํ ์ด๋ ๋ทฐ ๋ ์ด์ด ๋ฐ์ธ๋ฉ์๊ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ํ๊ฐ ๋ณ๊ฒฝ๋์๋ค๋ ๊ฒ์ ์๋ฆฐ๋ค.
- ๋ทฐ ๋ ์ด์ด ๋ฐ์ธ๋ฉ์ ์คํ ์ด์๊ฒ ์๋ก์ด ์ํ๋ฅผ ๋ณด๋ด๋ฌ๋ผ๊ณ ์์ฒญํ๋ค.
- ๋ทฐ ๋ ์ด์ด ๋ฐ์ธ๋ฉ์ ๋ทฐ์๊ฒ ํ๋ฉด์ ์ ๋ฐ์ดํธํ๋๋ก ์์ฒญํ๋ค.
์ด๊ฒ์ด ๋ด๊ฐ ์๊ณ ์๋ Redux์ด๊ณ Flux์์ ์ฐจ์ด์ ์ด๋ค. ๋์์ด ๋์๊ธธ ๋ฐ๋๋ค!