JavaScript๋ ๋๋ฒ๊น
๊ณผ ๊ด๋ ค๋ ๋ด์ฉ๋๋ฌธ์ ๋ฌผ์ด๋ณด๋ ๊ฒ์ด ๋ง์๋ค.
React๋ ์ง์ง ์ค๋ฌด
๋ฅผ ์ ํ ์ ์๋์ง ํ๊ฐํ๋ ๋ด์ฉ๋ค์ด ๋ง๋ค.
1. ๊ธฐ์ ์ ์ง์๊ณผ ์ดํด๋ : ์ง์์๊ฐ React์ ๊ด๋ จ๋ ํต์ฌ ๊ฐ๋
์ ์ดํดํ๊ณ ์๋์ง ํ์ธํ๊ธฐ ์ํจ์
๋๋ค. ์ด๋ ๊ธฐ๋ณธ์ ์ธ state์ props์ ์ดํด์์๋ถํฐ ๋ ๋ณต์กํ ๊ฐ๋
์ธ ์ปดํฌ๋ํธ ๋ผ์ดํ์ฌ์ดํด, React Hooks, ๋๋ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ดํด๋๋ฅผ ํ์ธํ๋ ๋ฐ ํ์ํฉ๋๋ค.
(๋ด๊ฐ ํ๋ก์ ํธ์ ์ฌ์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด์ ๋ฆฌ๋๋ฏธ๋ฅผ ๋ณด๋ฉด ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๋์๋์ง๋ฅผ ์ ์ ์๋ค. ๋ฏธ๋ฆฌ ์๊ณ ๊ฐ์)
2. ๋ฌธ์ ํด๊ฒฐ ๋ฅ๋ ฅ : ์ค์ ๊ฐ๋ฐ ์๋๋ฆฌ์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ์ง๋ฌธ์ ํตํด, ์ง์์๊ฐ ๋ณต์กํ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง, ์ด๋ค ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋์ง ํ์
ํ๊ธฐ ์ํจ์
๋๋ค. ์ ์
๊ฐ๋ฐ์๋ผ๊ณ ํด๋, ์ค์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ํ์ํ ๊ธฐ๋ณธ์ ์ธ ๋ฅ๋ ฅ๊ณผ ์๋ก์ด ๊ฒ์ ๋ฐฐ์ฐ๊ณ ์ ์ฉํ๋ ๋ฅ๋ ฅ์ด ์ค์ํฉ๋๋ค. ์ด๋ฐ ๋ฅ๋ ฅ์ ํ๊ฐํ๊ธฐ ์ํด ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์ ์ํฉ์ ์ ์ํ๊ณ , ์ด๋ป๊ฒ ํด๊ฒฐํ ๊ฒ์ธ์ง ๋ฌผ์ด๋ณผ ์ ์์ต๋๋ค.
3. ๊ฒฝํ๊ณผ ํ์ต ๋ฅ๋ ฅ : ์ง์์๊ฐ ์ด์ ์ ํน์ ๊ธฐ์ ์ ์ฌ์ฉํ ๊ฒฝํ์ด ์๋์ง, ์๋ก์ด ๊ธฐ์ ์ ๋ฐฐ์ฐ๊ณ ์ ์ฉํ๋ ๋ฅ๋ ฅ์ด ์๋์ง๋ฅผ ํ์ธํ๊ธฐ ์ํจ์
๋๋ค. ์ ์
๊ฐ๋ฐ์๋ผ๋ฉด, ์ฃผ์ด์ง ํ์ต ์์ ๋ฐ ์๊ฐ์ ์ด๋ป๊ฒ ํ์ฉํ์ฌ ๊ธฐ์ ์ ์ต๋ํ๊ณ ๋ฐ์ ์์ผฐ๋์ง ํ์ธํ๋ ๊ฒ๋ ์ค์ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ง์์์ ์๊ธฐ ์ฃผ๋์ ํ์ต ๋ฅ๋ ฅ๊ณผ ์ด์ ์ ํ์
ํ ์ ์์ต๋๋ค.
4. ์ฑ๋ฅ ์ต์ ํ ์ดํด๋ : React๋ฅผ ์ด์ฉํ ์น ๊ฐ๋ฐ์์ ์ฑ๋ฅ์ ์ค์ํ ์ด์์
๋๋ค. ์ง์์๊ฐ ์ด์ ๋ํ ์ดํด๋๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ํ์ํ ๊ฒฝ์ฐ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์๋์ง๋ฅผ ํ์ธํ๊ธฐ ์ํจ์
๋๋ค.
React๋ฅผ ํฌํจํ ๋ชจ๋ ๊ธฐ์ (react-query, redux, mobx, babel, vite, etc ...)์ ํ์์ ์ํด ๋ง๋ค์ด ์ก๋ค.
์ฌ์ค Reac๋ฅผ ์๊ธฐ ์ํด ์์์ผ ํ ๊ฒ๋ค์ด ๋๋ฌด ๋ง์ง๋ง, ์ด๋ค ์ด์ ์์ React๊ฐ ์์๋์๋์ง๋ฅผ ์ดํดํ๋ฉด ๊ทธ ํ์ ๊ณผ์ ๋ค์ ํ์ตํ๋ ๋ฐ ๋ ๊น๊ฒ ์ดํดํ ์ ์์ ๊ฒ์ด๋ค.
React๋ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๊ธฐ ์ํด ๋ง๋ค์ด์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ๊ทธ ์ด์ ๋ ํ๋ฉด์ ๊ฐฑ์ ํ๋ ์์ ์ ํจ์จ์ ์ด๊ณ ๋น ๋ฅด๊ฒ ํ๊ธฐ ์ํจ์ธ๋ฐ, React๋ Virtual DOM์ ๋์ ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ , ์ด๋ก ์ธํด ์ฐ๋ฆฌ๋ ํ์ด์ง ์ ์ฒด๋ฅผ ๋ค์ ๋ก๋ ํ์ง ์๊ณ ๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ถ๋๋ฝ๊ฒ ์ ๋ฐ์ดํธํ ์ ์๊ฒ ๋์๋ค.
ํ์ต๋ชฉํ : React์ ๊ทธ ์ฃผ๋ณ ์ํ๊ณ
- ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง
- ์ ์ด๋ฐ ๊ธฐ์ ์ด ํ์ํ๋์ง
- ์ด ๊ธฐ์ ์ด ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํ๋์ง์ ๋ํ ๋ฐฐ๊ฒฝ
์ด ํญ๋ชฉ๋ค์ ์ดํดํ๋๊ฒ์ด ์ค์ํ๋ค. ์ถํ์ ์ ์ ํ ์ํฉ์ ์ ์ ์ฉํ๊ฒ ๋ ๊ฒ์ด๋ค.
VDOM
(๊ฐ์ฒด) ๊ฐ๋ฐcreateElement
๋ฅผ ๋ง๋ค์๋๋ฐ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์๊ฐ ์์๊ฑฐ ๊ฐ์ ์ต์ํ ๊ตฌ์กฐ์ ์๋ก์ด ํํ ๋ฐฉ๋ฒ์ ๊ฐ๋ฐ์น์ ์ด๊ธฐ์๋ HTML๊ณผ CSS๊ฐ ์ฃผ๋ฅผ ์ด๋ฃจ์์ต๋๋ค. ์ด ์๊ธฐ์๋ ์น ํ์ด์ง๊ฐ ์ ์ ์ด์์ผ๋ฉฐ, ์ฌ์ฉ์์์ ์ํธ์์ฉ์ด ๊ฑฐ์ ์์์ต๋๋ค.
JavaScript์ ๋ฑ์ฅ์ผ๋ก ์นํ์ด์ง์ ๋์ ์ธ ์์๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. ์ด ์๊ธฐ๋ถํฐ ์นํ์ด์ง๋ ์ฌ์ฉ์์ ์ํธ์์ฉํ ์ ์๊ฒ ๋์์ต๋๋ค.
<!-- ์๋ ์ fetch -->
<form action="...api์ฃผ์" method="post">
</form>
์ด ์๊ธฐ์๋ AJAX(Asynchronous JavaScript And XML)์ ๋ฑ์ฅ์ผ๋ก ์นํ์ด์ง๊ฐ ๋ถ๋ถ์ ์ผ๋ก ์ ๋ฐ์ดํธ๋ ์ ์๊ฒ ๋์์ต๋๋ค. ์ด๋ก ์ธํด ํ์ด์ง ์ ์ฒด๋ฅผ ๋ค์ ๋ก๋ํ์ง ์๊ณ ๋ ์ฌ์ฉ์์ ์ํธ์์ฉํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ฐ๋ฅํด์ก์ต๋๋ค.
Google Maps๊ฐ ์ฝ๊ฐ ์ ๋์ฃผ์ ๋๋์ธ๋ฐ, ์ธํฐ๋ํฐ๋ธํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฅ์ฑ์ ์ด์ด์ค ์๋น์ค์ ๋๋ค.
์ด ์๊ธฐ์๋ jQuery์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฑ์ฅํ์์ต๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ธ๋ผ์ฐ์ ๊ฐ์ ์ฐจ์ด๋ฅผ ์ถ์ํํ๊ณ , JavaScript๋ฅผ ๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ฃผ์์ต๋๋ค. (DOM API๋ฅผ ์ฌ์ฉํ๊ธฐ๊ฐ ๋๋ฌด ํ๋ค์์)
์ด ์๊ธฐ์๋ AngularJS, Backbone.js์ ๊ฐ์ MVC(Model-View-Controller) ํ๋ ์์ํฌ๊ฐ ๋ฑ์ฅํ์์ต๋๋ค. ์ด ํ๋ ์์ํฌ๋ค์ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์กฐ๋ฅผ ์ฒด๊ณํํ๊ณ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๋๋ฐ ๋์์ด ๋์์ต๋๋ค.
์ด ์๊ธฐ์๋ React, Vue.js์ ๊ฐ์ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ ํ๋ ์์ํฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฑ์ฅํ์์ต๋๋ค. ์ด๋ค์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ๋ก ๋ถ๋ฆฌํ๊ณ , ์ํ ๊ด๋ฆฌ๋ฅผ ๋ณด๋ค ์ฝ๊ฒ ํ ์ ์๋๋ก ๋์์ฃผ์์ต๋๋ค.
CSR(Client Side Rendering) ์ ๋ชจ๋ ๋ ๋๋ง์ ํด๋ผ์ด์ธํธ ์ธก์์ ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋ ์๋ฒ์ ๋ถํ๋ฅผ ์ค์ด๊ณ ๋์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋ ๋ฐ ์ ๋ฆฌํ์ง๋ง, ์ด๊ธฐ ํ์ด์ง ๋ก๋ฉ ์๋๊ฐ ๋๋ฆด ์ ์์ผ๋ฉฐ SEO ๋ฌธ์ ๊ฐ ์์ ์ ์์ต๋๋ค. ๊ทธ๋์ ์์ฆ์๋ CSR๊ณผ SSR, SSG, ISR์ ์ ์ ํ ์กฐํฉํ์ฌ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
DOM (Document Object Model) API : ์น ์ด์ฐฝ๊ธฐ(1990๋ ๋ ์ค๋ฐ)๋ถํฐ ๋ฑ์ฅํ๋ค. ์ด๋ ์น ํ์ด์ง์ ๋ด์ฉ์ ํ๋ก๊ทธ๋๋ฐ์ ์ผ๋ก ์กฐ์ํ ์ ์๋๋ก ํด์ฃผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.
DOM API๋ HTML๊ณผ XML ๋ฌธ์์ ๊ตฌ์กฐ๋ฅผ ํํํ๋ ํ์ค ๋ชจ๋ธ์ด๋ฉฐ, ์ด๋ฅผ ํตํด ๋ฌธ์์ ๊ตฌ์กฐ, ์คํ์ผ, ๋ด์ฉ ๋ฑ์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ค. JavaScript์ ๊ฒฐํฉ๋๋ฉด, ์น ํ์ด์ง์ ์ฌ์ฉ์์ ์ํธ์์ฉ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค. (jQuery ๋ฑ์ฅ์ ๊น์ง ์ข์๋ค)
๋จ์ํ๊ฒ
๋ง๋ค์ด์ค๊ฒ ๋ผ๊ณ ํ๋ ์ปจ์
ํฌ์ฅํ์ ๋ฟ
๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ๋ค.์ฌ๊ธฐ์ React๋ 1ํ nํผ๋ฅผ ์ํ ์ปจ์ ์ ๋ฐ๊ฒฌ!
DOM ์์ฒด๋ฅผ ์ฐ์ง ์๋ ๊ฒ โก๏ธ (VDOM ๊ฐ๋ฐ)์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ํจ๋ฌ๋ค์์ด ํ๊ธฐ์ ์ผ๋ก ๋ฐ๋
๋ง์ ๊ธฐ๋ฅ๋ค์ ๋ด์ผ๋ ค๊ณ ํ์ง ์๊ณ ๊ธฐ๋ณธ ํ๋ง ์๊ฒ ์์ํ์
mock
์ด๋ผ๋ ๊ฐ์ง DOM์ ์ ๊ณตํด์ real DOM๊ณผ์ ์ฐ๊ฒฐ์ฑ ์ต์ํ์ด๊ธฐ React์ ๋ชฉ์ :
SPA๋ฅผ ๋ง๋ฆ์ ์์ด์ ๋ชจ๋ ๊ฒ์ ์ ๊ณตํ๋ ค๋๊ฒ์ด ์๋๋ผ user interface(UI) ๋ถ๋ถ๋ง์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ณ ์ถ์์
์์ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ํ๋ฉด ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค ์ ์์๊น ์ง๊ธ ์ฝ๋์ ํน์ง์ ์ดํด๋ณด๋ฉด?
ํ๊ทธ๋ช
, props๋ค
, n๊ฐ์ ์์๋ค
์ด ์๋ค!DOM API ๋ถํธํ๋ค. ๊ตฌ์กฐ๊ฐ ํ ๋์ ๋ค์ด์ค์ง ์๋๋ค.
ํ์ง๋ง ๋์ฒด์ ๊ฐ ์์์์?
๊ทธ๋ ๋ค๋ฉด React๊ฐ๋ฐ์๋ค์ ์ด๋ค ์๊ฐ์ ํ์๊นโฆ?
DOM API๋ฅผ ๋ชจ๋ ๋ฒ๋ฆด ์ ์์ง๋ง ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๋ฒ๋ ค๋ณด์!
์ด๋ป๊ฒ?
โก๏ธ ๊ฐ๋ฐ์์๊ฒ๋ โDOMโ์ ์ฃผ์ง ๋ง์
โก๏ธ ์ฐ๋ฆฌ๊ฐ DOM์ ์กฐ์ํ๋ ๊ฒ์ ์ ๊ณต(VDOM)ํด์ฃผ๊ณ ์ค์ง์ ์ธ ์ ์ด๋ React๊ฐ ํ์
๋ณธ๋ DOM ๊ฐ์ ๊ฒฝ์ฐ๋ ๊ทธ๋ฅ ๋ฌธ์์ด์ด์๋ htmlํ์ผ์ Object๋ก ๋ง๋ ๊ฒ์ด๋ค. ๋ธ๋ผ์ฐ์ ์ ์ฅ์์ ๋ค๋ฃจ๊ธฐ ๊น๋ค๋ก์ด ๋ฌธ์์ด๋ก ๋์ด์๋ ํ์ผ์ ์ด๋ป๊ฒ ํ๋ฉด ํ๋ฉด์ ํจ๊ณผ์ ์ผ๋ก ๋ ๋๋ง ์ํฌ ์ ์์์ง ์๊ฐํ์ ๋, ๋ฌธ์์ด์ ๋ค๋ฃจ์ง ๋ง์ ๋ผ๋ ๊ฒฐ๋ก ์ ๋ด๋ ธ๊ณ ๋ฌธ์์ด์ ํจ์ฌ ๋ค๋ฃจ๊ธฐ ์ฌ์ด ๊ฐ์ฒด๋ก ๋ง๋ค์ด ๋ณด์๋ผ๋ ์์ด๋์ด์์ ์์ํ๋ค
DOM์ ๊ต์ฅํ ๋ณต์กํ ๊ฐ์ฒด์ธ๋ฐ ์ด๋ป๊ฒ ๋ค๋ค์ผ ํ ๊น
1. ๋ณต์กํ๊ฒ์ ๊ฐ๋จํ ๊ฒ์ผ๋ก ๋ฐ๊พผ๋ค
๋ณต์กํ DOM ๊ฐ์ฒด๋ฅผ ๊ฐ๋จํ ๊ฐ์ฒด๋ก ๋ฐ๊พธ์
2. ๊ฐ๋จํ ๊ฐ์ฒด๋ฅผ ๋ค์ ๋ณต์กํ DOM
์ผ๋ก ๋ฐ๊พธ๋ ๋ฌด์ธ๊ฐ๋ฅผ ๋ง๋ค์
html ๋งํฌ์
์ ๊ฐ์ฒด๋ก ๋ณํํด ๋ณด์
๋ณต์กํ๊ฒ์ ๊ฐ๋จํ ๊ฒ์ผ๋ก ๋ฐ๊พผ๋ค
// ์ด ๊ฐ์ฒด ์์ ์ด๋ค ๋ชจ์์ผ๋ก ๋ง๋ค ๊ฒ์ธ๊ฐ?
const vdom = {
tag: 'ul',
props: {},
children: [],
};
// children์์๋ vdom์ด ๋ ๋ค์ด๊ฐ์ง ๊ฒ์ด๋ค.
// ์ด ๊ฐ์ฒด ์์ ์ด๋ค ๋ชจ์์ผ๋ก ๋ง๋ค ๊ฒ์ธ๊ฐ?
<ul>
<li><a><span></span></a></li>
</ul>
const vdom = {
tag: 'ul',
props: {},
children: [
{
tag: 'li',
props: {},
children: [
{
tag: 'a',
props: {},
children: [{ tag: 'span', props: {}, children: [] }],
},
],
},
],
};
๊ฐ๋จํ ๊ฐ์ฒด๋ฅผ ๋ค์ ๋ณต์กํ DOM์ผ๋ก ๋ฐ๊พธ๋ ๋ฌด์ธ๊ฐ๋ฅผ ๋ง๋ค์ : createDOM function
html :: <h1 className="greet">hello world</h1>
node : { tag: 'h1', props: { className: "greet" }, children: ['hello world'] }
function createDOM(node) {
// DOM์ ํธ๋ฆฌ๊ตฌ์กฐ ์ด๋ฏ๋ก ์ฌ๊ทํจ์ ์กฐ๊ฑด์ด ํ์ํ๋ค
// if (typeof node === 'string') {
// return document.createTextNode(node);
// }
const element = document.createElement(node.tag);
// h1์ผ๋ก ๋ element๋ฅผ create
node.children
.map(createDOM)
.forEach(element.appendChild.bind(element));
return element;
}
createDOM
์ ๊ทธ๋๋ก ์ค๋คelement
๋ฅผ return ํ๋ค๋ฐ๊นฅ scope element์ ์์์์
๊ฐ ๋์ด์ผ ํ๋คbind
๋ฅผ ์ฌ์ฉํ๋คVDOM ๊ฐ์ฒด์ ๊ตฌ์กฐ๊ฐ ์ธ๊ฐ์ ์์ฑ์ ๊ฐ์ง๋ ๊ฐ์ฒด์ ๋จ์ ๋ฐ๋ณต์ด๋ผ๋ ์๊ฐ์์ ํ๋ณด์.
๊ฒฐ๊ตญ ๊ทธ ์ธ๊ฐ์ ์์ฑ์ ๊ฐ๊ณ ์๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ํจ์๋ฅผ ํ๋ ๋ง๋ค๋ฉด ๊ทธ ํจ์๋ฅผ ๋ฐ๋ณต ํธ์ถ ํ๋ฉด์ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด ๋ผ ์ ์๋ค.
createElement('h1', {className: "hi"}, children : ['hello'])
export function createElement(tag, props, ...children) {
return { tag, props, children };
}
children์ ์ค์ ๋ก ๋ฐฐ์ด์ด ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ createElement ์์ฒด์ ๊ฐ๋ณ์ธ์๋ฅผ ๋ง๋ค์ด์ค๋ค.
const vdom = {
tag: 'div',
props: {},
children: [
{
tag: 'h1',
props: {},
children: ['Hello, React!'],
},
{
tag: 'ul',
props: {},
children: [
{
tag: 'li',
props: {},
children: ['์ฒซ ๋ฒ์งธ ์์ดํ
'],
},
{
tag: 'li',
props: {},
children: ['๋ ๋ฒ์งธ ์์ดํ
'],
},
{
tag: 'li',
props: {},
children: ['์ธ ๋ฒ์งธ ์์ดํ
'],
},
],
},
],
};
const vDom = createElement(
'div',
{},
createElement('hi', {}, 'Hello, hi'),
createElement(
'ul',
{},
createElement('li', { style: 'color: blue' }, '์ฒซ ๋ฒ์จฐ ๊ฐ๊ฒ ใ
'),
createElement('li', { style: 'color: red' }, '๋ ๋ฒ์จฐ ๊ฐ๊ฒ'),
createElement('li', { style: 'color: yellow' }, '์ธ ๋ฒ์จฐ ๊ฐ๊ฒ')
)
);
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
const vDom = createElement(
'ul',
{}, // props
createElement(li, {}, 1) // children
)
createElement ์์ฒด๊ฐ ๊ฐ๋ณ ์ธ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋์ด์๋ค๋ณด๋, UI๊ฐ ๋ง์์ง๋ฉด ๊ต์ฅํ ๋ณต์กํด ์ง ๊ฒ์ด๋ค.
๋ ํธ๋ฆฌํ ์ฌ์ฉ์ฑ์ ์ ๊ณตํ๊ธฐ ์ํด์ ์ด๋ป๊ฒ ํด์ผํ ๊น? โก๏ธ JSX ๋ฑ์ฅ
์ด๊ธฐ์ ๊ฐ๋ฐ์์ createElement
ํ๊ทธ์ prop, children ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ํจ์๋ฅผ ํ๋ ๋ง ๋ง๋ค์์ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ ์ด ๋ฐฉ์์ ์ต์์น ์์์ ์ ์์ฐ์ด๊ฒ ๋ ๊ฒ ๊ฐ์ผ๋ ์ต์ํ ํฌ๋งท์ผ๋ก ๋ง๋ค์ด ๋ณด์.
ํจ์ ํธ์ถ ๋ฐฉ๋ฒ, markup ๋ฐฉ๋ฒ
ํํ๋ html ํ๊น ํ๋ฏ์ด ์ฝ๋ฉํ๋ฉด ๋ด๋ถ์ ์ผ๋ก๋ createElement ํจ์๊ฐ ๋์ํ๋ ์์ผ๋ก ๋ง๋ค๊ธฐ
markup ๋ฐฉ์์ ์ฌ์ฉํด ๋ง๋ ์ฝ๋์ด๋ค.
const vdom2 = (
<p>
<h1>React ๋ง๋ค๊ธฐ</h1>
<ul>
<li style="color: red">์ฒซ ๋ฒ์งธ ์์ดํ
</li>
<li style="color: blue">๋ ๋ฒ์งธ ์์ดํ
</li>
<li style="color: yellow">์ธ ๋ฒ์งธ ์์ดํ
</li>
</ul>
</p>
);
// render(App, document.getElementedById('root'))
render(vdom2, document.querySelector('#root'));
loader
์๊ฒ ์ ๋ฌ ๋๊ฒ๋ ๋์ด์๋ค.
@babel/preset-react
๋? ์ค์ ๋ฐ๋ฒจ ํ๋ฌ๊ทธ์ธ ์ค ํ๋๋ก, ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์์ ํฌํจ๋์ด ์๋JSX
์ฆ, markup์ ์๋์ง๋ง ์ค์ ๋ก ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ณ ์๋ ๋ฌธ๋ฒ์ ๋ฐ๊ฟ์ค๋ค.
JSX โก๏ธ createElement
์ค์ ๋ณํ๋ ์ฝ๋๋ฅผ ๋ณด๋ฉดReact.createElement
๋ผ๊ณ ๋์ด์๋๊ฒ์ ํ์ธํ ์ ์๋๋ฐ, ์ฐ๋ฆฌ๋ React๋ฅผ import ํด์ฃผ์ง ์์์ ์์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋๋ ๊ฒ์ด๋ค.
import React from 'react';
๋ฅผ ๊ผญ ๊ธฐ์
ํด์ฃผ์ด์ผ ํ๋ค.
์ฌ์ ํ runtime ์ค๋ฅ๊ฐ ๋๋ ์ํฉ์์ ์ด๋ป๊ฒ ํด๊ฒฐํด์ผ ํ ๊น?
์ค๋ฅ๋ฅผ ์ดํด๋ณด๋ฉด null
์ด๋ undefined
๋ฅผ convert ํ์ง ๋ชปํ๋ค๊ณ ๋์์๋ค. ์ฐ๋ฆฌ๋ props๋ฅผ ๋น ๊ฐ์ฒด{}
๋ก ๋ณด๋ด์ค์ผ ํ๋๋ฐ ํ์ฌ๋ null
๋ก ๋ณด๋ด์ง๊ณ ์๋ ์ํ์ด๋ค.
export function createElement(tag, props = {}, ...children) {
return { tag, props, children };
}
์ด๋ props์ ๊ฐ์ด ์์ ๋ {} ๋น๊ฐ์ฒด๋ก ๊ฐ์ ์ค์ ํ๋ ๊ฒ์ props์ ๊ฐ์ด undefined ์ผ๋๋ง ์ก์ ์ ์๋ค. ๋ฐ๋ผ์ ํ์ฌ๋ null(object ์ทจ๊ธ)์ด ๋์ด ์๋ํ์ง ์๋๋ค.export function createElement(tag, props, ...children) {
props = props ?? {};
return { tag, props, children };
}
์ด ์ฝ๋ ์ฒ๋ผ ๋ฐฉ์ด ์ฝ๋๋ฅผ ๋ง๋ค์ด ์๋ํ๊ฒ ํ๋ค.createElement ๋ผ๊ณ ํ๋ ํจ์๋ฅผ ํธ์ถํ๋ โ์ฝ๋โ๋ก ๋ณํํ๋ ๋ฐฉ์์ ๊ธฐ์ธํ ์ ์ฝ์ฌํญ ์ฒดํฌ
import React from 'react';
import { /**createElement**/, render } from './react';
React์์๋ ์ด๋ฌํ ์๊ฐ ์๋ค.
import React from 'react'
// ํญ์ React๋ฅผ import ํด์ค์ง ์์ผ๋ฉด ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
// ์ ? Build ๋ ํ์ผ์์ React.createElement ๋ฅผ ์ฐพ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์
Virtual DOM์ ์ค์ DOM์ ์ถ์ํํ ๊ฐ๋ ์ผ๋ก์, ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์์ผ๋ก ์กด์ฌํ๋ DOM์ ํํ์ ๋๋ค. ์ด๋ JavaScript ๊ฐ์ฒด๋ก์ ์กด์ฌํ๋ฉฐ, ์ค์ DOM๊ณผ๋ ๋ณ๋๋ก ์กด์ฌํฉ๋๋ค.
์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋(props๋ state๊ฐ ๋ณ๊ฒฝ๋ ๋) ๋ง๋ค ์๋ก์ด Virtual DOM ํธ๋ฆฌ๊ฐ ์์ฑ๋ฉ๋๋ค. ์ด ์๋ก์ด ํธ๋ฆฌ์ ์ด์ ํธ๋ฆฌ๋ฅผ ๋น๊ตํ์ฌ(์ด๋ฅผ Diffing ์ด๋ผํจ), ์ค์ DOM์์ ํ์ํ ์ต์ํ์ ๋ณ๊ฒฝ์ฌํญ๋ง์ ๊ณ์ฐํฉ๋๋ค. ์ดํ, ์ด ๋ณ๊ฒฝ์ฌํญ์ ์ค์ DOM์ ๋ฐ์ํ๋ ๊ณผ์ ์ Reconciliation์ด๋ผ๊ณ ํฉ๋๋ค.
DOM ์กฐ์์(๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ) ๋น์ฉ์ด ๋ง์ด ๋๋ ์์
์ด๋ฉฐ, ํนํ ์์ฃผ ๋ฐ์ํ ๊ฒฝ์ฐ ์ฑ๋ฅ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
Virtual DOM์ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋์
๋์์ต๋๋ค. ์ด๋ฅผ ํตํด, ์ค์ DOM์ ์ง์ ์ ์ธ ๋ณ๊ฒฝ์ด ์๋๋ผ,
Virtual DOM์ ๋ณ๊ฒฝ์ ๋จผ์ ์ ์ฉํ๊ณ (๋ ๋๊ณผ์ ), ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ค์ DOM์ ํ ๋ฒ์ ๋ฐ์ํจ(์ปค๋ฐ๊ณผ์ )์ผ๋ก์จ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
Real DOM์ ์นํ์ด์ง์ ๊ตฌ์กฐ๋ฅผ ํํํ๋ ์ค์ ๊ตฌ์กฐ์ด๋ฉฐ, ์นํ์ด์ง์ ์ง์ ์ ์ผ๋ก ๋ฐ์๋๋ ๋ด์ฉ์
๋๋ค.
๋ฐ๋ฉด Virtual DOM์ ๋ฉ๋ชจ๋ฆฌ์์ ์กด์ฌํ๋ JavaScript ๊ฐ์ฒด๋ก์, ์ค์ DOM์ ๋ณต์ฌ๋ณธ ๊ฐ์ ์ญํ ์ ํฉ๋๋ค.
Diffing์ ๋ ๊ฐ์ Virtual DOM ํธ๋ฆฌ(์ปค๋ฐ๊ณผ์ ๊ณผ ๋ ๋๊ณผ์ ์ Virtual DOM)๋ฅผ ๋น๊ตํ์ฌ ๋ ํธ๋ฆฌ ๊ฐ์ ์ฐจ์ด๋ฅผ ์ฐพ๋ ๊ณผ์ ์
๋๋ค.
์ด ์ฐจ์ด๋ diff๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ์ด diff๋ฅผ ์ฌ์ฉํด ์ค์ DOM์ ์
๋ฐ์ดํธํ๋ ๊ฒ์ด Reconciliation
๊ณผ์ ์
๋๋ค.
React ์์ ์ปดํฌ๋ํธ์ ์
๋ฐ์ดํธ๋ ์ฃผ๋ก ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค. ์ํ(state)์ ๋ณ๊ฒฝ๊ณผ ์์ฑ(props)์ ๋ณ๊ฒฝ์
๋๋ค.
useState
๋๋ this.setState
(ํด๋์ค ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ)๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ฉด, React๋ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋ ๋๋ง ํฉ๋๋ค.React ๋ด๋ถ์์ ์ด๋ฌํ ๋ณ๊ฒฝ์ ๊ฐ์งํ๊ณ , ํ์ํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ๋ ๋๋งํ๊ธฐ ์ํด Reconciliation ํ๋ก์ธ์ค๋ฅผ ์ํํฉ๋๋ค. ์ด๋ ์๋ก์ด Virtual DOM ํธ๋ฆฌ์ ์ด์ ํธ๋ฆฌ๋ฅผ ๋น๊ตํ์ฌ ๋ ์ฌ์ด์ ์ฐจ์ด๋ฅผ ์ฐพ์๋ด๋ ๊ณผ์ (๋ ๋๊ณผ์ )์ธ๋ฐ, ์ด๋ฅผ ํตํด ์ค์ DOM์๋ ํ์ํ ์ต์ํ์ ๋ณ๊ฒฝ๋ง์ด ์ ์ฉ(์ปค๋ฐ๊ณผ์ )๋๊ฒ ๋ฉ๋๋ค.
React์ Reconciliation ๊ณผ์ ์ ๋งค์ฐ ํจ์จ์ ์ ๋๋ค. ์ด๋ ๋ ๊ฐ์ง ๊ฐ์ ์ ๊ธฐ๋ฐํฉ๋๋ค :
key
prop์ ํตํด, ์ฌ๋ฌ ๋ ๋๋ง ์ฌ์ด์์ ์ด๋ค ์์ ์์๊ฐ ๋ณ๊ฒฝ๋์ง ์์์ผ ํ ์ง ํ์ํ ์ ์๋ค.์ด๋ฌํ ๊ฐ์ ๋ค์ React๊ฐ Diffing ์๊ณ ๋ฆฌ์ฆ์ O(n)์ ๋ณต์ก๋๋ก ๋ง๋ค์ด, ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
์ฆ, React๋ ์ํ์ ์์ฑ์ ๋ณ๊ฒฝ์ ํตํด ์ปดํฌ๋ํธ์ ์
๋ฐ์ดํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๊ณ , ์ด๋ฅผ ํตํด ๋์ ํจ์จ์ฑ๊ณผ ๋น ๋ฅธ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํญ์ ๊ทธ๋ ๋ค๊ณ ๋งํ ์๋ ์์ต๋๋ค. Virtual DOM์ด ์ฑ๋ฅ์ ํฅ์์ํค๋ ๊ฒฝ์ฐ๋ ์ฌ๋ฌ ๋ฒ์ ์์ ๋ณ๊ฒฝ์ฌํญ์ด ๋ง์ด ๋ฐ์ํ ๋ ์
๋๋ค.
ํ์ง๋ง ๋ณํ๊ฐ ๋ง์ด ์๋ ๊ฒฝ์ฐ๋ ์ค์ DOM์ ์ง์ ์กฐ์ํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ผ ์ ์์ต๋๋ค. (React๋ฅผ ์ฌ์ฉํ์ง ์์ ๋)
๊ทผ๋ฐ React ์ฐ๋ฉด VDOM ๋ค๋ฃจ๋๊ฒ ๋ง๋ค.
Virtual DOM์ ํ์ํ ์ต์ํ์ ๋ณ๊ฒฝ๋ง์ ์ค์ DOM์ ๋ฐ์ํจ์ผ๋ก์จ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค. ์ฆ, ๋ชจ๋ ๋ณ๊ฒฝ์ฌํญ์ ์ฆ์ ์ค์ DOM์ ๋ฐ์ํ๋ ๋์ , ๋ณ๊ฒฝ์ฌํญ์ ํ๊บผ๋ฒ์ ๋ชจ์์ ์ฒ๋ฆฌํจ์ผ๋ก์จ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
๋ ๋๋ง์ ๊ณผ์ ์ ํฌ๊ฒ ์ธ ๊ฐ์ง ๋จ๊ณ(Trigging, Render Phase, Commit Phase)๋ก ๋๋ ์ ์๋ค. ๊ทธ๋ฌ๋ ๊ธฐ์ตํ ์ ์ ์ด ๋ชจ๋ ๊ณผ์ ์ด ๋๊ธฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง์ง ์๊ณ ๋น๋๊ธฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค๋ ์ ์ด๋ค. ์ด๊ฒ์ React์ ์ฑ๋ฅ ์ต์ ํ์ ์ค์ํ ์ญํ ์ ํ๋ค.
๊ทธ๋ ๋ค๊ณ (๋น๋๊ธฐ๋ผ๊ณ ํด์) Promise๋ ์๋
โก๏ธ ๋จ์ง ํด๋น ์์ ์ด ์ฆ์ ์๋ฃ๋์ง ์๊ณ , ์์คํ ์ ๋ค๋ฅธ ๋ถ๋ถ์ด ํด๋น ์์ ์ ์๋ฃํ ์ ์๋๋ก ์ผ๋ถ ์๊ฐ์ ๊ธฐ๋ค๋ฆฐ๋ค๋ ๊ฒ์ ์๋ฏธํจReact์ Concurrent Mode์์๋ ๋ ๋๋ง ์์ ์ด ๋น๋๊ธฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ก ์ค์ผ์ค๋ง ๋๋ค. ์ฆ, ์ด ์์ ์ ๋ฉ์ธ ์ค๋ ๋์์ ๋์ด์ง ์ ์๊ณ , ํ์ํ ๊ฒฝ์ฐ์ ๋ค์ ์์๋ ์ ์๋ค. ์ด๋ฅผ ํตํด ๋ธ๋ผ์ฐ์ ๊ฐ ๋์์ ๋ค๋ฅธ ์์ ์ ์ํํ ์ ์๋ ์๊ฐ์ ํ๋ณดํ๊ฒ ๋๋ค.
์ด๋ฌํ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ React์ Fiber ์ํคํ ์ฒ์ ๊ธฐ๋ฐํฉ๋๋ค. Fiber๋ React์ ๋ด๋ถ์ ์ธ ์ ๋์ผ๋ก, ์ปดํฌ๋ํธ์ ๋ํ ์์ ์ ๋ํ๋ธ๋ค. React๋ ์ด๋ฐ Fiber๋ค์ ํตํด ๋ ๋๋ง ์์ ์ ์ฌ๋ฌ ์์ ๋ถ๋ถ์ผ๋ก ๋๋๊ณ , ์ด๋ฅผ ๋ณ๋ ฌ ์ฒ๋ฆฌํ๋๋ก ์ค์ผ์ค๋ง ํ ์ ์๋ค.
๊ทธ๋ฌ๋ ์ด๋ฌํ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ์ฌ์ฉ์ ์ฝ๋ ์ธก๋ฉด์์๋ ์ง์ ๊ด๋ฆฌํ๊ฑฐ๋ ์ ์ดํ ์ ์๋ ๊ฒ์ด ์๋๋ค. ์ฌ์ฉ์๋ setState๋ useEffect์ ๊ฐ์ React API๋ฅผ ์ฌ์ฉํ์ฌ ์ํ ๋ณ๊ฒฝ์ ์์ฒญํ๊ณ , ๊ทธ๋ฌ๋ฉด React๋ ์ด๋ฅผ ์ ์ ํ๊ฒ ์ค์ผ์ค๋งํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค.
Fiber๊ฐ ๋ฌด์์ธ๊ฐ?
- Fiber Node: Fiber๋ React ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๋ํ๋ด๋ JavaScript ๊ฐ์ฒด์ ๋๋ค. ์ด๋ ์ปดํฌ๋ํธ์ ์ํ, ๋ผ์ดํ์ฌ์ดํด ๋ฑ์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ต๋๋ค. Fiber Node๋ ์ปดํฌ๋ํธ์ ์์ ๋จ์๋ฅผ ๋ํ๋ ๋๋ค.
- Fiber Tree: Fiber Node๋ค์ Fiber Tree๋ฅผ ํ์ฑํ๊ฒ ๋ฉ๋๋ค. ์ด๋ DOM ํธ๋ฆฌ์ ๋น์ทํ์ง๋ง, ๊ฐ ๋ ธ๋๊ฐ ์์ ๋จ์์ธ Fiber๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
- Reconciliation and Rendering: Fiber ์ํคํ ์ฒ๋ ๋ ๋จ๊ณ๋ก ์์ ์ ๋๋๋๋ค. ์ฒซ์งธ, Reconciliation ๋จ๊ณ์์๋ ์๋ก์ด Fiber Tree๋ฅผ ์์ฑํ๊ณ diffing์ ์ํํฉ๋๋ค. ๋์งธ, Commit ๋จ๊ณ์์๋ ์ค์ DOM์ ๋ณ๊ฒฝ์ฌํญ์ ๋ฐ์ํฉ๋๋ค.
- Cooperative Scheduling and Concurrent Mode: Fiber๋ ์์ ์ ์ค๋จํ๊ณ ๋ค์ ์์ํ๋ ๋ฅ๋ ฅ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ฅผ Cooperative Scheduling์ด๋ผ๊ณ ํ๋ฉฐ, ์ด๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋์์ ๋ค๋ฅธ ์ค์ํ ์์ ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค. ๋ํ, ์ด๋ฅผ ํตํด ์ฌ๋ฌ ๊ฐ์ ์์ ์ ๋์์ ์ฒ๋ฆฌํ๋ Concurrent Mode๊ฐ ๊ฐ๋ฅํด์ง๋๋ค.
ํธ๋ฆฌ๊น
๋จ๊ณ๋ ์ํ ๋๋ ์์ฑ์ ๋ณํ๋ฅผ ๊ฐ์งํ๊ณ React์๊ฒ ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋งํ๋๋ก ์ง์ํ๋ ๋จ๊ณ์ด๋ค.
์ด๋ setState
๋ฉ์๋ ๋๋ useState
ํ
์ ํตํด ์ํ๋ ์ ์๋ค. ๋ํ, ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์๋ก์ด props๋ฅผ ์ ๋ฌ ๋ฐ์ ๋๋ ์ด ํธ๋ฆฌ๊น
๋จ๊ณ๊ฐ ๋ฐ์ํ๋ค.
๋ ๋ ๋จ๊ณ์์๋ React๊ฐ ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ์๋กญ๊ฒ ์์ฑํ๊ฑฐ๋ ๊ฐฑ์ ํ๊ฒ ๋๋ค. ์ด ๋ ์์ฑ๋๋ ๊ฒ์ ์ค์ DOM์ด ์๋๋ผ Virtual DOM์ด๋ค. ์๋ก์ด Virtual DOM ํธ๋ฆฌ๋ ์ด์ ํธ๋ฆฌ์ ๋น๊ต๋ ๊ฒ์ด๋ฉฐ, ์ด๋ ๋ณ๊ฒฝ์ฌํญ(diff)์ ํ์ ํ๊ธฐ ์ํจ์ด๋ค. ์ด ๋จ๊ณ์์๋ ์ค์ DOM์ ์ด๋ค ๋ณํ๋ ๋ฐ์ํ์ง ์๋๋ฐ ์ด๋ ์์ง ๋ณ๊ฒฝ์ฌํญ์ ๊ณ์ฐํ๋ ์ค์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ปค๋ฐ ๋จ๊ณ์์๋ ์ค์ DOM์ด ์ ๋ฐ์ดํธ ๋๋ค. ์ด ๋จ๊ณ์์๋ Reconciliation ๊ณผ์ ์ ๊ฑฐ์ณ ๊ณ์ฐ๋ ๋ณ๊ฒฝ์ฌํญ๋ค์ด ์ค์ DOM์ ๋ฐ์๋๋ค. ์ด ๊ณผ์ ์ ํตํด ์ฌ์ฉ์๋ UI์ ๋ณํ๋ฅผ ๋ณผ ์ ์๊ฒ ๋๊ณ ๋ํ, ์ด ๋จ๊ณ์์๋ ํ์ํ ๊ฒฝ์ฐ ๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋๋ค์ด ํธ์ถ๋๋ค.
์ด ๊ณผ์ ์ ํตํด React๋ ์ฑ๋ฅ์ ์ต์ ํํ๋ฉฐ, ๋น ๋ฅธ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๊ฒ ๋ฉ๋๋ค. setState๋ useState๋ฅผ ํธ์ถํ๊ฑฐ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์ props๋ฅผ ์ ๋ฌ๋ฐ๋ ๊ฒ์ผ๋ก ์์ํ์ฌ, ์๋ก์ด Virtual DOM ํธ๋ฆฌ๋ฅผ ์์ฑํ๊ณ , ์ด์ ํธ๋ฆฌ์ ๋น๊ตํ์ฌ ๋ณ๊ฒฝ์ฌํญ์ ์ฐพ์๋ด๊ณ , ๊ทธ ๋ณ๊ฒฝ์ฌํญ์ ์ค์ DOM์ ๋ฐ์ํ๋ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค. ์ด๋ ๊ฒ ํ์ฌ React๋ ๋ณํ๊ฐ ๋ง์ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ๋ฐ์ด๋ ์ฑ๋ฅ์ ์ ์งํฉ๋๋ค.