React Fiber์ ๋ณต์ก์ฑ์ ํํค์น๊ณ , ํ์ ์ ์ธ ์ฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ, ๋์์ฑ, ์ค์ผ์ค๋ง์ ํ๊ตฌํ๋ฉฐ ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ถ๋๋ฝ๊ณ ๋ฐ์์ฑ ์ข์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์์๋ด ๋๋ค.
React Fiber: ๊ธ๋ก๋ฒ UI ์ฐ์์ฑ์ ์ํ ์ฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ ์ฌ์ธต ๋ถ์
๋์์์ด ๋ณํํ๋ ์น ๊ฐ๋ฐ์ ์ธ๊ณ์์, ๋งค๋๋ฝ๊ณ ๋ฐ์์ฑ ์ข์ ์ธํฐํ์ด์ค์ ๋ํ ์ฌ์ฉ์๋ค์ ๊ธฐ๋๋ ๊ณ์ํด์ ๋์์ง๊ณ ์์ต๋๋ค. ์ด๋ฌํ ์ํฉ์์ ์ฐ๋ฆฌ๊ฐ ๋ง๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ๋ํ๋ ๊ธฐ๋ฐ ๊ธฐ์ ์ ์ดํดํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ฌ์ฉ์ ์ธํฐํ์ด์ค ๊ตฌ์ถ์ ์ํ ์ ๋์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ React๋ React Fiber์ ๋์ ๊ณผ ํจ๊ป ์ค๋ํ ์ํคํ ์ฒ ๊ฐํธ์ ๊ฒช์์ต๋๋ค. ์ด๊ฒ์ ๋จ์ํ ๋ด๋ถ ๋ฆฌํฉํ ๋ง์ด ์๋๋ผ, React๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ์ฌ์กฐ์ ํ๋ ๋ฐฉ์์ ๊ทผ๋ณธ์ ์ผ๋ก ๋ฐ๊พธ์ด ๋์์ฑ ๋ชจ๋(Concurrent Mode)์ Suspense์ ๊ฐ์ ๊ฐ๋ ฅํ ์ ๊ท ๊ธฐ๋ฅ์ ๊ธธ์ ์ฐ ํ๋ช ์ ์ธ ๋์ฝ์ ๋๋ค.
์ด ์ข ํฉ ๊ฐ์ด๋๋ React Fiber๋ฅผ ๊น์ด ํ๊ณ ๋ค์ด ๊ทธ ์ฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ์ ๋น๋ฐ์ ๋ฐํ๋๋ค. ์ฐ๋ฆฌ๋ ์ Fiber๊ฐ ํ์ํ๋์ง, ๋ด๋ถ์ ์ผ๋ก ์ด๋ป๊ฒ ์๋ํ๋์ง, ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ฏธ์น๋ ์ฌ์คํ ์ํฅ, ๊ทธ๋ฆฌ๊ณ ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๊ฐ๋ฐ์๋ค์๊ฒ ์ด๊ฒ์ด ๋ฌด์์ ์๋ฏธํ๋์ง ํ๊ตฌํ ๊ฒ์ ๋๋ค.
React์ ์งํ: ์ Fiber๊ฐ ํ์์ ์ด ๋์๋๊ฐ
Fiber ์ด์ , React์ ์ฌ์กฐ์ ๊ณผ์ (์ ํ๋ฆฌ์ผ์ด์ ์ํ ๋ณํ๋ฅผ ๋ฐ์ํ๊ธฐ ์ํด DOM์ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ์)์ ๋์ฒด๋ก ๋๊ธฐ์ ์ด์์ต๋๋ค. ์ด๋ ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ์ํํ๊ณ , ์ฐจ์ด์ ์ ๊ณ์ฐํ๋ฉฐ, ์ค๋จ ์์ด ํ ๋ฒ์ ์ ๋ฐ์ดํธ๋ฅผ ์ ์ฉํ์ต๋๋ค. ์์ ์ ํ๋ฆฌ์ผ์ด์ ์๋ ํจ์จ์ ์ด์์ง๋ง, ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ณต์กํด์ง๊ณ ์ํธ์์ฉ ์๊ตฌ๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ ์ฌ๊ฐํ ํ๊ณ๋ฅผ ๊ฐ์ก์ต๋๋ค:
- ๋ฉ์ธ ์ค๋ ๋ ์ฐจ๋จ: ํฌ๊ฑฐ๋ ๋ณต์กํ ์ ๋ฐ์ดํธ๋ ๋ธ๋ผ์ฐ์ ์ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ฌ UI ๋ฒ๋ฒ ์, ํ๋ ์ ๋๋กญ, ๊ทธ๋ฆฌ๊ณ ๋๋ฆฐ ์ฌ์ฉ์ ๊ฒฝํ์ ์ด๋ํ์ต๋๋ค. ๋ณต์กํ ํํฐ ์์ ์ ์ฒ๋ฆฌํ๋ ๊ธ๋ก๋ฒ ์ด์ปค๋จธ์ค ํ๋ซํผ์ด๋ ๋๋ฅ ๊ฐ ์ค์๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ๋๊ธฐํํ๋ ํ์ ๋ฌธ์ ํธ์ง๊ธฐ๋ฅผ ์์ํด ๋ณด์ญ์์ค. ๋ฉ์ถ UI๋ ์ฉ๋ฉ๋ ์ ์์ต๋๋ค.
- ์ฐ์ ์์ ๋ถ์ฌ: ๋ชจ๋ ์ ๋ฐ์ดํธ๋ ๋๋ฑํ๊ฒ ์ฒ๋ฆฌ๋์์ต๋๋ค. ์ค์ํ ์ฌ์ฉ์ ์ ๋ ฅ(์: ๊ฒ์์ฐฝ์ ํ์ดํ)์ด ๋ ์๊ธํ ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ(์๋ฆผ ํ์ ๋ฑ)์ ์ํด ์ง์ฐ๋์ด ์ฌ์ฉ์์ ๋ถ๋ง์ ์ ๋ฐํ ์ ์์์ต๋๋ค.
- ์ค๋จ ๊ฐ๋ฅ์ฑ์ ํ๊ณ: ์ผ๋จ ์ ๋ฐ์ดํธ๊ฐ ์์๋๋ฉด ์ผ์ ์ค์งํ๊ฑฐ๋ ์ฌ๊ฐํ ์ ์์์ต๋๋ค. ์ด๋ก ์ธํด ์๊ฐ ๋ถํ (time-slicing)์ด๋ ๊ธด๊ธํ ์์ ์ ์ฐ์ ์์๋ฅผ ์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ด๋ ค์ ์ต๋๋ค.
- ๋น๋๊ธฐ UI ํจํด ์ฒ๋ฆฌ์ ์ด๋ ค์: ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ๋ก๋ฉ ์ํ๋ฅผ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋ ๋ณต์กํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ํ์ํ์ผ๋ฉฐ, ์ด๋ ์ข ์ข ์ํฐํด ํ์์ด๋ ์ด์์ ์ด์ง ์์ ์ฌ์ฉ์ ํ๋ก์ฐ๋ก ์ด์ด์ก์ต๋๋ค.
React ํ์ ์ด๋ฌํ ํ๊ณ๋ฅผ ์ธ์ํ๊ณ ํต์ฌ ์ฌ์กฐ์ ๊ธฐ๋ฅผ ์ฌ๊ตฌ์ถํ๊ธฐ ์ํ ์๋ ๊ฐ์ ํ๋ก์ ํธ์ ์ฐฉ์ํ์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ๋ฌผ์ด ๋ฐ๋ก Fiber์ด๋ฉฐ, ์ด๋ ์ ์ง์ ๋ ๋๋ง, ๋์์ฑ, ๊ทธ๋ฆฌ๊ณ ๋ ๋๋ง ํ๋ก์ธ์ค์ ๋ํ ๋ ๋์ ์ ์ด๋ฅผ ์ง์ํ๊ธฐ ์ํด ์ฒ์๋ถํฐ ์ค๊ณ๋ ์ํคํ ์ฒ์ ๋๋ค.
ํต์ฌ ๊ฐ๋ ์ดํดํ๊ธฐ: Fiber๋ ๋ฌด์์ธ๊ฐ?
๋ณธ์ง์ ์ผ๋ก React Fiber๋ React์ ํต์ฌ ์ฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์์ ํ ์ฌ์์ฑํ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ์ฃผ๋ ํ์ ์ ๋ ๋๋ง ์์ ์ ์ผ์ ์ค์ง, ์ค๋จ, ๊ทธ๋ฆฌ๊ณ ์ฌ๊ฐํ ์ ์๋ ๋ฅ๋ ฅ์ ๋๋ค. ์ด๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด Fiber๋ ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ์๋ก์ด ๋ด๋ถ ํํ๊ณผ ์ ๋ฐ์ดํธ ์ฒ๋ฆฌ์ ์๋ก์ด ๋ฐฉ์์ ๋์ ํฉ๋๋ค.
์์ ๋จ์๋ก์์ Fiber
Fiber ์ํคํ ์ฒ์์ ๊ฐ React ์๋ฆฌ๋จผํธ(์ปดํฌ๋ํธ, DOM ๋ ธ๋ ๋ฑ)๋ ํ๋์ Fiber์ ํด๋นํฉ๋๋ค. Fiber๋ ์์ ๋จ์๋ฅผ ๋ํ๋ด๋ ํ๋ฒํ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ ๋๋ค. ์ด๋ฅผ ๊ฐ์ ์คํ ํ๋ ์์ด๋ผ๊ณ ์๊ฐํ ์ ์์ง๋ง, ๋ธ๋ผ์ฐ์ ์ ํธ์ถ ์คํ์ ์ํด ๊ด๋ฆฌ๋๋ ๋์ React ์์ฒด์ ์ํด ๊ด๋ฆฌ๋ฉ๋๋ค. ๊ฐ Fiber๋ ์ปดํฌ๋ํธ, ์ํ, props, ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ Fiber๋ค๊ณผ์ ๊ด๊ณ(๋ถ๋ชจ, ์์, ํ์ )์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํฉ๋๋ค.
React๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ์ํํด์ผ ํ ๋, "์์ ์งํ ์ค(work-in-progress)" ํธ๋ฆฌ๋ผ๊ณ ์๋ ค์ง ์๋ก์ด Fiber ํธ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด ์๋ก์ด ํธ๋ฆฌ๋ฅผ ๊ธฐ์กด์ "ํ์ฌ(current)" ํธ๋ฆฌ์ ๋น๊ตํ์ฌ ์ค์ DOM์ ์ ์ฉํด์ผ ํ ๋ณ๊ฒฝ ์ฌํญ์ ์๋ณํฉ๋๋ค. ์ด ์ ์ฒด ๊ณผ์ ์ ์๊ณ ์ค๋จ ๊ฐ๋ฅํ ์์ ๋ฉ์ด๋ฆฌ๋ก ๋๋ฉ๋๋ค.
์๋ก์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ: ์ฐ๊ฒฐ ๋ฆฌ์คํธ
๊ฒฐ์ ์ ์ผ๋ก, Fiber๋ค์ ํธ๋ฆฌ์ ๊ฐ์ ๊ตฌ์กฐ๋ก ์ฐ๊ฒฐ๋์ด ์์ง๋ง, ๋ด๋ถ์ ์ผ๋ก๋ ์ฌ์กฐ์ ์ค ํจ์จ์ ์ธ ์ํ๋ฅผ ์ํด ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ(singly linked list)์ ์ ์ฌํฉ๋๋ค. ๊ฐ Fiber ๋ ธ๋๋ ๋ค์๊ณผ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ๊ฐ์ง๋๋ค:
child
: ์ฒซ ๋ฒ์งธ ์์ Fiber๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.sibling
: ๋ค์ ํ์ Fiber๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.return
: ๋ถ๋ชจ Fiber("return" Fiber)๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
์ด ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๊ตฌ์กฐ๋ React๊ฐ ํธ๋ฆฌ๋ฅผ ๊น์ด ์ฐ์ ์ผ๋ก ์ํํ ๋ค์ ๋๋์์ฌ ์ ์๊ฒ ํ์ฌ, ์ด๋ ์ง์ ์์๋ ์ฝ๊ฒ ์ผ์ ์ค์งํ๊ณ ์ฌ๊ฐํ ์ ์๊ฒ ํฉ๋๋ค. ์ด ์ ์ฐ์ฑ์ด Fiber์ ๋์์ฑ ๊ธฐ๋ฅ์ ํต์ฌ์ ๋๋ค.
Fiber ์ฌ์กฐ์ ์ ๋ ๋จ๊ณ
Fiber๋ ์ฌ์กฐ์ ๊ณผ์ ์ ๋ ๊ฐ์ ๋ณ๊ฐ ๋จ๊ณ๋ก ๋๋์ด React๊ฐ ๋น๋๊ธฐ์ ์ผ๋ก ์์ ์ ์ํํ๊ณ ์์ ์ ์ฐ์ ์์๋ฅผ ์ ํ ์ ์๋๋ก ํฉ๋๋ค:
1๋จ๊ณ: ๋ ๋/์ฌ์กฐ์ ๋จ๊ณ (์์ ์งํ ์ค ํธ๋ฆฌ)
์ด ๋จ๊ณ๋ "์์ ๋ฃจํ(work loop)" ๋๋ "๋ ๋ ๋จ๊ณ(render phase)"๋ผ๊ณ ๋ ์๋ ค์ ธ ์์ต๋๋ค. React๊ฐ Fiber ํธ๋ฆฌ๋ฅผ ์ํํ๊ณ , ๋น๊ต ์๊ณ ๋ฆฌ์ฆ(diffing algorithm, ๋ณ๊ฒฝ ์ฌํญ ์๋ณ)์ ์ํํ๋ฉฐ, UI์ ๋ค์ ์ํ๋ฅผ ๋ํ๋ด๋ ์๋ก์ด Fiber ํธ๋ฆฌ(์์ ์งํ ์ค ํธ๋ฆฌ)๋ฅผ ๊ตฌ์ถํ๋ ๊ณณ์ ๋๋ค. ์ด ๋จ๊ณ๋ ์ค๋จ ๊ฐ๋ฅํฉ๋๋ค.
์ด ๋จ๊ณ์ ์ฃผ์ ์์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-
Props ๋ฐ ์ํ ์
๋ฐ์ดํธ: React๋ ๊ฐ ์ปดํฌ๋ํธ์ ๋ํ ์๋ก์ด props์ ์ํ๋ฅผ ์ฒ๋ฆฌํ๋ฉฐ,
getDerivedStateFromProps
์ ๊ฐ์ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ ํจ์ํ ์ปดํฌ๋ํธ์ ๋ณธ๋ฌธ์ ํธ์ถํฉ๋๋ค. -
์์ ๋น๊ต(Diffing): ๊ฐ ์ปดํฌ๋ํธ์ ๋ํด React๋ ํ์ฌ ์์๋ค๊ณผ ์๋ก์ด ์์๋ค(๋ ๋๋ง์ผ๋ก๋ถํฐ)์ ๋น๊ตํ์ฌ ๋ฌด์์ ์ถ๊ฐ, ์ ๊ฑฐ ๋๋ ์
๋ฐ์ดํธํด์ผ ํ๋์ง ๊ฒฐ์ ํฉ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ์
๋ช
๋์ "
key
" prop์ด ํจ์จ์ ์ธ ๋ฆฌ์คํธ ์ฌ์กฐ์ ์ ํ์์ ์ธ ์ด์ ์ ๋๋ค. - ์ฌ์ด๋ ์ดํํธ ํ์: ์ค์ DOM ๋ณ๊ฒฝ์ ์ํํ๊ฑฐ๋ `componentDidMount`/`Update`๋ฅผ ์ฆ์ ํธ์ถํ๋ ๋์ , Fiber๋ Fiber ๋ ธ๋์ "์ฌ์ด๋ ์ดํํธ"(์: `Placement`, `Update`, `Deletion`)๋ฅผ ํ์ํฉ๋๋ค. ์ด๋ฌํ ์ดํํธ๋ค์ "์ดํํธ ๋ฆฌ์คํธ(effect list)" ๋๋ "์ ๋ฐ์ดํธ ํ(update queue)"๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์์ง๋ฉ๋๋ค. ์ด ๋ฆฌ์คํธ๋ ๋ ๋ ๋จ๊ณ๊ฐ ์๋ฃ๋ ํ ๋ฐ์ํด์ผ ํ๋ ๋ชจ๋ ํ์ํ DOM ์์ ๊ณผ ์๋ช ์ฃผ๊ธฐ ํธ์ถ์ ์ ์ฅํ๋ ๊ฐ๋ฒผ์ด ๋ฐฉ๋ฒ์ ๋๋ค.
์ด ๋จ๊ณ ๋์ React๋ ์ค์ DOM์ ๊ฑด๋๋ฆฌ์ง ์์ต๋๋ค. ๋ฌด์์ด ์ ๋ฐ์ดํธ๋ ๊ฒ์ธ์ง์ ๋ํ ํํ์ ๊ตฌ์ถํฉ๋๋ค. ์ด ๋ถ๋ฆฌ๋ ๋์์ฑ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ง์ฝ ๋ ๋์ ์ฐ์ ์์์ ์ ๋ฐ์ดํธ๊ฐ ๋ค์ด์ค๋ฉด, React๋ ๋ถ๋ถ์ ์ผ๋ก ๊ตฌ์ถ๋ ์์ ์งํ ์ค ํธ๋ฆฌ๋ฅผ ๋ฒ๋ฆฌ๊ณ ๋ ์๊ธํ ์์ ๋ถํฐ ๋ค์ ์์ํ ์ ์์ผ๋ฉฐ, ์ด๋ ํ๋ฉด์ ์๊ฐ์ ์ธ ๋ถ์ผ์น๋ฅผ ์ผ์ผํค์ง ์์ต๋๋ค.
2๋จ๊ณ: ์ปค๋ฐ ๋จ๊ณ (๋ณ๊ฒฝ ์ฌํญ ์ ์ฉ)
๋ ๋ ๋จ๊ณ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋๊ณ ์ฃผ์ด์ง ์ ๋ฐ์ดํธ์ ๋ํ ๋ชจ๋ ์์ (๋๋ ๊ทธ ์ผ๋ถ)์ด ์ฒ๋ฆฌ๋๋ฉด React๋ ์ปค๋ฐ ๋จ๊ณ์ ๋ค์ด๊ฐ๋๋ค. ์ด ๋จ๊ณ๋ ๋๊ธฐ์ ์ด๋ฉฐ ์ค๋จ๋์ง ์์ต๋๋ค. React๊ฐ ์์ ์งํ ์ค ํธ๋ฆฌ์์ ์ถ์ ๋ ์ฌ์ด๋ ์ดํํธ๋ฅผ ๊ฐ์ ธ์ ์ค์ DOM์ ์ ์ฉํ๊ณ ๊ด๋ จ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ณณ์ ๋๋ค.
์ด ๋จ๊ณ์ ์ฃผ์ ์์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- DOM ๋ณ๊ฒฝ: React๋ ์ด์ ๋จ๊ณ์์ ํ์๋ `Placement`, `Update`, `Deletion` ์ดํํธ์ ๋ฐ๋ผ ํ์ํ ๋ชจ๋ DOM ์กฐ์(์๋ฆฌ๋จผํธ ์ถ๊ฐ, ์ ๊ฑฐ, ์ ๋ฐ์ดํธ)์ ์ํํฉ๋๋ค.
- ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋ ๋ฐ ํ : `componentDidMount`, `componentDidUpdate`, `componentWillUnmount`(์ ๊ฑฐ ์), ๊ทธ๋ฆฌ๊ณ `useLayoutEffect` ์ฝ๋ฐฑ๊ณผ ๊ฐ์ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ ์์ ์ ๋๋ค. ์ค์ํ๊ฒ๋, `useEffect` ์ฝ๋ฐฑ์ ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฉด์ ๊ทธ๋ฆฐ ํ์ ์คํ๋๋๋ก ์์ฝ๋์ด, ์ฌ์ด๋ ์ดํํธ๋ฅผ ์ฐจ๋จํ์ง ์๋ ๋ฐฉ์์ผ๋ก ์ํํ ์ ์๊ฒ ํฉ๋๋ค.
์ปค๋ฐ ๋จ๊ณ๋ ๋๊ธฐ์ ์ด๊ธฐ ๋๋ฌธ์ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๋๋ก ์ ์ํ๊ฒ ์๋ฃ๋์ด์ผ ํฉ๋๋ค. ์ด๊ฒ์ด Fiber๊ฐ ๋ ๋ ๋จ๊ณ์์ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฏธ๋ฆฌ ๊ณ์ฐํ์ฌ ์ปค๋ฐ ๋จ๊ณ๊ฐ ํด๋น ๋ณ๊ฒฝ ์ฌํญ์ ๋น ๋ฅด๊ณ ์ง์ ์ ์ผ๋ก ์ ์ฉํ ์ ์๋๋ก ํ๋ ์ด์ ์ ๋๋ค.
React Fiber์ ํต์ฌ ํ์
๋ ๋จ๊ณ ์ ๊ทผ๋ฒ๊ณผ Fiber ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ๋ค์ํ ์๋ก์ด ๊ธฐ๋ฅ๋ค์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค:
๋์์ฑ๊ณผ ์ค๋จ (์๊ฐ ๋ถํ )
Fiber์ ๊ฐ์ฅ ์ค์ํ ์ฑ๊ณผ๋ ๋์์ฑ์ ๊ฐ๋ฅํ๊ฒ ํ ๊ฒ์ ๋๋ค. ์ ๋ฐ์ดํธ๋ฅผ ๋จ์ผ ๋ธ๋ก์ผ๋ก ์ฒ๋ฆฌํ๋ ๋์ , Fiber๋ ๋ ๋๋ง ์์ ์ ๋ ์์ ์๊ฐ ๋จ์(์๊ฐ ์กฐ๊ฐ, time slices)๋ก ๋๋ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ ๋์ ์ฐ์ ์์์ ์์ ์ด ์๋์ง ํ์ธํ ์ ์์ต๋๋ค. ๋ง์ฝ ์๋ค๋ฉด, ํ์ฌ์ ๋ฎ์ ์ฐ์ ์์ ์์ ์ ์ผ์ ์ค์งํ๊ณ , ๊ธด๊ธํ ์์ ์ผ๋ก ์ ํํ ๋ค์, ๋์ค์ ์ผ์ ์ค์ง๋ ์์ ์ ์ฌ๊ฐํ๊ฑฐ๋, ๋ ์ด์ ๊ด๋ จ์ด ์๋ค๋ฉด ์์ ํ ํ๊ธฐํ ์๋ ์์ต๋๋ค.
์ด๋ `requestIdleCallback`๊ณผ ๊ฐ์ ๋ธ๋ผ์ฐ์ API๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌ์ฑ๋ฉ๋๋ค(React๋ ์ข ์ข ๋ ์ ๋ขฐ์ฑ ์๋ ์ค์ผ์ค๋ง์ ์ํด `MessageChannel` ๊ธฐ๋ฐ์ ์์ฒด ์ค์ผ์ค๋ฌ๋ฅผ ์ฌ์ฉํ์ง๋ง). ์ด๋ฅผ ํตํด React๋ ๋ฉ์ธ ์ค๋ ๋๊ฐ ์ ํด ์ํ์ผ ๋ ๋ธ๋ผ์ฐ์ ์ ์ ์ด๊ถ์ ์๋ณดํ ์ ์์ต๋๋ค. ์ด ํ๋ ฅ์ ๋ฉํฐํ์คํน์ ๊ธด๊ธํ ์ฌ์ฉ์ ์ํธ์์ฉ(์ ๋๋ฉ์ด์ ์ด๋ ์ ๋ ฅ ์ฒ๋ฆฌ ๋ฑ)์ด ํญ์ ์ฐ์ ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋๋ก ๋ณด์ฅํ์ฌ, ์ฑ๋ฅ์ด ๋ฎ์ ๊ธฐ๊ธฐ๋ ๊ณผ๋ถํ ์ํ์์๋ ์ฒด๊ฐ์ ๋ ๋ถ๋๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
์ฐ์ ์์ ๋ถ์ฌ ๋ฐ ์ค์ผ์ค๋ง
Fiber๋ ๊ฐ๋ ฅํ ์ฐ์ ์์ ์์คํ ์ ๋์ ํฉ๋๋ค. ๋ค์ํ ์ ํ์ ์ ๋ฐ์ดํธ์ ๋ค๋ฅธ ์ฐ์ ์์๋ฅผ ํ ๋นํ ์ ์์ต๋๋ค:
- ์ฆ์/๋๊ธฐ(Immediate/Sync): ์ฆ์ ์ฒ๋ฆฌ๋์ด์ผ ํ๋ ์ค์ํ ์ ๋ฐ์ดํธ (์: ์ด๋ฒคํธ ํธ๋ค๋ฌ).
- ์ฌ์ฉ์ ์ฐจ๋จ(User Blocking): ์ฌ์ฉ์ ์ ๋ ฅ์ ์ฐจ๋จํ๋ ์ ๋ฐ์ดํธ (์: ํ ์คํธ ์ ๋ ฅ).
- ๋ณดํต(Normal): ํ์ค ๋ ๋๋ง ์ ๋ฐ์ดํธ.
- ๋ฎ์(Low): ์ง์ฐ๋ ์ ์๋ ๋ ์ค์ํ ์ ๋ฐ์ดํธ.
- ์ ํด(Idle): ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ .
React์ ๋ด๋ถ `Scheduler` ํจํค์ง๋ ์ด๋ฌํ ์ฐ์ ์์๋ฅผ ๊ด๋ฆฌํ์ฌ ๋ค์์ ์ํํ ์์ ์ ๊ฒฐ์ ํฉ๋๋ค. ๋ค์ํ ๋คํธ์ํฌ ์กฐ๊ฑด๊ณผ ๊ธฐ๊ธฐ ์ฑ๋ฅ์ ๊ฐ์ง ์ฌ์ฉ์์๊ฒ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ, ์ด๋ฌํ ์ง๋ฅ์ ์ธ ์ฐ์ ์์ ๋ถ์ฌ๋ ๋ฐ์์ฑ์ ์ ์งํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์๋ฌ ๊ฒฝ๊ณ(Error Boundaries)
Fiber์ ๋ ๋๋ง ์ค๋จ ๋ฐ ์ฌ๊ฐ ๋ฅ๋ ฅ์ ๋ํ ๋ ๊ฐ๋ ฅํ ์๋ฌ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ธ ์๋ฌ ๊ฒฝ๊ณ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์ต๋๋ค. React ์๋ฌ ๊ฒฝ๊ณ๋ ์์ ์ปดํฌ๋ํธ ํธ๋ฆฌ ์ด๋์์๋ ์๋ฐ์คํฌ๋ฆฝํธ ์๋ฌ๋ฅผ ์ก์๋ด๊ณ , ํด๋น ์๋ฌ๋ฅผ ๊ธฐ๋กํ๋ฉฐ, ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ถฉ๋์ํค๋ ๋์ ๋์ฒด UI๋ฅผ ํ์ํ๋ ์ปดํฌ๋ํธ์ ๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์๋ ฅ์ ํฌ๊ฒ ํฅ์์์ผ ๋จ์ผ ์ปดํฌ๋ํธ ์๋ฌ๊ฐ ๋ค๋ฅธ ๊ธฐ๊ธฐ ๋ฐ ๋ธ๋ผ์ฐ์ ์ ๋ฐ์ ๊ฑธ์ณ ์ ์ฒด ์ฌ์ฉ์ ๊ฒฝํ์ ๋ฐฉํดํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
Suspense์ ๋น๋๊ธฐ UI
Fiber์ ๋์์ฑ ๊ธฐ๋ฅ ์์ ๊ตฌ์ถ๋ ๊ฐ์ฅ ํฅ๋ฏธ๋ก์ด ๊ธฐ๋ฅ ์ค ํ๋๋ Suspense์ ๋๋ค. Suspense๋ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋งํ๊ธฐ ์ ์ ๋ฌด์ธ๊ฐ(์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ, ์ฝ๋ ๋ถํ , ์ด๋ฏธ์ง ๋ก๋ฉ)๋ฅผ "๊ธฐ๋ค๋ฆด" ์ ์๊ฒ ํฉ๋๋ค. ์ปดํฌ๋ํธ๊ฐ ๊ธฐ๋ค๋ฆฌ๋ ๋์ Suspense๋ ๋์ฒด ๋ก๋ฉ UI(์: ์คํผ๋)๋ฅผ ํ์ํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ ์ฝ๋๊ฐ ์ค๋น๋๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ฉ๋๋ค. ์ด ์ ์ธ์ ์ ๊ทผ ๋ฐฉ์์ ๋น๋๊ธฐ UI ํจํด์ ์๋นํ ๋จ์ํํ๊ณ , ํนํ ๋๋ฆฐ ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์์๊ฒ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ํ์ํฌ ์ ์๋ "๋ก๋ฉ ์ํฐํด"์ ์ ๊ฑฐํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๊ธ๋ก๋ฒ ๋ด์ค ํฌํธ์ ์์ํด ๋ณด์ญ์์ค. Suspense๋ฅผ ์ฌ์ฉํ๋ฉด `NewsFeed` ์ปดํฌ๋ํธ๋ ๊ธฐ์ฌ๊ฐ ๊ฐ์ ธ์ฌ ๋๊น์ง ์ผ์ ์ค๋จํ๊ณ ์ค์ผ๋ ํค ๋ก๋๋ฅผ ํ์ํ ์ ์์ต๋๋ค. `AdBanner` ์ปดํฌ๋ํธ๋ ๊ด๊ณ ์ฝํ ์ธ ๊ฐ ๋ก๋๋ ๋๊น์ง ์ผ์ ์ค๋จํ๊ณ ํ๋ ์ด์คํ๋๋ฅผ ํ์ํ ์ ์์ต๋๋ค. ์ด๋ค์ ๋ ๋ฆฝ์ ์ผ๋ก ๋ก๋๋ ์ ์์ผ๋ฉฐ, ์ฌ์ฉ์๋ ์ ์ง์ ์ด๊ณ ๋ ๊ฑฐ์ฌ๋ฆฌ๋ ๊ฒฝํ์ ํ๊ฒ ๋ฉ๋๋ค.
๊ฐ๋ฐ์๋ฅผ ์ํ ์ค์ง์ ์ธ ์๋ฏธ์ ์ด์
Fiber์ ์ํคํ ์ฒ๋ฅผ ์ดํดํ๋ฉด React ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ ํํ๊ณ ๊ทธ ์ ์ฌ๋ ฅ์ ์ต๋ํ ํ์ฉํ๋ ๋ฐ ๊ท์คํ ํต์ฐฐ๋ ฅ์ ์ป์ ์ ์์ต๋๋ค:
- ๋ ๋ถ๋๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ: ๊ฐ์ฅ ์ฆ๊ฐ์ ์ธ ์ด์ ์ ๋ ์ ๋์ ์ด๊ณ ๋ฐ์์ฑ ์ข์ UI์ ๋๋ค. ์ฌ์ฉ์๋ ๊ธฐ๊ธฐ๋ ์ธํฐ๋ท ์๋์ ๊ด๊ณ์์ด ๋ฉ์ถค ํ์์ด๋ ๋ฒ๋ฒ ์์ ๋ ๊ฒฝํํ๊ฒ ๋์ด ๋ง์กฑ๋๊ฐ ๋์์ง๋๋ค.
- ํฅ์๋ ์ฑ๋ฅ: ์์ ์ ์ง๋ฅ์ ์ผ๋ก ์ฐ์ ์์๋ฅผ ์ ํ๊ณ ์ค์ผ์ค๋งํจ์ผ๋ก์จ Fiber๋ ์ค์ํ ์ ๋ฐ์ดํธ(์ ๋๋ฉ์ด์ ์ด๋ ์ฌ์ฉ์ ์ ๋ ฅ ๋ฑ)๊ฐ ๋ ์๊ธํ ์์ ์ ์ํด ์ฐจ๋จ๋์ง ์๋๋ก ๋ณด์ฅํ์ฌ ์ฒด๊ฐ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
- ๋จ์ํ๋ ๋น๋๊ธฐ ๋ก์ง: Suspense์ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ฐ๋ฐ์๊ฐ ๋ก๋ฉ ์ํ์ ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ ํฌ๊ฒ ๋จ์ํํ์ฌ ๋ ๊นจ๋ํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ํฉ๋๋ค.
- ๊ฒฌ๊ณ ํ ์๋ฌ ์ฒ๋ฆฌ: ์๋ฌ ๊ฒฝ๊ณ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋ณต์๋ ฅ ์๊ฒ ๋ง๋ค์ด ์น๋ช ์ ์ธ ์คํจ๋ฅผ ๋ฐฉ์งํ๊ณ ์ฐ์ํ ์ฑ๋ฅ ์ ํ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
- ๋ฏธ๋ ๋๋น: Fiber๋ ๋ฏธ๋์ React ๊ธฐ๋ฅ๊ณผ ์ต์ ํ๋ฅผ ์ํ ๊ธฐ๋ฐ์ด ๋์ด, ์ค๋๋ ๊ตฌ์ถ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ํ๊ณ๊ฐ ์งํํจ์ ๋ฐ๋ผ ์๋ก์ด ๊ธฐ๋ฅ์ ์ฝ๊ฒ ์ฑํํ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
์ฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ์ ํต์ฌ ๋ก์ง ์ฌ์ธต ๋ถ์
React๊ฐ ๋ ๋ ๋จ๊ณ์์ Fiber ํธ๋ฆฌ ๋ด์ ๋ณ๊ฒฝ ์ฌํญ์ ์ด๋ป๊ฒ ์๋ณํ๋์ง์ ๋ํ ํต์ฌ ๋ก์ง์ ๊ฐ๋ตํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋น๊ต ์๊ณ ๋ฆฌ์ฆ๊ณผ ํด๋ฆฌ์คํฑ (`key` Prop์ ์ญํ )
ํ์ฌ Fiber ํธ๋ฆฌ์ ์๋ก์ด ์์ ์งํ ์ค ํธ๋ฆฌ๋ฅผ ๋น๊ตํ ๋, React๋ ๋น๊ต ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ๋ค์๊ณผ ๊ฐ์ ํด๋ฆฌ์คํฑ์ ์ฌ์ฉํฉ๋๋ค:
- ๋ค๋ฅธ ์๋ฆฌ๋จผํธ ํ์ : ์๋ฆฌ๋จผํธ์ `type`์ด ๋ณ๊ฒฝ๋๋ฉด(์: `<div>`๊ฐ `<p>`๋ก ๋ณ๊ฒฝ), React๋ ์ด์ ์ปดํฌ๋ํธ/์๋ฆฌ๋จผํธ๋ฅผ ํด์ฒดํ๊ณ ์ ๊ฒ์ ์ฒ์๋ถํฐ ๋ค์ ๋ง๋ญ๋๋ค. ์ด๋ ์ด์ DOM ๋ ธ๋์ ๊ทธ ๋ชจ๋ ์์๋ค์ ํ๊ดดํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- ๊ฐ์ ์๋ฆฌ๋จผํธ ํ์ : `type`์ด ๊ฐ์ผ๋ฉด React๋ props๋ฅผ ์ดํด๋ด ๋๋ค. ๊ธฐ์กด DOM ๋ ธ๋์์ ๋ณ๊ฒฝ๋ props๋ง ์ ๋ฐ์ดํธํฉ๋๋ค. ์ด๋ ๋งค์ฐ ํจ์จ์ ์ธ ์์ ์ ๋๋ค.
- ์์ ๋ชฉ๋ก ์ฌ์กฐ์ (`key` prop): ์ฌ๊ธฐ์ `key` prop์ด ํ์์ ์ด ๋ฉ๋๋ค. ์์ ๋ชฉ๋ก์ ์ฌ์กฐ์ ํ ๋, React๋ `key`๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ค ํญ๋ชฉ์ด ๋ณ๊ฒฝ, ์ถ๊ฐ ๋๋ ์ ๊ฑฐ๋์๋์ง ์๋ณํฉ๋๋ค. `key`๊ฐ ์์ผ๋ฉด React๋ ๋นํจ์จ์ ์ผ๋ก ๊ธฐ์กด ์๋ฆฌ๋จผํธ๋ฅผ ๋ค์ ๋ ๋๋งํ๊ฑฐ๋ ์ฌ์ ๋ ฌํ์ฌ ์ฑ๋ฅ ๋ฌธ์ ๋ ๋ฆฌ์คํธ ๋ด ์ํ ๋ฒ๊ทธ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค. ๊ณ ์ ํ๊ณ ์์ ์ ์ธ `key`(์: ๋ฐฐ์ด ์ธ๋ฑ์ค๊ฐ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ID)๋ฅผ ์ฌ์ฉํ๋ฉด React๋ ์ด์ ๋ชฉ๋ก์ ์๋ฆฌ๋จผํธ๋ฅผ ์ ๋ชฉ๋ก์ ์๋ฆฌ๋จผํธ์ ์ ํํ๊ฒ ์ผ์น์์ผ ํจ์จ์ ์ธ ์ ๋ฐ์ดํธ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
Fiber์ ์ค๊ณ๋ ์ด๋ฌํ ๋น๊ต ์์ ์ ์ ์ง์ ์ผ๋ก ์ํํ๊ณ ํ์ํ ๋ ์ผ์ ์ค์งํ ์ ์๊ฒ ํด์ฃผ๋ฉฐ, ์ด๋ ์ด์ ์คํ ์ฌ์กฐ์ ๊ธฐ์์๋ ๋ถ๊ฐ๋ฅํ์ต๋๋ค.
Fiber๊ฐ ๋ค์ํ ์ ํ์ ์ ๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ
React์์ ๋ฆฌ๋ ๋๋ฅผ ์ ๋ฐํ๋ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ(์: `setState`, `forceUpdate`, `useState` ์ ๋ฐ์ดํธ, `useReducer` ๋์คํจ์น)์ ์๋ก์ด ์ฌ์กฐ์ ํ๋ก์ธ์ค๋ฅผ ์์ํฉ๋๋ค. ์ ๋ฐ์ดํธ๊ฐ ๋ฐ์ํ๋ฉด React๋ ๋ค์์ ์ํํฉ๋๋ค:
- ์์ ์์ฝ: ์ ๋ฐ์ดํธ๋ ํน์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ํ์ ์ถ๊ฐ๋ฉ๋๋ค.
- ์์ ์์: ์ค์ผ์ค๋ฌ๋ ์ฐ์ ์์์ ์ฌ์ฉ ๊ฐ๋ฅํ ์๊ฐ ์กฐ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์ธ์ ์ ๋ฐ์ดํธ ์ฒ๋ฆฌ๋ฅผ ์์ํ ์ง ๊ฒฐ์ ํฉ๋๋ค.
- Fiber ์ํ: React๋ ๋ฃจํธ Fiber(๋๋ ์ ๋ฐ์ดํธ๋ ์ปดํฌ๋ํธ์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์)์์ ์์ํ์ฌ ์๋๋ก ์ํํฉ๋๋ค.
- `beginWork` ํจ์: ๊ฐ Fiber์ ๋ํด React๋ `beginWork` ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. ์ด ํจ์๋ ์์ Fiber๋ฅผ ์์ฑํ๊ณ , ๊ธฐ์กด ์์์ ์ฌ์กฐ์ ํ๋ฉฐ, ๋ค์์ ์ฒ๋ฆฌํ ์์์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค.
- `completeWork` ํจ์: Fiber์ ๋ชจ๋ ์์์ด ์ฒ๋ฆฌ๋๋ฉด React๋ `completeWork`๋ฅผ ํธ์ถํ์ฌ ํด๋น Fiber์ ๋ํ ์์ ์ "์๋ฃ"ํฉ๋๋ค. ์ฌ๊ธฐ์ ์ฌ์ด๋ ์ดํํธ๊ฐ ํ์๋ฉ๋๋ค(์: DOM ์ ๋ฐ์ดํธ ํ์, ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋ ํธ์ถ ํ์). ์ด ํจ์๋ ๊ฐ์ฅ ๊น์ ์์์์ ๋ฃจํธ ์ชฝ์ผ๋ก ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋๋ค.
- ์ดํํธ ๋ฆฌ์คํธ ์์ฑ: `completeWork`๊ฐ ์คํ๋๋ฉด์, ์ปค๋ฐ ๋จ๊ณ์์ ์ ์ฉํด์ผ ํ ์ฌ์ด๋ ์ดํํธ๊ฐ ์๋ ๋ชจ๋ Fiber์ ๋ชฉ๋ก์ธ "์ดํํธ ๋ฆฌ์คํธ"๋ฅผ ๋ง๋ญ๋๋ค.
- ์ปค๋ฐ: ๋ฃจํธ Fiber์ `completeWork`๊ฐ ์๋ฃ๋๋ฉด ์ ์ฒด ์ดํํธ ๋ฆฌ์คํธ๋ฅผ ์ํํ๋ฉฐ ์ค์ DOM ์กฐ์๊ณผ ์ต์ข ์๋ช ์ฃผ๊ธฐ/์ดํํธ ํธ์ถ์ด ์ด๋ฃจ์ด์ง๋๋ค.
์ด ์ฒด๊ณ์ ์ด๊ณ ์ค๋จ ๊ฐ๋ฅํ ๋ ๋จ๊ณ ์ ๊ทผ ๋ฐฉ์์ React๊ฐ ๊ณ ๋๋ก ์ํธ์์ฉ์ ์ด๊ณ ๋ฐ์ดํฐ ์ง์ฝ์ ์ธ ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ๋ณต์กํ UI ์ ๋ฐ์ดํธ๋ฅผ ์ฐ์ํ๊ฒ ๊ด๋ฆฌํ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
Fiber๋ฅผ ์ผ๋์ ๋ ์ฑ๋ฅ ์ต์ ํ
Fiber๊ฐ React์ ๋ด์ฌ๋ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํค์ง๋ง, ๊ฐ๋ฐ์๋ ์ฌ์ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ต์ ํ์ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. Fiber์ ์๋ ๋ฐฉ์์ ์ดํดํ๋ฉด ๋ ์ ๋ณด์ ์ ๊ฐํ ์ต์ ํ ์ ๋ต์ ์ธ์ธ ์ ์์ต๋๋ค:
- ๋ฉ๋ชจ์ด์ ์ด์ (`React.memo`, `useMemo`, `useCallback`): ์ด ๋๊ตฌ๋ค์ ์ถ๋ ฅ์ ๋ฉ๋ชจ์ด์งํ์ฌ ์ปดํฌ๋ํธ์ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ ๊ฐ์ ์ฌ๊ณ์ฐ์ ๋ฐฉ์งํฉ๋๋ค. Fiber์ ๋ ๋ ๋จ๊ณ๋ ๋ณ๊ฒฝ๋์ง ์์ ์ปดํฌ๋ํธ๋ผ๋ ์ฌ์ ํ ์ํํฉ๋๋ค. ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ด ๋จ๊ณ ๋ด์์ ์์ ์ ๊ฑด๋๋ฐ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ด๋ ์ฑ๋ฅ์ด ์ค์ํ ๊ธ๋ก๋ฒ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ๊ฐ์ง ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ค์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ํนํ ์ค์ํฉ๋๋ค.
- ์ฝ๋ ๋ถํ (`React.lazy`, `Suspense`): ์ฝ๋ ๋ถํ ์ Suspense๋ฅผ ํ์ฉํ๋ฉด ์ฌ์ฉ์๊ฐ ํน์ ์๊ฐ์ ํ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ง ๋ค์ด๋ก๋ํ๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค. ์ด๋ ํนํ ์ ํฅ ์์ฅ์ ๋๋ฆฐ ์ธํฐ๋ท ์ฐ๊ฒฐ์ ์ฌ์ฉํ๋ ์ฌ์ฉ์์ ์ด๊ธฐ ๋ก๋ ์๊ฐ์ ๊ฐ์ ํ๋ ๋ฐ ํ์์ ์ ๋๋ค.
- ๊ฐ์ํ: ๋๊ท๋ชจ ๋ชฉ๋ก์ด๋ ํ ์ด๋ธ(์: ์์ฒ ๊ฐ์ ํ์ด ์๋ ๊ธ์ต ๋์๋ณด๋ ๋๋ ๊ธ๋ก๋ฒ ์ฐ๋ฝ์ฒ ๋ชฉ๋ก)์ ํ์ํ ๋, ๊ฐ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(`react-window` ๋๋ `react-virtualized` ๋ฑ)๋ ๋ทฐํฌํธ์ ๋ณด์ด๋ ํญ๋ชฉ๋ง ๋ ๋๋งํฉ๋๋ค. ์ด๋ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ์ธํธ๊ฐ ๋ฐฉ๋ํ๋๋ผ๋ React๊ฐ ์ฒ๋ฆฌํด์ผ ํ๋ Fiber์ ์๋ฅผ ๊ทน์ ์ผ๋ก ์ค์ฌ์ค๋๋ค.
- React ๊ฐ๋ฐ์ ๋๊ตฌ๋ก ํ๋กํ์ผ๋ง: React ๊ฐ๋ฐ์ ๋๊ตฌ๋ Fiber ์ฌ์กฐ์ ๊ณผ์ ์ ์๊ฐํํ ์ ์๋ ๊ฐ๋ ฅํ ํ๋กํ์ผ๋ง ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ค ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๋์ง, ๊ฐ ๋จ๊ณ์ ์ผ๋ง๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋์ง ํ์ธํ๊ณ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ ์ ์์ต๋๋ค. ์ด๋ ๋ณต์กํ UI๋ฅผ ๋๋ฒ๊น ํ๊ณ ์ต์ ํํ๋ ๋ฐ ํ์์ ์ธ ๋๊ตฌ์ ๋๋ค.
- ๋ถํ์ํ Prop ๋ณ๊ฒฝ ํผํ๊ธฐ: ๋ด์ฉ์ด ์๋ฏธ์ ์ผ๋ก ๋ณ๊ฒฝ๋์ง ์์์์๋ ๋ถ๊ตฌํ๊ณ ๋งค ๋ ๋๋ง๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๋ ๋ฐฐ์ด ๋ฆฌํฐ๋ด์ props๋ก ์ ๋ฌํ๋ ๊ฒ์ ์ฃผ์ํด์ผ ํฉ๋๋ค. ์ด๋ `React.memo`๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ์์ ์ปดํฌ๋ํธ์์ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค. ์๋ก์ด ์ฐธ์กฐ๋ ๋ณ๊ฒฝ์ผ๋ก ๊ฐ์ฃผ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฏธ๋๋ฅผ ํฅํ์ฌ: React์ ๋์์ฑ ๊ธฐ๋ฅ์ ๋ฏธ๋
Fiber๋ ๊ณผ๊ฑฐ์ ์ฑ๊ณผ์ผ ๋ฟ๋ง ์๋๋ผ React์ ๋ฏธ๋๋ฅผ ์ํ ๊ธฐ๋ฐ์ ๋๋ค. React ํ์ ์ด ์ํคํ ์ฒ ์์ ๊ณ์ํด์ ๊ฐ๋ ฅํ ์๋ก์ด ๊ธฐ๋ฅ์ ๊ตฌ์ถํ์ฌ ์น UI ๊ฐ๋ฐ์ ๊ฐ๋ฅ์ฑ์ ๋์ฑ ํ์ฅํ๊ณ ์์ต๋๋ค:
- React ์๋ฒ ์ปดํฌ๋ํธ (RSC): Fiber์ ํด๋ผ์ด์ธํธ ์ธก ์ฌ์กฐ์ ๊ณผ ์ง์ ์ ์ธ ๊ด๋ จ์ ์์ง๋ง, RSC๋ ์ปดํฌ๋ํธ ๋ชจ๋ธ์ ํ์ฉํ์ฌ ์๋ฒ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๊ณ ํด๋ผ์ด์ธํธ๋ก ์คํธ๋ฆฌ๋ฐํฉ๋๋ค. ์ด๋ ํนํ ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ๊ณผ ๋ฒ๋ค ํฌ๊ธฐ๊ฐ ํฌ๊ฒ ๋ค๋ฅผ ์ ์๋ ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ตํ๋ฉฐ, ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์๊ฐ์ ํฌ๊ฒ ๊ฐ์ ํ๊ณ ํด๋ผ์ด์ธํธ ์ธก ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค์ ์ค์ผ ์ ์์ต๋๋ค.
- ์คํ์คํฌ๋ฆฐ API(Offscreen API): ์ด ๊ณง ์ถ์๋ API๋ React๊ฐ ๋ณด์ด๋ UI์ ์ฑ๋ฅ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ํ๋ฉด ๋ฐ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ ํญ ์ธํฐํ์ด์ค์ ๊ฐ์ ์๋๋ฆฌ์ค์ ์ ์ฉํ๋ฉฐ, ๋นํ์ฑ ํญ์ ๋ ๋๋ง๋ ์ํ๋ก ์ ์ง(๊ทธ๋ฆฌ๊ณ ์ ์ฌ์ ์ผ๋ก ๋ฏธ๋ฆฌ ๋ ๋๋ง)ํ๋ ์๊ฐ์ ์ผ๋ก๋ ํ์ฑํ๋์ง ์๋๋ก ํ์ฌ ์ฌ์ฉ์๊ฐ ํญ์ ์ ํํ ๋ ์ฆ๊ฐ์ ์ธ ์ ํ์ ๋ณด์ฅํฉ๋๋ค.
- ํฅ์๋ Suspense ํจํด: Suspense๋ฅผ ๋๋ฌ์ผ ์ํ๊ณ๋ ์ง์์ ์ผ๋ก ๋ฐ์ ํ๊ณ ์์ผ๋ฉฐ, ํจ์ฌ ๋ ๋ณต์กํ UI ์๋๋ฆฌ์ค์ ๋ํด ๋ก๋ฉ ์ํ, ์ ํ ๋ฐ ๋์ ๋ ๋๋ง์ ๊ด๋ฆฌํ๋ ๋ ์ ๊ตํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
Fiber ์ํคํ ์ฒ์ ๋ฟ๋ฆฌ๋ฅผ ๋ ์ด๋ฌํ ๋ชจ๋ ํ์ ์ ์ ์ธ๊ณ์ ๋ค์ํ ์ฌ์ฉ์ ํ๊ฒฝ์ ์ ์ํ ์ ์๋ ๊ณ ์ฑ๋ฅ์ ํ๋ถํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ด์ ๋ณด๋ค ๋ ์ฝ๊ณ ํจ์จ์ ์ผ๋ก ๊ตฌ์ถํ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๋ค.
๊ฒฐ๋ก : ๋ชจ๋ React ๋ง์คํฐํ๊ธฐ
React Fiber๋ React๋ฅผ ๊ฐ๋ ฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํ๋์ ์ธ UI๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ์ ์ฐํ๊ณ ๋ฏธ๋ ์งํฅ์ ์ธ ํ๋ซํผ์ผ๋ก ๋ณ๋ชจ์ํจ ๊ธฐ๋ ๋น์ ์ธ ์์ง๋์ด๋ง ๋ ธ๋ ฅ์ ๊ฒฐ๊ณผ๋ฌผ์ ๋๋ค. ๋ ๋๋ง ์์ ์ ์ปค๋ฐ ๋จ๊ณ์์ ๋ถ๋ฆฌํ๊ณ ์ค๋จ ๊ฐ๋ฅ์ฑ์ ๋์ ํจ์ผ๋ก์จ, Fiber๋ ์๋ก์ด ์๋์ ๋์์ฑ ๊ธฐ๋ฅ์ ์ํ ๊ธฐ๋ฐ์ ๋ง๋ จํ์ฌ ๋ ๋ถ๋๋ฝ๊ณ , ๋ ๋ฐ์์ฑ ์ข์ผ๋ฉฐ, ๋ ๋ณต์๋ ฅ ์๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฅํ๊ฒ ํ์ต๋๋ค.
๊ฐ๋ฐ์์๊ฒ Fiber์ ๋ํ ๊น์ ์ดํด๋ ๋จ์ํ ํ๋ฌธ์ ์ธ ์ฐ์ต์ด ์๋๋ผ ์ ๋ต์ ์ด์ ์ ๋๋ค. ์ด๋ ๋ ์ฑ๋ฅ์ด ์ข์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ , ๋ฌธ์ ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ง๋จํ๋ฉฐ, ์ ์ธ๊ณ์ ๊ฑธ์ณ ํ์ ์ถ์ข ์ ๋ถํํ๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ์ต์ฒจ๋จ ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์๋ ํ์ ์ค๋๋ค. React ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณ์ ๊ตฌ์ถํ๊ณ ์ต์ ํํ๋ฉด์, ๊ทธ ํต์ฌ์๋ UI๊ฐ ์ฌ์ฉ์์ ์์น์ ๊ด๊ณ์์ด ์ ์ํ๊ณ ์ฐ์ํ๊ฒ ๋ฐ์ํ ์ ์๋๋ก ํ๋ Fiber๋ค์ ๋ณต์กํ ์ถค์ด ์๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์ญ์์ค.