React๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
๋ฆฌ์กํธ๋ ์ธํฐ๋ ์ ์ด ๋ง์ ์น ์ฑ์ ๊ฐ๋ฐํ๊ธฐ ์ํด์ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
๊ทธ๋ฌ๊ธฐ์ ์ด๋ฌํ ์น ์ฑ์ ๋ง๋๋ ๋ค๋ฅธ Tool์ธ Vue๋ Angualar์ ๋ง์ด ๋น๊ต๋ฅผ ํ๊ฒ ๋ฉ๋๋ค.
ํ๋ ์ ์ํฌ๋ ์ด๋ ํ ์ฑ์ ๋ง๋ค๊ธฐ ์ํด ํ์ํ ๋๋ถ๋ถ์ ๊ฒ์ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด๋ ํ ํน์ ๊ธฐ๋ฅ์ ๋ชจ๋ํ ํด๋์ ๊ฒ์ ๋๋ค.
์ด ์์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ํ๋ ์ ์ํฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํ๊ณ ๋ํ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์์ค ์ฝ๋๋ฅผ ํธ์ถํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ค ์ฝ๋๋ ์ด๋ ํ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํธ์ถํ๊ฒ ๋ฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ ์์ํฌ๋ ์ฑ์ ๋ง๋๋๋ฐ ํ์ํ ๋๋ถ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ํน์ ๊ธฐ๋ฅ์ ์ํด ๋ชจ๋ํ ๋์ด ์์ต๋๋ค.
๋ฆฌ์กํธ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ ์ด์ ๋ ๋ฆฌ์กํธ๋ ์ ์ ์ผ๋ก UI๋ฅผ ๋ ๋๋ง ํ๋ ๋ฐ ๊ด์ฌํ๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ๋ฉด์ ๋ฐ๊พธ๋ ๋ผ์ฐํ
์ react-router-dom ๋ชจ๋์ ์ฌ์ฉํ๋ฉฐ, ์ํ ๊ด๋ฆฌ๋ฅผ ์ํด์๋ redux, mobx ๋ฑ ์ฌ๋ฌ ๋ชจ๋์ ์ฌ์ฉํ๋ฉฐ, ๋น๋๋ฅผ ์ํด์๋ webpack, npm ๋ฑ๋ฑ, ํ
์คํ
์ ์ํด์๋ Eslint, Mocha ๋ฑ์ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฆฌ์กํธ๋ ํ๋ ์์ํฌ๊ฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค.
๋ฆฌ์กํธ๋ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ์ด์ฉํด์ ์น ์ฑ์ ๊ฐ๋ฐํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ปดํฌ๋ํธ๋ ๋ฌด์์ผ๊น์?!
๋ฆฌ์กํธ๋ ์ฌ๋ฌ ์ปดํฌ๋ํธ ์กฐ๊ฐ์ผ๋ก ๋์ด์์ต๋๋ค.
๋ง์ฝ ํ๋์ ํ์ด์ง๋ฅผ ๋ฆฌ์กํธ๋ก ๋ง๋ ๋ค๊ณ ๋ณด๋ฉด ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ์ฌ๋ฌ๊ฐ์ ์ปดํฌ๋ํธ๊ฐ ๋ชจ์ฌ์ ํ๋์ ํ์ด์ง๋ฅผ ์ด๋ฃจ๊ฒ ๋ฉ๋๋ค.
๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ ๋๊ฐ์ง๊ฐ ์์ต๋๋ค.
์๋ ๋ฆฌ์กํธ๋ก ๊ฐ๋ฐํ ๋๋ ํด๋์ค ์ปดํฌ๋ํธ๋ฅผ ์ด์ฉํด์ ๋ง์ด ๊ฐ๋ฐ์ ํ์ง๋ง ๋ฆฌ์กํธ์์ ๋ฆฌ์กํธ Hooks๋ผ๋ ๊ฒ์ ๋ฐํํ ์ดํ๋ถํฐ๋ ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ์ด์ฉํด์ ๊ฐ๋ฐ์ ๋ง์ด ํฉ๋๋ค.
๋ฆฌ์กํธ์ ์ฃผ์ ํน์ง ์ค ํ๋๋ ๊ฐ์(Virtual)๋์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ผ ๊ฐ์๋์ ๋ํด์ ์์๋ด์ผํ๋๋ฐ ์ฐ์ ๊ฐ์๋์ ์ ์ฌ์ฉํ๋์ง ์๊ธฐ ์ํด์
๋จผ์ ์ค์ (Real) ๋(DOM)์ ๋ํด์ ์์๋ณด๊ณ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ ๋๋งํ๋ ๊ณผ์ ์ ๋ํด์๋ ์์๋ณด๊ฒ ์ต๋๋ค.
๋ธ๋ผ์ฐ์ ์์ UI๋ฅผ ๋ณผ ์ ์๋ ๊ฒ์ ์ด HTML ์ ๋ถ์ํด์ ๋ณด์ฌ์ค ์ ์์ต๋๋ค.
์ด HTML์ ์์(Element)๋ค๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
์์์ ๋ณด๋ ์น ํ์ด์ง๋ฅผ ์ด๋ฃจ๋ ์์๋ค์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ด์ฉํ ์ ์๊ฒ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ํธ๋ฆฌ๊ตฌ์กฐ๋ก ๋ง๋ ๊ฐ์ฒด ๋ชจ๋ธ์ ์๋ฏธํฉ๋๋ค.
์์ ๋ณด์ด๋ DOM ํธ๋ฆฌ๋ฅผ DOM ์์ ์ ๊ณตํด์ฃผ๋ API๋ฅผ ์ด์ฉํด์ ์กฐ์ํ ์ ์์ต๋๋ค.
์ด API๋ฅผ ์ด์ฉํด์ DOM ๊ตฌ์กฐ์ ์ ๊ทผํ๊ฑฐ๋ ์ํ๋ ์์(Element)๋ฅผ ์์ ํ๊ฑฐ๋ ์์ ๊ฑฐ๋ ํ ์ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์์ ํ์ด์ง์ ๋ํ HTML ์๋ต์ ๋ฐ๊ณ ํ๋ฉด์ ํ์ํ๊ธฐ ์ ์ ์ฌ๋ฌ ๋จ๊ณ๊ฐ ์์ต๋๋ค.
์น ๋ธ๋ผ์ฐ์ ๊ฐ HTML ๋ฌธ์๋ฅผ ์ฝ๊ณ , ์คํ์ผ ์ ํ๊ณ ๋ทฐํฌํธ์ ํ์ํ๋ ๊ณผ์ ์ ๋๋ค.
๋ฆฌ์กํธ์์๋ ํญ์ ๋ ๋๋ง ์ด์ ์ ๊ฐ์ฒด(๊ฐ์๋)์ ๋ ๋๋ง ์ดํ์ ๊ฐ์ฒด(๊ฐ์๋)๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
๋ฆฌ์กํธ์์๋ ์ด๋ ํ State(๋ฐ์ดํฐ)๊ฐ ๋ฐ๋๋ฉด ๊ฐ์๋์ด ์๋ก ์์ฑ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ์ด์ ์ ์๊ธด ๊ฐ์๋๊ณผ ๋น๊ตํด์ ๋ฐ๋ ๋ถ๋ถ๋ง ์ค์ ๋์ ์ ์ฉ์ ์์ผ์ค๋๋ค.
๋ฐ๋ ๋ถ๋ถ์ ์ฐพ๋ ๊ณผ์ ์ Diffing์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ,
๋ฐ๋ ๋ถ๋ถ๋ง ์ค์ ๋์ ์ ์ฉ์์ผ์ฃผ๋ ๊ฒ์ ์ฌ์กฐ์ (reconciliation)์ด๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
React ๋ Reconciliation์ ํตํด์ ๋ง์ฝ ์ด๊ฐ์ State๋ฐ์ดํฐ๊ฐ ๋ณํ๋ค๋ฉด DOM์ ์ด๋ฒ ๋ฐ๋ณตํด์ ์กฐ์ํด์ฃผ๋ ๊ฒ์ด ์๋ Virtual DOM์ ๋น๊ตํด์ ํ๋ฒ์ DOM ์กฐ์์ผ๋ก ๋ชจ๋ ๋ณํ๋ฅผ ๋ฐ์์์ผ์ค๋๋ค.
๋ฆฌ์กํธ์ ๊ฐ์๋์ ์ค์ DOM๊ณผ ๊ฐ์ ๋ด์ฉ์ ๋ด๊ณ ์์ผ๋ฉฐ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด ํํ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋์ด ์๋ ๋ณต์ฌ๋ณธ์ ๋๋ค.
๋ฆฌ์กํธ๋ ๋ ๋๋ง ์ด์ ์ ๋ด์ฉ์ ๋ด๊ณ ์๋ ๊ฐ์๋๊ณผ ๋ณ๊ฒฝ ์ดํ์ ๋ณด์ผ ๋ด์ฉ์ ๋ด๊ณ ์๋ ๊ฐ์๋์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
๋ณ๊ฒฝ์ด ๋๊ธฐ ์ ๊ฐ์๋๊ณผ ๋ณ๊ฒฝ์ด ๋ ํ์ ๊ฐ์๋์ ๋น๊ตํ๋ ๊ณผ์ ์ Diffing์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
Diffing์ ํตํด์ ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ค์ ํ์ ํ ํ, ๋ฆฌ์กํธ๋ Batch Update๋ฅผ ์ํํด์ ์ค์ DOM์ ํ ๋ฒ์ ์ ์ฉ์์ผ์ค๋๋ค. ์ด๋ฌํ ๊ณผ์ ์ ์ฌ์กฐ์ (Reconciliation)์ด๋ผ๊ณ ํฉ๋๋ค.
์ ํต์ ์ธ ์น ์ฌ์ดํธ๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉํ๋ Multi Page Application ์ ๋๋ค.
ํ์ง๋ง ์์ฆ์๋ ์น ์ฌ์ดํธ์ ์ ์ฒด ํ์ด์ง๋ฅผ ํ๋์ ํ์ด์ง์ ๋ด์ ๋์ ์ผ๋ก ํ๋ฉด์ ๋ฐ๊ฟ๊ฐ๋ฉฐ ํํํฉ๋๋ค. ์ด๊ฒ์ SPA Single Page Application์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
์ ํต์ ์ธ ์น ์ฌ์ดํธ๋ a page ์์ b page๋ก ํ์ด์ง ์ ํ ํ ๋ a.html ์ ๋ณด์ฌ์ฃผ๋ค๊ฐ b.html์ ๋ณด์ฌ ์ฃผ๋ฉด ๋์ง๋ง index.html ๋ฐ์ ์๋ SPA์์๋ ์ด๋ป๊ฒ ํ์ด์ง ์ ํ(๋ธ๋ผ์ฐ์ง)์ ํด์ค๊น์?
HTML 5์ History API๋ฅผ ์ฌ์ฉํด์ ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์์ญ์์ History API๋ฅผ ์ด์ฉํด์ ํ์ฌ ํ์ด์ง ๋ด์์ ํ๋ฉด ์ด๋์ด ์ผ์ด๋ ๊ฒ์ฒ๋ผ ์๋ํ๊ฒ ํด์ค๋๋ค.
์ ์ ๊ฐ ํ ์น์ฌ์ดํธ๋ด์์ ๋ค๋ฅธ ์นํ์ด์ง๋ก ์ด๋ํ ๋๋ง๋ค ์๋ฒ๋ก๋ถํฐ html ํ์ผ๋ก ๋ "ํ์ด์ง ์ ์ฒด"๋ฅผ ๋ถ๋ฌ์์ผํจ(MPA)
=> ์ค๋ ๊ฑธ๋ฆผ, ํ๋ฉด์ด "๊น๋นก์" => ์ฌ์ฉ์ ์
์ฅ์์ ๋๋ฆฐ ๋ฐ์์ฑ => ์ฌ์ฉ์ ๊ฒฝํ ์ง ์ ํ
=> ํ์ด์ง ์ด๋ํ ๋๋ง๋ค ํ์ด์ง ์ ์ฒด๋ฅผ ๋ถ๋ฌ์ค๋ค๋ณด๋ Header๋ Nav ๊ฐ์ ์ค๋ณต๋๋ ์์๋ฅผ ๋งค๋ฒ ๋ถ๋ฅด๋ฉด,, ์๋ฒ์์ ๋ถํ์ํ ํธ๋ํฝ ๋ฐ์
SPA ๋ฑ์ฅ
ํ์ด์ง ์ ํํ ๋ HTML ๋ฌธ์ ์ ์ฒด๊ฐ ์๋, ์
๋ฐ์ดํธ์ ํ์ํ ๋ฐ์ดํฐ๋ง ์๋ฒ์์ ์ ๋ฌ๋ฐ์ ์ด ๋ฐ์ดํฐ๋ฅผ JavaScript๊ฐ ๋์ ์ผ๋ก HTML ์์๋ฅผ ์์ฑํด์ ํ๋ฉด์ ๋ณด์ฌ์ค
์ฌ์ฉ์์ ํ๋์ ๋น ๋ฅด๊ฒ ๋ฐ์ํจ => ์ฌ์ฉ์์์ ๋น ๋ฅธ ์ํธ์์ฉ์ด ๊ฐ๋ฅํจ
์๋ฒ ๊ณผ๋ถํ ๋ฌธ์ ์ํ => ์์ฒญ๋ฐ์ ๋ฐ์ดํฐ๋ง ๋๊ฒจ์ฃผ๋ฉด ๋๊ธฐ ๋๋ฌธ์
ํ๋ฉด์ด ๊น๋นก์ด์ง ์์ => ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ ์ ๊ณต
**SPA ๋ํ์ฌ๋ก
Youtube, facebook, Gmail, airbnb, Netflix
**Mockup
๋ฐ๋ชจ ์์ฐ, ํ๊ฐ๋ฅผ ์ํ ์ต์ํ์ ๊ธฐ๋ฅ๋ง ๋ด์ ๋ชจํ
๋ฐ์คํฌํฑ, ์ค๋งํธํฐ์ ํ๋ ์์ ๋ง์์ ์ง๊ด์ ์ผ๋ก ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋์์ธํ ๊ฒ
**React๋ฅผ ์ด์ฉํด ์ ํฌ๋ธ ์ฑ์ ๋ง๋ ๋ค๋ฉด?
๋ฐ๋ก ํ์ด์ง๋ฅผ ๋ง๋ค๊ธฐ๋ณด๋ค, ์ด๋ค ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ณ ์ด๋ค์ ์ด๋ป๊ฒ ์กฐํฉํ ์ง๋ถํฐ ๊ตฌ์ํด์ผ ํจ
Header ์ปดํฌ๋ํธ๋ ํญ์ ํ๋ฉด ์๋จ์ ์์นํจ.
=> ํ ๋ฒ๋ง ๋ง๋ค์ด์ ๋ชจ๋ ํ์ด์ง์์ ์ฌ์ฉํ๋๋ก ์ค๊ณ๋ก์ง ์์ฑ
ํ๋ฉด ์ค์์ ContentsList ์ปดํฌ๋ํธ๋ ์์์ ๋ด๋ ์ญํ ์ ํจ
๊ทธ ์์๋ ๋์ผํ ๋ ์ด์์์ ์์๋ฌผ๋ค์ด ๋ฐ๋ณต์ ์ธ ํํ๋ก ์กด์ฌํจ => ์์ Content ์ปดํฌ๋ํธ๋ฅผ ํ ๋ฒ๋ง ๋ง๋ค์ด ์ฌ์ฌ์ฉ
Content ์ปดํฌ๋ํธ ์๋จ : Thumbnail
Content ์ปดํฌ๋ํธ ์ค์ : Avatar, ์์์๊ฐ์ ๋ชฉ
Content ์ปดํฌ๋ํธ ํ๋จ : ์ฑ๋์ด๋ฆ, ์กฐํ์, ์
๋ก๋ํ๋ ์ง
Content ์ปดํฌ๋ํธ๋ ์์๊ณผ ๊ด๋ จ๋ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅ๋ฐ์(๊ฐ์ฒดํํ{์์ฑ&๊ฐ}), UI์ ๋ง๊ฒ ํ๋ฉด์ ์ถ๋ ฅํด ์ค
๊ทผ๋ฐ ์ด ๋ฐ์ดํฐ๋ ํด๋น ์์์ ๋๋ฌ ์์ฒญํ๊ณ ์์ ๋๋, ๋ค๋ฅธ ์์์ ์์ฒญํ ๋ ์ถ์ฒ์์์ผ๋ก์ ๋๊ธฐ ๋ชฉ๋ก์ ๋ฐ ๋๋ ๋์ผํ ๋ด์ฉ์ด ํ๋ฉด์ ์ถ๋ ฅ๋จ
์ด๋ค ์ํ๋ก ์๋๋์ ๋ฐ๋ผ ์ถ๋ ฅ๋๋ ์์น๋ง ์กฐ๊ธ์ฉ ๋ฌ๋ผ์ง ๋ฟ์
์ปดํฌ๋ํธ๊ฐ ๊ฐ์ ๊ณ ์ ์ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค๋ ์ ์? ๋ง๋ ๋ง์ด์ง๋ง, ๋ ๊ณ ์ฐจ์์ ๋ฆฌ์กํธ ๊ฐ๋ฐ์๋ผ๋ฉด,,
๊ทธ ์ ํ๋ฆฌ์ผ์ด์ ์์์ ๋ค๋ค์ง๋ ๋ฐ์ดํฐ๋ฅผ ์ปดํฌ๋ํธ๋ค๋ผ๋ฆฌ ๋ณด๋ค ์ ๊ธฐ์ ์ผ๋ก ์ฃผ๊ณ ๋ฐ์ ์ ์๋๋ก ์ค๊ณํ ์ ์์ด์ผ ํจ