๋ฆฌ์กํธ ๋ฐฐ์นญ(Batching)์ ๋ชจ๋ ๊ฒ
๋ฆฌ์กํธ ๋ฐฐ์นญ(Batching)์ ๋ชจ๋ ๊ฒ ๊ด๋ จ
2022๋ 3์, ๋ด์ด ์์๋๋ฉด์ ๋ฆฌ์กํธ ์ธ๊ณ์๋ ์๋ก์ด ๋ณํ์ ๋ฐ๋์ด ๋ถ์ด์์ต๋๋ค. ๋ฆฌ์กํธ 18๋ฒ์ ์ด ์ถ์๋์๋๋ฐ, ์ด์ ๋ฒ์ ์ธ ๋ฆฌ์กํธ 17์ด ๋ฆฌ์กํธ 16์ ๋นํด ํฌ๊ฒ ๋ฌ๋ผ์ง ์ ์ด ์๋ค๋ ํ์ ๋ฐ์๋ ๊ฒ๊ณผ๋ ๋ฌ๋ฆฌ, ๋ฆฌ์กํธ 18์์๋ ์ฌ๋ฌ ์๋ก์ด ๊ธฐ๋ฅ์ด ์๊ฐ๋์ด ๋ง์ ๊ฐ๋ฐ์๋ค์ ๊ด์ฌ์ ๋์์ต๋๋ค. ๋์์ฑ ๋ชจ๋์ ์๋ ๋ฐฐ์นญ(Automatic Batching)์ ํฌํจํ ๋ค์ํ ์คํ์ ์ด์ง๋ง ์ ์ฉํ ๊ฐ๋ฐ ๊ธฐ๋ฅ๋ค์ด ๊ทธ ์ค์ฌ์ ์์์ต๋๋ค.
๊ทธ์ค์์๋ ์๋ ๋ฐฐ์นญ์ 2๋ ์ด ์ง๋ ์ง๊ธ๊น์ง ๋ง์ ๊ฐ๋ฐ์๋ค์ด ์ฝ๊ฒ ์ ๊ทผํ๊ณ ์ดํดํ ์ ์๋ ์ ์ฉํ ๊ธฐ๋ฅ์ผ๋ก ํ๊ฐ๋ฐ๊ณ ์์ต๋๋ค.
๊ทธ์ค์์๋ ๊ฐ์ฅ ํธํ๋ฐ๋ ๋ถ๋ถ์ ๊ฐ๋ฐ์๊ฐ ํน๋ณํ ๋ฆฌ์กํธ ์ํ๊ณ์ ๋ํ ์ดํด๋ฅผ ๊ฐ์ถ์ง ์๋๋ผ๋, ์ค์ค๋ก ์ข์ ์ฑ๋ฅ์ ๋ณด์ฅํ๋๋ก ๋ง๋ค์ด์ก๋ค๋ ์ ์ ๋๋ค. ๋ฉ์ด์ (Major) ๋ฒ์ ์ ์ฌ๋ ธ์ ๋, ํ๋ก์ ํธ์ ๋ฒ์ ํธํ์ฑ์ ์ํด ๋ง์ ๊ฒ๋ค์ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝํ์ ๋น์ถ์ด๋ณด๋ฉด ์๋นํ ๊ฐ๋ฐ ํธ์์ฑ์ด๋ผ๊ณ ๋ณผ ์ ์์ ๋ฏํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ฆฌ์กํธ ๊ฐ๋ฐํ์ ์ด๋ฌํ ๋ ธ๋ ฅ์๋, ์์ง๊น์ง ๋ง์ ๋ฆฌ์กํธ ๊ฐ๋ฐ์๊ฐ ์คํดํ๊ณ ์๋ ๋ถ๋ถ์ด ์๋๋ฐ์. ๋ฐ๋ก ์๋ ๋ฐฐ์นญ์ ์ ํํ ๊ฐ๋ ์ ๋ชจ๋ฅธ๋ค๋ ์ ์ ๋๋ค. ์ด๋ฒ ๊ธ์์๋ ๋ฆฌ์กํธ '๋ฐฐ์นญ(Batching)'์ ๊ดํ ์ ๋ฐ์ ์ธ ์๊ฐ์ ๋ฐฐ์นญ๊ณผ ๊ด๋ จํด ์์๋์ด์ผ ํ ๋ฆฌ์กํธ ๋ ๋๋ง ๊ณผ์ ์ ํจ๊ป ์ค๋ช ํ๊ณ ์ ํฉ๋๋ค.
์ด ๊ธ์ ๋ฆฌ์กํธ ๊ธฐ์ด ๋ฌธ๋ฒ๊ณผ ์ํ ๊ฐ ๋ณ๊ฒฝ, ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์คํํด UI ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฑ ์ต์ํ์ ์ฌ์ฉ ๊ฒฝํ์ ๊ฐ๊ณ ๊ณ์๋ฉด ๋์ฑ ์ฌ๋ฐ๊ฒ ์ฝ์ ์ ์์ต๋๋ค.
๋ฆฌ์กํธ์ ๋ฐฐ์นญ๊ณผ ์๋ ๋ฐฐ์นญ์ ๋ํด ์์๋ณด๊ธฐ ์ , ์ฌ๋ฌ๋ถ์ ๋ฐฐ์นญ์ ๋ํด ์ผ๋ง๋ ์๊ณ ์๋์? ๋ฆฌ์กํธ์์ ๋ฐฐ์นญ์ด๋ ๋ฌด์์ผ๊น์?
- UI ๋ ์ด์์์ ๋ณ๊ฒฝํ๋ ์์
- ๋ฆฌ์กํธ์ ์ํ ๊ฐ์ ๋ณ๊ฒฝํ๋ ์์
- ๋ฆฌ์กํธ์ ์ํ ๊ฐ์ ์ผ์ ํ ์ฃผ๊ธฐ๋ก ์ฒ๋ฆฌํ๋ ์์
- ๋ฆฌ์กํธ ํ ์ ์์๋๋ก ์คํํ๋ ์์
๋ฐฐ์นญ์ ์ดํดํ๊ธฐ ์ , ์ฐ๋ฆฌ๋ ๋ฆฌ์กํธ๊ฐ ์ํ ๊ฐ ๋ณ๊ฒฝ์ ์ด๋ป๊ฒ ๋์ํ๋์ง ์์์ผ ํ๋๋ฐ์. ๋จผ์ ๋ฆฌ์กํธ์ ์ฒ๋ฆฌ ๋ฐฉ์์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋ฆฌ์กํธ์ ๋ ๋๋ง ๊ณผ์
์ฐ์ ๋ฆฌ์กํธ์์ ์ํ ๊ฐ์ด ๋ณํ๋ฉด ์ด๋ค ๊ณผ์ ์ ๊ฑฐ์น๋์ง ์ดํดํ ํ์๊ฐ ์์ต๋๋ค. ๋ฒํผ์ ๋๋ฅด๋ฉด ์ซ์๋ฅผ 1๋งํผ ์ฆ๊ฐํ๋ ์ปดํฌ๋ํธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์ ๋, ์ง๊ธ๊น์ง ์ฐ๋ฆฌ๋ ๋ฒํผ์ ์ฐ๊ฒฐํ ์ด๋ฒคํธ ํธ๋ค๋ฌ์์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ฉด, ๋ณ๊ฒฝ๋ ์ํ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋ง ํ๊ฒ ๋ง๋ค๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ก ํ๋ฉด์์ ์ฆ๊ฐํ ์ซ์๋ฅผ ๋ณผ ์ ์์๋ค๊ณ ์๊ณ ์์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ฆฌ์กํธ๋ ์กฐ๊ธ ๋ ์ฒด๊ณ์ ์ธ ๋จ๊ณ๋ฅผ ๊ฐ์ถ๊ณ ์๋๋ฐ์. ์ดํด๋ฅผ ๋๊ธฐ ์ํด ๊ทธ๋ฆผ์ ์ค๋นํ์ผ๋, ์๋ ๊ทธ๋ฆผ๊ณผ ํจ๊ป ๊ฐ ๋จ๊ณ๋ฅผ ์ดํด๋ณผ๊ฒ์.
๋ฒ์ค์ ๋ฒ์ค ๋ ธ์ ๋๋ฅผ ์ด์ฉํด ๋ฆฌ์กํธ์ ์ํ ๊ฐ ๋ณ๊ฒฝ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋ฒ์ค์ ์ด์ ํ๋ ๋ฒ์ค ๊ธฐ์ฌ์ ์น๊ฐ, ๋ฒ์ค ํ์ฐจ ๋ฒจ์ด ์์ต๋๋ค. ๊ธฐ์ฌ๋ ๋ฒ์ค๋ฅผ ์ด์ ํ๋ฉฐ ์ฌ๋ฌ ์ ๋ฅ์ฅ์ ๊ฑฐ์นฉ๋๋ค. ์ ๋ฅ์ฅ์์ ๋ฉ์ถ๊ธฐ๋ ํ๊ณ , ๋ฉ์ท๋ค๊ฐ ๋ค์ ์ถ๋ฐํ๊ธฐ๋ ํ๋ ๋ฒ์ค์ ์ด์ฑ ์์์ด๊ธฐ๋ ํฉ๋๋ค. ์น๊ฐ์ ๋ด๋ฆฌ๊ณ ์ถ์ ์ ๋ฅ์ฅ์ ๋ด๋ฆฌ๊ณ ํ๊ธฐ๋ ํฉ๋๋ค. ๋ด๋ฆฌ๊ณ ์ถ์ผ๋ฉด ํ์ฐจ ๋ฒจ์ ๋๋ฅด์ฃ .
์ ๊ทธ๋ฆผ์์ ๋ฒ์ค ๊ธฐ์ฌ๋ ๋ฆฌ์กํธ์ ํด๋นํฉ๋๋ค. ๋ฒ์ค ์ ์ฒด๋ฅผ ๊ด์ฅํ๋ ๋ฒ์ค ๊ธฐ์ฌ์ฒ๋ผ ๋ฆฌ์กํธ ์ญ์ ์ํ ๊ฐ์ ํฌํจํ ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ด๋ฆฌํ๊ณ , ์ ์์ ์ผ๋ก ๋์ํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์๋๋ก ์ ๊ฒฝ ์๋๋ค. ๊ทธ๋ฆฌ๊ณ ์น๊ฐ์ ์ด๋ฒคํธ์, ํ์ฐจ ๋ฒจ์ ์ํ ๊ฐ์ ๋ณํ์ ํด๋นํฉ๋๋ค. ์น๊ฐ์ด ํ์ฐจ ๋ฒจ์ ๋๋ฅด๋ ๋ชจ์ต์ ๋ฆฌ์กํธ์ ์ํ ๊ฐ์ด ๋ณ๊ฒฝ๋์์์ ๋ฒ์ค ๊ธฐ์ฌ(๋ฆฌ์กํธ)์ ์๋ ค์ฃผ๋ ๊ฒ๊ณผ ๋น์ทํฉ๋๋ค.
์ด์ ๋ฆฌ์กํธ์ ์ํ ๊ฐ ๋ณํ์ ๋ฐ๋ฅธ ์ฒ๋ฆฌ ๊ณผ์ ์ ๋ณด๋ฉฐ, ๋ฒ์ค ๊ธฐ์ฌ์ ์น๊ฐ์ด ์๋ก ์ด๋ป๊ฒ ํ๋ํ๋์ง ์์๋ณด๊ฒ ์ต๋๋ค.
1. ๋ฆฌ์กํธ ๋ ๋๋ง
์ํ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ๋ฆฌ์กํธ๋ ํด๋น ๋ด์ฉ์ ์ ๋ฌ๋ฐ์ UI๋ฅผ ๋ณ๊ฒฝํ ์ค๋น์ ๋ค์ด๊ฐ๋๋ฐ, ๊ทธ ์ฒซ ๋จ๊ณ๊ฐ ๋ ๋๋ง์ ๋๋ค. ์ด ๋จ๊ณ์์ ๋ฆฌ์กํธ๋ ๋ณ๊ฒฝ๋ ์ํ ๊ฐ์ ์ค์ฌ์ผ๋ก ์๋ก์ด ๊ฐ์ ๋(Virtual DOM)์ ์์ฑํฉ๋๋ค.
์ฌ์ฉ์๊ฐ ์ํ ๊ฐ์ ๋ณ๊ฒฝํ๊ณ ๋ฆฌ์กํธ๊ฐ ์์์ฐจ๋ฆฌ๋ ๊ฒ์ ์น๊ฐ์ด ํ์ฐจ ๋ฒจ์ ๋๋ฅด๋ฉด, ๋ฒ์ค ๊ธฐ์ฌ๊ฐ ์ด์ ์์ ์๋ ๊ณ๊ธฐํ์ ํตํด ํ์ฐจํ ์น๊ฐ์ด ์์์ ์๊ฒ ๋๋ ๊ฒ๊ณผ ๋น์ทํฉ๋๋ค. ์น๊ฐ์ด ํ์ฐจ ๋ฒจ์ ๋๋ฅด๋ ์๊ฐ ๋ฒ์ค ๊ธฐ์ฌ๊ฐ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ๋ฅ์ฅ์ ์น๊ฐ์ ๋ด๋ ค์ค ์ค๋น๋ฅผ ํ๋ ๊ฒ์ฒ๋ผ, ๋ฆฌ์กํธ ์ญ์ ์ํ ๊ฐ์ด ๋ณํํ์์ ์ธ์งํ๋ ์๊ฐ ์ํ ๊ฐ์ UI์ ์ ์ฉํ ์ค๋น๋ฅผ ํฉ๋๋ค. ์ด๋ ์ ๋ฅ์ฅ์ ๋ฆฌ์กํธ๊ฐ ๊ฐ๊ณ ์๋ ๋ ๋๋ง ์ฃผ๊ธฐ(Rendering Cycle)๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.
์ํ ๊ฐ์ด ๋ณํ๋ฉด ๋ฆฌ์กํธ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ํธ์ถ(๋ฆฌ๋ ๋๋ง)ํฉ๋๋ค. ํ์ง๋ง ์ํ ๊ฐ์ด ๋ณํ๋ ๊ทธ ์ฆ์ ์ปดํฌ๋ํธ๊ฐ ํธ์ถ๋์ง๋ ์์ต๋๋ค. ๋ฆฌ์กํธ๋ ๋ ๋๋ง ์ฃผ๊ธฐ๊ฐ ์ธ์ ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ํธ์ถํด์ผ ํ ์ง ์ต์ ์ ์๊ฐ์ ๊ณ์ฐํฉ๋๋ค. ๋ฒ์ค๊ฐ ์ ๋ฅ์ฅ์ ๋์ฐฉํ๋ฉด ์ ์ ์ ์ฐจํ๊ณ ๋ฌธ์ ์ด์ด ์น๊ฐ์ด ํ๊ณ ๋ด๋ฆด ์ ์๊ฒ ํด์ฃผ๋๋ฐ์. ์ด๋ ๋ฆฌ์กํธ๊ฐ ์ ์ ํ ํ์ด๋ฐ์ ์ํ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ํธ์ถํ๋ ๊ฒ๊ณผ ๋น์ทํฉ๋๋ค. ์ค์ง ๋ฒ์ค ๊ธฐ์ฌ(๋ฆฌ์กํธ)๋ง์ด ๊ทธ ๊ถํ์ ๊ฐ๊ณ ์๊ณ , ์ธ์ ๋ฒ์ค ์ ๋ฅ์ฅ์ ๋์ฐฉํ ์ง(์ปดํฌ๋ํธ๋ฅผ ํธ์ถํ ์ง)๋ ์ฐ๋ฆฌ๊ฐ ์ ์ ์๋ ๊ฒ์ด์ฃ .
2. ์กฐ์ (Reconciliation)
์ปดํฌ๋ํธ๊ฐ ๋ค์ ํธ์ถ๋๋ฉด, ๋ณ๊ฒฝ๋ ์ํ ๊ฐ์ ๋ฐํ์ผ๋ก ํ๋ฉด์ ํ์ํ ๋์ ๋ค์ ๊ทธ๋ฆฌ๊ฒ ๋ฉ๋๋ค. ์ด๋ ๊ฐ์ ๋์ ๋ง๋ค๋ฉด ๋ฆฌ์กํธ๋ ๋ค์ ๋จ๊ณ๋ก ์ง์ ํ๋๋ฐ์. ์ด ๋จ๊ณ๋ ์กฐ์ ๋จ๊ณ๋ก ๋ ๋๋ง ๋จ๊ณ์์ ๋ง๋ ๊ฐ์ ๋์ ํ์ฌ UI์ ์ ์ฉ๋ ๊ฐ์ฅ ์ต์ ๋ฒ์ ์ ๊ฐ์ ๋๊ณผ ๋น๊ตํฉ๋๋ค. ์ํ ๊ฐ ๋ณํ๋ฅผ ๋ ๋๋งํ๊ณ (๋ฆฌ์กํธ์ ์๋ ค์ฃผ๊ณ ) ์กฐ์ ํ๋ ์ผ์ ๋ฆฌ์กํธ์์ ์ฌ์ฉํ๊ณ ์๋ Fiber์ ๋์์ ๋ฐ์, ๋์ฑ ๋ฉ์ง ์ฑ๋ฅ์ผ๋ก ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌ๋ฉ๋๋ค. Fiber๋ ๋ฆฌ์กํธ 16๋ฒ์ ์์ ๋ฑ์ฅํ ์๋ก์ด ๋ฆฌ์กํธ ๋ด๋ถ ์ํคํ ์ฒ, ๋ค์์ ๋ ์์ธํ ์ด์ผ๊ธฐํ๋ ๊ธฐํ๋ฅผ ๊ฐ์ ธ๋ณด๊ฒ ์ต๋๋ค.
๋ํ ์ข์ ๋ฒ์ค์ ๊ฒฝ์ฐ ๋ฒ์ค ์ ์ ๋ฆฌ์ฐฝ๊ณผ ์ด์ ์ ๋ด๋ถ์ ๋จ์ ์ข์ ์๊ฐ ํ์๋ฉ๋๋ค. ๋ด๋ฆด ์ฌ๋์ ๋ด๋ฆฌ๊ณ ํ ์ฌ๋์ ํ๋ฉด์ ๋ฒ์ค ์์ด ์ ์ ๋ถ์ฃผํด์ง๋๋ค. ์ด๋ ์ ๋ ์๊ฐ์ด ์ง๋๋ฉด ๋ฒ์ค ์์ ์น๊ฐ์ ๋ช ๋ช ์ด๋ ์๋์ง, ์ด๋ ์๋ฆฌ์ ๋๊ฐ ์์๋์ง, ์ด๋ค ์ท์ ์ ์ ์ฌ๋๋ค์ด ํ๊ณ ์๋์ง ๋ฑ ๋ด๋ถ ์ ๊ฒฝ์ด ์กฐ๊ธ ๋ฌ๋ผ์ง ์๋ ์์ฃ . ์ด ๊ณผ์ ์ด ๋ฆฌ์กํธ์ ์กฐ์ ๋จ๊ณ์ ๋น์ทํฉ๋๋ค.
๋ฒ์ค ์น๊ฐ์ด ๋ชจ๋ ํ๊ณ ๋ด๋ฆฌ๋ฉด ๋ฒ์ค ๊ธฐ์ฌ๋ ๋ฌธ์ ๋ซ๊ณ ๋ค์ ์ถ๋ฐํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ์ ๋์ ๋น๊ต๊ฐ ๋๋๋ฉด ๋ฆฌ์กํธ๋ ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ๋๋ค.
3. ์ ์ฉ(Commit)
๊ฐ์ ๋์ ๋น๊ต๊ฐ ๋๋๊ณ ์ต์ข ํํ์ ๊ฐ์ ๋์ด ๋ง๋ค์ด์ง๋ฉด, ์ ์ฉ ๋จ๊ณ๋ก ์ง์ ํ๊ฒ ๋๋๋ฐ ์ด๋ ๋ฆฌ์กํธ๋ ์ค์ ๋(Actual DOM)์ ๊ฐ์ ๋์ ์ ์ฉํด, ํ๋ฉด์ ๋ณํ๋ฅผ ๋ง๋ค์ด๋ ๋๋ค. ์ด ๊ณผ์ ๊น์ง ์๋ฃ๋๋ฉด ์ฌ์ฉ์๊ฐ ๋น๋ก์ ํ๋ฉด์์ ๋ณํ๋ UI๋ฅผ ๋ณผ ์ ์๊ฒ ๋ฉ๋๋ค. ์ด๋ ๋ฒ์ค ๊ธฐ์ฌ๊ฐ ๋ฌธ์ ๋ซ์ ํ, ๋ค์ ์ถ๋ฐํ๋ ๊ณผ์ ๊ณผ ๋น์ทํฉ๋๋ค.
์ฌ๊ธฐ๊น์ง ์ด๋ค์ง๋ฉด ์ํ ๊ฐ์ ๋ณํ๋ถํฐ UI์ ๋ณ๊ฒฝ๊น์ง ํ๋์ ๊ณผ์ ์ด ๋ชจ๋ ์ข ๋ฃ๋๊ณ , ๋ฆฌ์กํธ๋ ๋ค์ ์ฌ์ฉ์ ์ธํฐ๋์ ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋ฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋ฉด ๋ฆฌ์กํธ(๋ฒ์ค ๊ธฐ์ฌ)๋ ๋ค์ ๋ ๋๋ง๋ถํฐ(์น๊ฐ์ด ํ์ฐจ ๋ฒจ์ ๋๋ฅด๋ ๊ฒ๋ถํฐ) ์์ํ ์ค๋น๋ฅผ ํ๋ ๊ฒ์ด์ฃ .
๋ฆฌ์กํธ ๋ฐฐ์นญ์ด๋?
์์ ๋ฒ์ค ๊ธฐ์ฌ์ ๋ฒ์ค ์ดํ์ ๋ํ ์์๋ฅผ ์ดํดํ๋ค๋ฉด, ์ด์ ๋ฐฐ์นญ์ ์ดํดํ ์ ์๋ ์ถฉ๋ถํ ์ค๋น๊ฐ ๋์์ ๊ฒ๋๋ค. ์ด๋ฒ์๋ ๋ฒ์ค ๊ธฐ์ฌ์ ๋ฒ์ค ์ด์ผ๊ธฐ์์ ๋ฐฐ์นญ์ด ์ด๋ ๋ถ๋ถ์ ํด๋นํ๋์ง ์์๋ณผ๊ฒ์.
๋ฐฐ์นญ์ ๋ฒ์ค๊ฐ ์ ๋ฅ์ฅ์ ์ ์ฐจํ๋ฉด ์น๊ฐ์ด ํ๊ณ ๋ด๋ฆฌ๋ ๊ณผ์ ๊ณผ ๋น์ทํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ๋ฌ ๋ช ์ด ๋ด๋ ค์ผ ํ๋๋ฐ ํ ๋ช ๋ง ํ์ฐจํ์ ๋ ๋ฒ์ค๊ฐ ๋ฐ๋ก ์ถ๋ฐํด ๋ฒ๋ฆฐ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ์๋ง ํญ์ ์ ํ๊ฐ ๋ฒ์ค ํ์ฌ๋ก ๋น๋ฐ์น ๊ฑฐ๊ณ , ์ ์์ ์ธ ์ดํ์ด ํ๋ค๊ฒ ์ฃ .
๊ทธ๋์ ์ฐ๋ฆฌ๋ ํ ๋ฒ์ ๋ง์ ์ฌ๋๋ค์ด ์น์ฐจํ๊ฑฐ๋, ํ์ฐจ๋ฅผ ๋ชจ๋ ์๋ฃํ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค. ๋ฆฌ์กํธ์ ๋ฐฐ์นญ์ ์น๊ฐ์ด(์ํ ๊ฐ ๋ณํ) ํ๊ณ ๋ด๋ฆฌ๋ ๊ณผ์ ์์ ๋ชจ๋ ์น๊ฐ์ด ์ ๋ถ ํ์นํ๊ฑฐ๋ ๋ด๋ฆด ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ๊ณผ ๋น์ทํฉ๋๋ค. ์ ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ ์์ ์ ์ฌ๋ฌ ์ํ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ ์ฝ๋๊ฐ ์๋ค๋ฉด, ๋ฆฌ์กํธ๋ ์ด ๋ชจ๋๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค. ๋จ ํ๋์ ์ํ ๊ฐ๋ง ๋ณ๊ฒฝ๋์๋ค๊ณ ํด์ ๋ฐ๋ก ๋ ๋๋ง์ผ๋ก ๋์ด๊ฐ์ง ์์ต๋๋ค. ๊ฐ์ ์ด๋ฒคํธ ์ฃผ๊ธฐ์ ์ฒ๋ฆฌํ ์ ์๋ ๋ณ๊ฒฝ ์ ์ ๋ค ๊ฐ์ด ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ฑ๋ฅ ์ต์ ํ ๊ด์ ์์ ๋ ์ ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ค์ ์์ ์ง๋ฌธ์ผ๋ก ๋์๊ฐ, ๋ฐฐ์นญ์ด ๋ฌด์์ธ์ง ๋ฌผ์ด๋ณธ๋ค๋ฉด ์ด์ ๋ ๋๋ตํ ์ ์๊ฒ ์ฃ ?
- UI ๋ ์ด์์์ ๋ณ๊ฒฝํ๋ ์์
- ๋ฆฌ์กํธ์ ์ํ ๊ฐ์ ๋ณ๊ฒฝํ๋ ์์
- ๋ฆฌ์กํธ์ ์ํ ๊ฐ์ ์ผ์ ํ ์ฃผ๊ธฐ๋ก ์ฒ๋ฆฌํ๋ ์์ (์ ๋ต!)
- ๋ฆฌ์กํธ ํ ์ ์์๋๋ก ์คํํ๋ ์์
์ด์ฒ๋ผ ๋ฐฐ์นญ์ ์ด๋ฒคํธ๋ก ์ธํด ๋ณ๊ฒฝ๋๋ ๋ณ๊ฒฝ ์ ์ด ํ๋๋ฟ์ด๋ , ์ฌ๋ฌ ๊ฐ๋ ์ผ์ ํ ์ฃผ๊ธฐ์ ๋ง์ถฐ ๋ค ๊ฐ์ด ์ฒ๋ฆฌ๋ ์ ์๋๋ก ํ๋ ๋ฆฌ์กํธ์ ๋ด๋ถ ๊ธฐ๋ฅ์ ๋๋ค.
์์ ์ฝ๋
์ด๋ฒ์๋ ์ค์ ์์๋ฅผ ํตํด ๋ฐฐ์นญ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์๋์ ์ฝ๋๋ A์ B๋ฅผ ์์์ ์ซ์๋ก ํ ๋นํด ์ฃผ๋ ์ด๋ฒคํธ๋ฅผ ๋ฒํผ์ ์ฐ๊ฒฐํด ๋์์ต๋๋ค. ๋ ์์ ํฉ์ MAX
์ธ 100์ ๋์ง ๋ชปํฉ๋๋ค. ๊ฐ ์ํ๊ฐ ๋ณํ๋ฉด useEffect
์์ ๊ฐ์งํด ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํด ๋ณด๊ณ ์์ต๋๋ค.
const MAX = 100;
const getRandomNumber = () {
// 1๋ถํฐ 99์ฌ์ด์ ๋๋ค ์ซ์ ๋ฐํ
return Math.floor(Math.random() * (MAX - 1 - 1) + 1);
};
export default function App() {
const [A, setA] = useState(50);
const [B, setB] = useState(50);
const handleClick = () => {
const randomA = getRandomNumber();
setA(randomA);
setB(MAX - randomA);
};
useEffect(() => {
console.log(`A: ${A}, B: ${B}, Total: ${A + B}`);
}, [A, B]);
return (
<div className="App">
<button onClick={handleClick}>์ฌ๋ฐฐ์น</button>
<h4>A: {A}</h4>
<h4>B: {B}</h4>
</div>
);
}
๋ฆฌ์กํธ ๋ฐฐ์นญ์ด ์ ์ฉ๋ ๊ฒฐ๊ณผ
๋ฐฐ์นญ์ ๋จ์ผ ๋๋ ์ฌ๋ฌ ์ํ ๊ฐ์ ๋ณํ๊ฐ ๋์ผํ ์ด๋ฒคํธ ์ฃผ๊ธฐ์์ ์ฒ๋ฆฌ๋๋๋ก ํด์ฃผ๋ ๊ธฐ๋ฅ์ ๋งํฉ๋๋ค. ๋ฐฐ์นญ์ด ์ ์ฉ๋ ๋๋ ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ด ์ถ๋ ฅ๋ฉ๋๋ค.
์ํ ๊ฐ A, B๊ฐ ๋์์ ๋ณ๊ฒฝ๋๋๋ผ๋ ๋ฐฐ์นญ ๋๋ถ์ ๋ ์ํ ๊ฐ์ด ๊ฐ์ ํ์ด๋ฐ์ ๋ณ๊ฒฝ๋์ด, ๋ ๋๋ง์ด ํ ๋ฒ๋ง ๋ฐ์ํฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฐํ ๋ ํฌ๊ฒ ์ ๊ฒฝ ์ฐ์ง ์์๋ ์ข์ ์ฑ๋ฅ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
๊ธฐ์กด ๋ฐฐ์นญ์ ๋ฌธ์ ์ ์?
๊ธฐ์กด ๋ฆฌ์กํธ 17๋ฒ์ ๊น์ง๋ ๋ฐฐ์นญ์ ๋ฌธ์ ์ ์ด ์์๋๋ฐ์. ๋ฐ๋ก ์ ์ ์ด๋ฒคํธ์ ์ฐ๊ฒฐ๋ ํจ์ ๋ด์์ ์ง์ ์ ์ผ๋ก ๋ณ๊ฒฝ๋ ์ํ ๊ฐ๋ง ๋ฐฐ์นญ์ ๋ฒ์ ์์ ๋ค์ด์๋ค๋ ๊ฒ์ด์์ต๋๋ค. ๊ทธ๋์ ํ์ด๋จธ(setTimeout
), ํ๋ก๋ฏธ์ค, Native Event ๋ฑ์ ๋ฐฐ์นญ์ ํจ๊ณผ๋ฅผ ๋๋ฆด ์ ์์๋๋ฐ, ์ด๋ฌํ ์ ์ ์ฑ๋ฅ ์ต์ ํ์๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ์์ฃ .
์์ ์ฝ๋
์์ ์์ ์ฝ๋์์ ๋ฉ์๋๋ฅผ ํ๋ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
const sleep = (t) => {
return new Promise(res setTimeout(res, t));
}
๊ทธ๋ฆฌ๊ณ ๋ฆฌ์กํธ์ ์ด๋ฒคํธ ํจ์๋ฅผ ์ด์ง ๋ณ๊ฒฝํ์ต๋๋ค.
const handleClick = async () => {
// Promise๋ฅผ ์ฌ์ฉํด Promise ์ฝ๋๋ก ๋ณ๊ฒฝ๋๋๋ก ์๋์ ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
await sleep(0);
const randomA = getRandomNumber();
setA(randomA);
setB(MAX - randomA);
};
์์ ์์์ฒ๋ผ ์ฝ๋๋ฅผ ๋ณ๊ฒฝ ํ ๋ฆฌ์กํธ 17๋ฒ์ ์์ ๋ค์ ๋ฒํผ์ ๋๋ฌ๋ณด๋ฉด, ์ด๋ฒ์๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
์ฒซ ๋ฒ์งธ ๋ณํ๋ฅผ ์์ธํ ์ดํด๋ณด๋ฉด, A์ B๋ ๋ชจ๋ 50์์ ์์ํ์ต๋๋ค. ์ด๋ ์ฝ์์๋ A์ B๋ ๋ชจ๋ 50์ผ๋ก, ์ดํฉ๊ณ๋ 100์ผ๋ก ์ถ๋ ฅ์ด ๋์์ต๋๋ค. ์ฌ๋ฐฐ์น ๋ฒํผ์ ํ ๋ฒ ๋๋ฅด๊ณ ๋์ ์ฝ์์ ์๊ฐ ๋ก๊ทธ๊ฐ ๋ ๋ฒ์ด ์ถ๋ ฅ๋๋๋ฐ์. ์ด๋ ๊ฐ๊ฐ A์ B๋ 87๊ณผ 50, ์ดํฉ์ 137์ด ์ถ๋ ฅ๋๊ณ , ๋ฐ๋ก ๋ค์ ์ถ๋ ฅ๋๋ ๋ก๊ทธ์ A์ B๋ 87, 13์ด ์ถ๋ ฅ๋๊ณ ์ดํฉ๋ 100์ด ์ถ๋ ฅ๋์์ต๋๋ค. ์ ๊ทธ๋ด๊น์?
sleep()
ํจ์๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ ํจ์์
๋๋ค. ๊ทธ ๋ด๋ถ์์๋ ๋ค์ ํ์ด๋จธ๋ฅผ ๋์์ํค๊ณ ์์ต๋๋ค. ๋ฆฌ์กํธ 17๋ฒ์ ๊น์ง๋ ํ๋ก๋ฏธ์ค๊ฐ ์ฌ์ฉ๋๋ฉด, ํด๋น ์ฝ๋๋ ๋ฐฐ์นญ์ ๋ฒ์์ ํฌํจ์ ์ํค์ง ๋ชปํ์ต๋๋ค.
๊ทธ๋์ A์ B๊ฐ ๊ฐ๊ฐ 87๊ณผ 13์ผ๋ก ๋ณ๊ฒฝ์ด ๊ฐ๊ฐ ์ด๋ค์ก์ฃ . ์ํ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ ๋๋ง ๋จ๊ณ๋ก ๋์ด๊ฐ๋ ๋ฆฌ์กํธ์ ์ด๋ฒคํธ ์ฃผ๊ธฐ ํน์ฑ์ผ๋ก ์ธํด, ์กฐ์ (Reconciliation)๊ณผ ์ ์ฉ(Commit)์ ๊ฑฐ์ณ ์ปดํฌ๋ํธ๋ ์ต์ข ์ ์ผ๋ก A๊ฐ ๋ณ๊ฒฝ๋ ๋ ํ ๋ฒ, B๊ฐ ๋ณ๊ฒฝ๋ ๋ ๋ค์ ํ๋ฒ ํธ์ถ์ด ๋์ด ์ด ๋ ๋ฒ์ ๊ฑธ์ณ ํธ์ถ๋ฉ๋๋ค. ๊ฒฐ๊ตญ ํ๋์ ์ด๋ฒคํธ ํจ์์์ ๋ณ๊ฒฝํ๋ ์ํ ๊ฐ์ด ๋ง์์๋ก ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ต๋๋ค.
๋ฆฌ์กํธ 18๋ฒ์ ์์ ์ด๋จ๊น?
์ด ์ ์ ๋คํํ ๋ฆฌ์กํธ 18๋ฒ์ ์ด ์ถ์๋๋ฉด์ ํด๊ฒฐ๋์๋๋ฐ์. createRoot
ํจ์๋ฅผ ์ฌ์ฉํด ๋ฆฌ์กํธ ๋ฃจํธ ์ปดํฌ๋ํธ์ ์ด๊ธฐํ ํด์ฃผ๋ฉด, ํ๋ก๋ฏธ์ค์ ํ์ด๋จธ๋ ๊ฐ์ ์ฃผ๊ธฐ ๋ด์์ ์ฒ๋ฆฌ๋ ์ ์๋๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.
// ๋ฆฌ์กํธ 17๋ฒ์ ๊น์ง๋ ์ด๋ฌํ์ต๋๋ค.
import { StrictMode } from "react";
import { render } from "react-dom";
import App from "./App";
const rootElement = document.getElementById("root");
render(
<StrictMode>
<App />
</StrictMode>,
rootElement
);
// ํ์ง๋ง ๋ฆฌ์กํธ 18๋ฒ์ ์์๋ createRoot๋ฅผ ์ฌ์ฉํฉ๋๋ค.
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import App from "./App";
const rootElement = document.getElementById("root");
const root = createRoot(rootElement);
root.render(
<StrictMode>
<App />
</StrictMode>
);
์ฐจ์ด๊ฐ ๋ณด์ด์๋์? createRoot
๋ก ๋ฃจํธ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ ๋ค, ๋ฃจํธ ์ปดํฌ๋ํธ์ render
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.
๋ฆฌ์กํธ 18๋ฒ์ ์์ ๋ฃจํธ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ด ๋ณ๊ฒฝ๋์๊ณ , ์ด์ ๋ฐ๋ผ ํ๋ก๋ฏธ์ค์ ํ์ด๋จธ, Native Event ๋ชจ๋ ์ด์ ๋ ๋ฆฌ์กํธ๊ฐ ์์์ ๊ฐ์ ์ฃผ๊ธฐ์์ ์ฒ๋ฆฌํ๊ณ , ์ด๋ฒคํธ๋ฅผ ๋ถ๋ฅํ ์ ์๊ฒ ๋์์ต๋๋ค. ๋ง์น ๋ฒ์ค ๊ธฐ์ฌ๊ฐ ๋ฐ์ด์ค๋ ์๋๋ค์ ๊ธฐ๋ค๋ ค์ฃผ๋ ๊ฒ์ฒ๋ผ์. ์ด๋ฌํ ๊ธฐ๋ฅ์ __์๋ ๋ฐฐ์นญ(Automatic Batching)__์ด๋ผ๊ณ ํํํฉ๋๋ค.
๋ง์น๋ฉฐ
๋ง์ง๋ง์ผ๋ก ํ ๋ฒ ๋ ์ ๋ฆฌํ๋ฉด, ๋ฆฌ์กํธ๋ ์ํ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ์ํ ๊ฐ์ ๋ค๋ฃจ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ํธ์ถํ๋ ๋ ๋๋ง ๊ณผ์ ์ ๊ฑฐ์น๊ณ , ์ปดํฌ๋ํธ๊ฐ JSX ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐํํ๋ฉด ๊ทธ๊ฒ์ ๋ฐํ์ผ๋ก ์๋ก์ด ๊ฐ์ ๋์ ์์ฑํฉ๋๋ค. ์ด๋ ๊ฒ ๋ง๋ค์ด์ง ๊ฐ์ ๋์ HTML์ ์ ์ฉ๋ ๊ฐ์ฅ ์ด์ ๋ฒ์ ์ ๊ฐ์ ๋๊ณผ ๋น๊ตํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๊ณผ์ ์ ์กฐ์ (Reconciliation)์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
๋น๊ต ํ ์ต์ข ์ ์ผ๋ก ์ ์ฉํ ๊ฐ์ ๋์ ๊พธ๋ฆฌ๊ฒ ๋๋ฉด, ์ ์ฉ(Commit) ๋จ๊ณ๋ก ๋์ด๊ฐ๊ณ ์ฌ์ฉ์๋ UI๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ๋๋ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ผ๋ จ์ ๊ณผ์ ์ค ์ํ ๊ฐ์ด ๋ณ๊ฒฝ๋๊ณ ์ ์ฉ๋๋ ํ์ด๋ฐ์ ์์ด, ๋ฆฌ์กํธ๋ ์ฌ๋ฌ ์ํ ๊ฐ์ด ๋๋๋ก ํ ๋ฒ์ ๋ค ๊ฐ์ด ์ ์ฉํ ์ ์๋๋ก ํ๋ ๊ธฐ๋ฅ์ ๊ฐ๊ณ ์์ต๋๋ค. ๊ทธ ๊ธฐ๋ฅ์ '๋ฐฐ์นญ'์ด๋ผ๊ณ ํํํ์ฃ .
๊ธฐ์กด ๋ฐฐ์นญ์ ๋จ์ ์ ํ๋ก๋ฏธ์ค์ ํ์ด๋จธ, Native Event๋ก ๋ฐ์ํ๋ ์ํ ๊ฐ ๋ณํ๋ฅผ ๊ฐ์งํ์ง ๋ชปํ๊ธฐ์ ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ฌ ์ฐจ๋ก ๋ ๋๋ง์ด ๋์๋๋ฐ์. ๊ทธ๋์ 18๋ฒ์ ๋ถํฐ๋ createRoot
ํจ์๋ฅผ ์ฌ์ฉํด ๋ฃจํธ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด์ฃผ๋ฉด, ๋ฆฌ์กํธ๊ฐ ๊ฐ์งํ ์ ์๊ฒ ํ๊ณ ์ด ๊ธฐ๋ฅ์ด '์๋ ๋ฐฐ์นญ'์
๋๋ค.
์ง๊ธ๊น์ง ๋ฆฌ์กํธ ๋ฐฐ์นญ์ ๋ํด ์ฌ๋ฌ ์์๋ฅผ ๋ค์ด ์ดํด๋ณด์๋๋ฐ์. ์ด๋ฒ ๊ธ์ ํตํด ๋ฐฐ์นญ์ ์ดํดํ๋ ๋ฐ ์กฐ๊ธ์ด๋๋ง ๋์์ด ๋์๊ธธ ๋ฐ๋๋๋ค.