๐ React Fiber ํบ์ ๋ณด๊ธฐ! ๐
React Fiber๋ React๊ฐ UI ์ ๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํ๋ ์๋ก์ด ์ฝ์ด ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, React 16์์ ์ฒ์ ๋์ ๋์์ต๋๋ค.
Fiber๋ React๋ฅผ ํ์ธต ๋ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ๊ฒ ๋ง๋ค์ด์ฃผ๋ ๊ธฐ์ ๋ก, ๋น๋๊ธฐ ๋ ๋๋ง์ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ๋ณต์กํ UI๋ฅผ ๋น ๋ฅด๊ณ ๋ถ๋๋ฝ๊ฒ ๋ ๋๋งํ ์ ์๋๋ก ๋์์ค๋๋ค. ํนํ, Fiber๋ ๊ธด ์์ ์ ์์ ๋จ์๋ก ๋๋์ด ์ฐ์ ์์์ ๋ฐ๋ผ ์ฒ๋ฆฌํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ, ์ฌ์ฉ์๊ฐ ์ํธ์์ฉํ๋ ๋์์๋ UI๊ฐ ์ํํ๊ฒ ์ ๋ฐ์ดํธ๋ ์ ์๋๋ก ํฉ๋๋ค.
๋ํ, Fiber๋ ๋ค์ํ ๋ ๋๋ง ์ ๋ต์ ์ง์ํ์ฌ ๊ฐ๋ฐ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ์ ๋ง๋ ์ต์ ์ ์ฑ๋ฅ์ ๋ฌ์ฑํ ์ ์๊ฒ ํด์ค๋ค๊ณ ํฉ๋๋ค. ์ด๋ฌํ ์ ์์ Fiber๋ React์ ํต์ฌ ์ํคํ ์ฒ๋ฅผ ๋ณํ์์ผฐ๊ณ ๊ฐ๋ฐ์์๊ฒ ๋ ๋ง์ ์ ์ด๊ถ๊ณผ ์ ์ฐ์ฑ์ ์ ๊ณตํ์ต๋ค.
์ด๋ฒ ๊ธ์์๋ React Fiber์ ์ฃผ์ ๊ฐ๋ ๊ณผ ์๋ ๋ฐฉ์, ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ํ์ฉํ์ฌ ์ด๋ป๊ฒ ๋ ํจ์จ์ ์ด๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๋์ง์ ๋ํด ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
โฃ๏ธ ์ฐธ๊ณ ์ฌ์ดํธ
https://d2.naver.com/helloworld/2690975,
https://github.com/acdlite/react-fiber-architecture/blob/master/README.md
๐ React Fiber๋ ๋ฌด์์ธ๊ฐ?
1๏ธโฃ ๊ธฐ๋ณธ ์ ์
React Fiber๋ React์ ์ฌ์กฐ์ (Reconciliation) ์๊ณ ๋ฆฌ์ฆ์ ๋ค์ ์ค๊ณํ ๊ฒ์ผ๋ก, ๋ค์๊ณผ ๊ฐ์ ๋ชฉํ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค:
- ์ค๋จ ๊ฐ๋ฅํ ๋ ๋๋ง: ์์ ์ ๋๋ ์ ์ฒ๋ฆฌํ๊ณ , ์ค์ํ ์์ ์ ๋จผ์ ์ฒ๋ฆฌ
- ์ฐ์ ์์ ๊ธฐ๋ฐ ์ ๋ฐ์ดํธ: ์ค์ํ ์์ ์ ๋ ๋ง์ ๋ฆฌ์์ค๋ฅผ ํ ๋น
- ๋น ๋ฅธ ์ ๋๋ฉ์ด์ ์ฒ๋ฆฌ: ์ ๋๋ฉ์ด์ , ๋ ์ด์์, ์ ์ค์ฒ ๋ฑ๊ณผ ๊ฐ์ UI ์ฑ๋ฅ ๊ฐ์ ์ ํตํ ๋ถ๋๋ฌ์ด ์ฒ๋ฆฌ
2๏ธโฃ ์ Fiber๊ฐ ๋ฑ์ฅํ์๊น?
๊ธฐ์กด React์ ์ฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ(์คํ ๊ธฐ๋ฐ)์ ๋ชจ๋ ์์ ์ ๋๊ธฐ์ (Synchronous)์ผ๋ก ์ฒ๋ฆฌํ์ต๋๋ค.
์ฆ, ํ ๋ฒ ๋ ๋๋ง์ด ์์๋๋ฉด ์ค๋จ ์์ด ๋๊น์ง ์ฒ๋ฆฌํด์ผ ํ์ฃ .
ํ์ง๋ง ์ด๋ ๊ฒ ๋๋ฉด:
- ๋ณต์กํ UI๋ฅผ ๋ ๋๋งํ ๋ ์๋ต ์ง์ฐ์ด ๋ฐ์
- ์ฌ์ฉ์ ์ ๋ ฅ(ํด๋ฆญ, ์คํฌ๋กค ๋ฑ)์ ์ฆ๊ฐ์ ์ผ๋ก ๋ฐ์ํ๊ธฐ ์ด๋ ต๋ค.
Fiber๋ ์ด๋ฐ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ณ , ๋ ๋๋ง ์์ ์ ์๊ฒ ๋๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ฌ์ฉ์์์ ์ํธ์์ฉ์ ๋์น์ง ์๋๋ก ์ค๊ณ๋์์ต๋๋ค.
๐งฉ React Fiber์ ๊ตฌ์กฐ
1๏ธโฃ Fiber ๋ ธ๋(Fiber Node)
Fiber๋ Fiber Node๋ผ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํฉ๋๋ค. ์ด ๋ ธ๋๋ React ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ๊ฐ ์์๋ฅผ ๋ํ๋ ๋๋ค.
- ๊ตฌ์ฑ ์์
- ๊ฐ Fiber ๋ ธ๋๋ ์ปดํฌ๋ํธ ์ ๋ณด(์: ํ์ , props), ์ํ(state), DOM ์ ๋ณด(์: ์ค์ DOM ์์์ ๋ํ ์ฐธ์กฐ) ๋ฑ์ ํฌํจ
- ์ด๋ฅผ ํตํด React๋ ๊ฐ ์ปดํฌ๋ํธ์ ํ์ฌ ์ํ๋ฅผ ํจ์จ์ ์ผ๋ก ์ถ์ ํ ์ ์์
- ์
๋ฐ์ดํธ ์ ํ์ฑ
- ๋ ๋๋ง ์์ ์ด ์งํ๋๋ฉด์ ์ ๋ฐ์ดํธ๊ฐ ํ์ํ ๋ ธ๋๋ง ์ ํ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ => ๋ถํ์ํ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐฉ์ง, ์ฑ๋ฅ์ ์ต์ ํ
- ์ด ๊ณผ์ ์ React์ ํจ์จ์ ์ธ "์ฌ์กฐ์ (reconciliation)"์ ๊ฐ๋ฅํ๊ฒ ํจ + ํ์ํ ๋ถ๋ถ๋ง ๋น ๋ฅด๊ฒ ์ ๋ฐ์ดํธํ ์ ์์
- ๋งํฌ ๊ตฌ์กฐ
- ๊ฐ Fiber ๋ ธ๋๋ ๋ถ๋ชจ ๋ ธ๋์ ์์ ๋ ธ๋์ ๋ํ ๋งํฌ๋ฅผ ๊ฐ์ง๊ณ ์์ด, ์ ์ฒด ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ์ฝ๊ฒ ํ์ํ ์ ์์
- ์ด๋ฌํ ๋งํฌ ๊ตฌ์กฐ๋ ํธ๋ฆฌ์ ํน์ ๋ถ๋ถ๋ง ์ ๋ฐ์ดํธํ ์ ์๊ฒ ํด์ค
2๏ธโฃ ์์ ๋จ์(Work Unit)
Fiber๋ ์์ ์ ์๊ฒ ๋๋ ์์ ๋จ์(Unit of Work)๋ก ์ฒ๋ฆฌํฉ๋๋ค.
- ์ค๋จ ๋ฐ ์ฌ๊ฐ
- ๋ ๋๋ง ์ค์๋ ์์ ์ ์ค๋จํ๊ณ ๋์ค์ ์ฌ๊ฐํ ์ ์์ด, ๊ธด ์์ ์ด ์ฌ์ฉ์ ์ธํฐ๋์ ์ ์ํด ๋ฐฉํด๋ฐ์ง ์๋๋ก ํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ ์ ๋ ฅ์ด๋ ์ ๋๋ฉ์ด์ ๊ณผ ๊ฐ์ ๋ ์ค์ํ ์์ ์ด ์ฐ์ ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ๋น๋๊ธฐ ์ฒ๋ฆฌ
- ์ด๋ฅผ ํตํด ๋น๋๊ธฐ์ ์ผ๋ก ์์ ์ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, ์ฌ์ฉ์ ๊ฒฝํ์ ์ ํดํ์ง ์์ผ๋ฉด์๋ ๋ณต์กํ UI๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ ๋๋งํ ์ ์์ต๋๋ค.
- ์ด ๋ฐฉ์์ ํนํ ์ฑ๋ฅ์ด ์ค์ํ ๋ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํฐ ์ฅ์ ์ ์ ๊ณตํฉ๋๋ค.
- ์ฐ์ ์์ ์กฐ์
- ๊ฐ ์์ ๋จ์๋ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ๋์ ์ฐ์ ์์์ ์์ ์ด ๋จผ์ ์ฒ๋ฆฌ๋๋๋ก ์ค๊ณ๋์ด ์์ต๋๋ค.
- ์ด๋ก ์ธํด React ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์์ฑ์ด ํฌ๊ฒ ํฅ์๋ฉ๋๋ค.
๐ก React Fiber์ ์ฃผ์ ํน์ง
1๏ธโฃ ์ค๋จ ๊ฐ๋ฅํ ๋ ๋๋ง
Fiber์ ๊ฐ์ฅ ํฐ ํ์ ์ ์์ ์ ์ค๋จํ๊ณ ๋์ค์ ์ฌ๊ฐํ ์ ์๋ค๋ ์ ์ ๋๋ค.
- ๊ธด ๋ ๋๋ง ์์ ์ค๊ฐ์ ์ฌ์ฉ์ ์ด๋ฒคํธ(์: ํด๋ฆญ, ์คํฌ๋กค)๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ๋ ๋๋ง ์์ ์ ๋ธ๋ผ์ฐ์ ์ Idle Time(์ฌ์ ์๊ฐ)์ ๋ค์ ์์๋๋ฉฐ, ์ด ๊ณผ์ ์์ ์ฌ์ฉ์๊ฐ ์ธํฐํ์ด์ค์ ์ํธ์์ฉ ํ ์ ์๊ฒ ๋ฉ๋๋ค.
- ์์ ์ ์ผ์ ์ค๋จํ ํ, ํ์์ ๋ฐ๋ผ ์ฌ๊ฐํ๊ฑฐ๋, ๋ค๋ฅธ ์์ ์ ์ฌํ์ฉํ ์ ์์ด ๋ฆฌ์์ค๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
2๏ธโฃ ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง
Fiber๋ ์์ ์ ์ฐ์ ์์(Priority)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ ๋๋ง ์์๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
- ๋์ ์ฐ์ ์์(์ฌ์ฉ์ ์ ๋ ฅ, ์ ๋๋ฉ์ด์ ๋ฑ)๋ ์ฆ์ ์ฒ๋ฆฌ๋์ด ์ฌ์ฉ์์๊ฒ ๋น ๋ฅธ ๋ฐ์์ ์ ๊ณตํฉ๋๋ค.
- ๋ฎ์ ์ฐ์ ์์(๋ฐฑ๊ทธ๋ผ์ด๋ ๋ฐ์ดํฐ ๋ก๋, ๋น๊ฐ์์ DOM ์ ๋ฐ์ดํธ ๋ฑ)๋ ์ฌ์ฉ์์ ์ธํฐํ์ด์ค์ ์ํฅ์ ๋ฏธ์น์ง ์๋ ๋ฒ์์์ ์ฒ๋ฆฌ๋ฉ๋๋ค.
๊ฐ๋ฐ์๋ ์ด๋ฐ ์ ๋ฐ์ดํธ์ ์ฐ์ ์์๋ฅผ ์ค์ ํ ์ ์์ด, ๋ ๋์ ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
3๏ธโฃ ๋ ์ธ๋ฐํ ์ฌ์กฐ์
Fiber๋ ๋ ๋๋ง ํธ๋ฆฌ๋ฅผ ๋์ฑ ์ธ๋ฐํ๊ฒ ๊ด๋ฆฌํ์ฌ ๋ถํ์ํ DOM ์ ๋ฐ์ดํธ๋ฅผ ์ค์ด๊ณ , ํจ์จ์ ์ผ๋ก ์์ ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ๊ฐ ์ปดํฌ๋ํธ์ ์ํ ๋ณํ์ ๋ฐ๋ผ ํ์ํ ๋ถ๋ถ๋ง ์ ๋ฐ์ดํธํ ์ ์์ด, ์ ์ฒด DOM์ ๋ค์ ๊ทธ๋ฆฌ๋ ๋์ ์ต์ํ์ ๋ณ๊ฒฝ๋ง ์ ์ฉํฉ๋๋ค.
- ์ด๋ก ์ธํด ์ฑ๋ฅ์ด ํฅ์๋๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์์ฑ์ด ๋์์ง๋๋ค.
4๏ธโฃ ์ ์ง์ ๋ ๋๋ง (Incremental Rendering)
๋ ๋๋ง ์์ ์ ์ฌ๋ฌ ํ๋ ์์ ๋๋์ด ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๊ธด ์์ ์ ์ฌ๋ฌ ๋จ๊ณ๋ก ๋๋์ด ์ฒ๋ฆฌํจ์ผ๋ก์จ, UI๊ฐ ๋ฉ์ถ์ง ์๊ณ ์ฌ์ฉ์์๊ฒ ๋ถ๋๋ฌ์ด ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
- ์ด ๋ฐฉ์์ ํนํ ๋ณต์กํ UI๋ฅผ ๋ค๋ฃฐ ๋ ์ ์ฉํ๋ฉฐ, ์ฌ์ฉ์ ์ํธ์์ฉ์ ๋์ฑ ์ํํ๊ฒ ๋ง๋ญ๋๋ค.
5๏ธโฃ ๋์์ฑ ์ง์
Fiber๋ ๋์์ฑ์ ์ง์ํ์ฌ ์ฌ๋ฌ ์์ ์ ๋์์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ ์์ ์ ๋ณ๋ ฌ๋ก ์ํํ ์ ์์ผ๋ฉฐ, ํน์ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๋ค๋ฅธ ์์ ์ด ๋ฉ์ถ์ง ์์ต๋๋ค.
- ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ์๋ต์ฑ์ ๋์ด๊ณ , ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์์์ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ๋ฐ ํฐ ๋์์ด ๋ฉ๋๋ค.
โ๏ธ Fiber์ ๋์ ์๋ฆฌ
1๏ธโฃ ๋ ๋ ๋จ๊ณ(Render Phase):
- ๊ฐ์ DOM ํธ๋ฆฌ ์์ฑ
- ์ด ๋จ๊ณ์์ React๋ ๊ฐ์ DOM ํธ๋ฆฌ๋ฅผ ์์ฑํ๊ณ , ํ์ฌ ์ํ์ ์ด์ ์ํ๋ฅผ ๋น๊ตํ์ฌ ํ์ํ ์ ๋ฐ์ดํธ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ์ด ๊ณผ์ ์ React์ ํจ์จ์ ์ธ ์ฌ์กฐ์ (reconciliation) ์๊ณ ๋ฆฌ์ฆ์ ํตํด ์ด๋ฃจ์ด์ง๋๋ค.
- ์ค๋จ ๊ฐ๋ฅ์ฑ
- ๋ ๋ ๋จ๊ณ๋ ์ค๋จ ๊ฐ๋ฅํ๋ค๋ ํน์ง์ด ์์ต๋๋ค. ์์ ๋จ์๋ฅผ ๋๋์ด ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์, ๊ธด ๋ ๋๋ง ์์ ์ค๊ฐ์ ์ฌ์ฉ์ ์ด๋ฒคํธ(์: ํด๋ฆญ, ์คํฌ๋กค)๊ฐ ๋ฐ์ํ๋ฉด ํด๋น ์ด๋ฒคํธ๋ฅผ ๋จผ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ์ด๋ฅผ ํตํด ์ฌ์ฉ์ ๊ฒฝํ์ ์ ํดํ์ง ์๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
- ์์
๋จ์ ์ฒ๋ฆฌ
- ๊ฐ ์์ ์ ์์ ๋จ์๋ก ๋๋์ด์ ธ ์ฒ๋ฆฌ๋๋ฉฐ, ํ์์ ๋ฐ๋ผ ์ค๋จํ๊ณ ์ฌ๊ฐํ ์ ์์ต๋๋ค.
- ์ด๋ฌํ ๋น๋๊ธฐ์ ํน์ฑ ๋๋ถ์, ๋ ๋๋ง ๊ณผ์ ์์ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ์์ ์ด ๋จผ์ ์ํ๋ ์ ์์ต๋๋ค.
2๏ธโฃ ์ปค๋ฐ ๋จ๊ณ(Commit Phase):
- DOM ์
๋ฐ์ดํธ ๋ฐ์
- ์ปค๋ฐ ๋จ๊ณ์์๋ ์ด์ ๋จ๊ณ์์ ๊ณ์ฐ๋ ์ ๋ฐ์ดํธ๋ฅผ ์ค์ DOM์ ๋ฐ์ํฉ๋๋ค.
- ์ด ๋จ๊ณ์์๋ ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ์ ๋ฐ์ดํธ๋๋ฏ๋ก ์ฑ๋ฅ์ด ์ต์ ํ๋ฉ๋๋ค.
- ์ค๋จ ๋ถ๊ฐ๋ฅ์ฑ
- ์ปค๋ฐ ๋จ๊ณ๋ ์ค๋จํ ์ ์์ผ๋ฉฐ, ๋น ๋ฅด๊ฒ ์๋ฃ๋์ด์ผ ํฉ๋๋ค.
- ์ด ๋จ๊ณ๊ฐ ์๋ฃ๋๋ฉด ์ฌ์ฉ์์๊ฒ ๋ณ๊ฒฝ ์ฌํญ์ด ์ฆ์ ๋ฐ์๋๋ฏ๋ก, UI์ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
- ํจ์จ์ ์ธ ๋ ๋๋ง
- ์ค์ DOM ์ ๋ฐ์ดํธ๊ฐ ์ด๋ฃจ์ด์ง๋ ์ด ๋จ๊ณ์์๋ React๊ฐ ์ต์ํ์ ๋ณ๊ฒฝ๋ง์ ์ ์ฉํ์ฌ ์ฑ๋ฅ์ ๊ทน๋ํํฉ๋๋ค.
- ์ด๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ๋ถ๋๋ฌ์ด ์ ํ๊ณผ ๋น ๋ฅธ ๋ฐ์์ฑ์ ๋ณด์ฅํฉ๋๋ค.
๐ Fiber๊ฐ UX๋ฅผ ์ด๋ป๊ฒ ๊ฐ์ ํ ๊น?
1๏ธโฃ ๋ถ๋๋ฌ์ด ์ ๋๋ฉ์ด์
- Fiber๋ ๋ ๋๋ง ์์ ์ ๋ธ๋ผ์ฐ์ ์ ์ ๋๋ฉ์ด์ ํ๋ ์(์ฝ 16ms)์ ๋ง์ถฐ ์กฐ์ ํ์ฌ, ์ ๋๋ฉ์ด์ ์ด ๋งค๋๋ฝ๊ฒ ์งํ๋๋๋ก ํฉ๋๋ค.
- ์ด๋ฅผ ํตํด ์ฌ์ฉ์๋ ์ ๋๋ฉ์ด์ ์ด ๋๊น ์์ด ํ๋ฅด๋ ๊ฒ์ฒ๋ผ ๋๋ผ๋ฉฐ, ์๊ฐ์ ์ผ๋ก ๋ ์พ์ ํ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
- Fiber์ ์ค๋จ ๊ฐ๋ฅํ ๋ ๋๋ง ํน์ฑ ๋๋ถ์, ๊ธด ๋ ๋๋ง ์์ ์ค์๋ ์ ๋๋ฉ์ด์ ์ด ์ฐ์ ์ ์ผ๋ก ์ฒ๋ฆฌ๋์ด ์ฌ์ฉ์์๊ฒ ์ํํ ์๊ฐ์ ํผ๋๋ฐฑ์ ์ ๊ณตํฉ๋๋ค.
2๏ธโฃ ์ฌ์ฉ์ ์ํธ์์ฉ ์ฐ์
- Fiber๋ ์ฌ์ฉ์์ ํด๋ฆญ, ์ ๋ ฅ ์ด๋ฒคํธ, ์คํฌ๋กค ๋ฑ์ ์ํธ์์ฉ์ ์ต์ฐ์ ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
- ์ด๋ก ์ธํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฆ๊ฐ์ ์ผ๋ก ๋ฐ์ํ๋ฉฐ, ์ฌ์ฉ์๋ ๋๊ธฐ ์๊ฐ ์์ด ์ฆ์ ํผ๋๋ฐฑ์ ๋ฐ์ ์ ์์ต๋๋ค.
- ์ด๋ฌํ ๋น ๋ฅธ ๋ฐ์์ฑ์ ์ฌ์ฉ์ ๋ง์กฑ๋๋ฅผ ๋์ด๊ณ , ๋ ๋์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์ ๋ขฐ๊ฐ์ ๊ตฌ์ถํ๋ ๋ฐ ํฐ ์ญํ ์ ํฉ๋๋ค.
3๏ธโฃ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์์ ํจ์จ์ฑ
- Fiber๋ ๋ณต์กํ UI์์๋ ํ์ํ ์ ๋ฐ์ดํธ๋ง ์ ํ์ ์ผ๋ก ์ฒ๋ฆฌํ์ฌ ์ฑ๋ฅ์ ๊ทน๋ํํฉ๋๋ค.
- ์ด๋ ํนํ ๋ฐ์ดํฐ๊ฐ ๋ง๊ณ ๋ณต์กํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋๋๋ฌ์ง๋ฉฐ, ๋ถํ์ํ DOM ์ ๋ฐ์ดํธ๋ฅผ ์ค์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด์ ์ธ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
- Fiber์ ์ธ๋ฐํ ์์ ๋จ์ ์ฒ๋ฆฌ ๋ฐ ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง ๋๋ถ์, ์ฌ์ฉ์๋ ๋๋ฆฐ ์ฑ๋ฅ์ด๋ ์ง์ฐ ์์ด ๋งค๋๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ฆ๊ธธ ์ ์์ต๋๋ค.
๐ ๏ธ React Fiber ์ค์ ์์
React Fiber๋ ๊ธฐ๋ณธ์ ์ผ๋ก React ๋ด๋ถ์์ ๋์ํ๊ธฐ ๋๋ฌธ์ ํน๋ณํ ์ค์ ํ ํ์๋ ์์ต๋๋ค. ํ์ง๋ง Fiber์ ๋์์ ๊ฐ์ ์ ์ผ๋ก ์ฒด๊ฐํ ์ ์๋ ์ฌ๋ก๋ฅผ ์ดํด๋ด ์๋ค
1. ๊ธด ๋ฆฌ์คํธ ๋ ๋๋ง ์ต์ ํ
import React, { useState } from 'react';
function LongList() {
const [items] = useState([...Array(10000).keys()]);
return (
<ul>
{items.map((item) => (
<li key={item}>{item}</li>
))}
</ul>
);
}
export default LongList;
์์ ๊ฐ์ ๋๊ท๋ชจ ๋ฆฌ์คํธ๋ฅผ ๋ ๋๋งํ ๋, React Fiber๋ ๋ ๋๋ง ์์ ์ ์๊ฒ ๋๋์ด UI๊ฐ ๋ฉ์ถ์ง ์๋๋ก ์ฒ๋ฆฌํฉ๋๋ค.
Fiber์ ๋์ ์ฒด๊ฐํ๊ธฐ
- ์ค๋จ ๊ฐ๋ฅํ ๋ ๋๋ง
- ๊ธด ๋ฆฌ์คํธ๋ฅผ ๋ ๋๋งํ๋ฉด์ ์ฌ์ฉ์๊ฐ ์คํฌ๋กค์ ํ๋๋ผ๋, Fiber๋ ํ์ฌ ๋ ๋๋ง ์์ ์ ์ค๋จํ๊ณ ์คํฌ๋กค ์ด๋ฒคํธ๋ฅผ ์ฐ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ์ด๋ฅผ ํตํด ์ฌ์ฉ์๋ ๋ฆฌ์คํธ๋ฅผ ์คํฌ๋กคํ๋ ๋์์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ตํ๊ณ ์๋ค๋ ๋๋์ ๋ฐ์ ์ ์์ต๋๋ค
- ์์
๋จ์ ์ฒ๋ฆฌ
- ๋ฆฌ์คํธ์ ๊ฐ ํญ๋ชฉ์ ๋ ๋ฆฝ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ฏ๋ก, React๋ ๋ ๋๋ง ์์ ์ ์ฌ๋ฌ ํ๋ ์์ ๋๋์ด ์ํํ ์ ์์ต๋๋ค.
- ์ด๋ก ์ธํด ์ ์ฒด ๋ ๋๋ง์ด ๋๋ ค์ง์ง ์๊ณ , ์ฌ์ฉ์๋ ๋ฆฌ์คํธ๋ฅผ ๋ณด๋ ๋ฐ ์์ด ๋งค๋๋ฌ์ด ๊ฒฝํ์ ๋๋ฆด ์ ์์ต๋๋ค.
์ถ๊ฐ ์์ : ๊ฐ์ ์คํฌ๋กค(Virtual Scrolling)
๋ฆฌ์คํธ๊ฐ ๋๋ฌด ๊ธธ์ด์ง ๊ฒฝ์ฐ, ์ฑ๋ฅ์ ๋์ฑ ๊ฐ์ ํ๊ธฐ ์ํด ๊ฐ์ ์คํฌ๋กค์ ๊ตฌํํ ์ ์์ต๋๋ค. ๊ฐ์ ์คํฌ๋กค์ ์ฌ์ฉ์๊ฐ ํ๋ฉด์ ๋ณด์ด๋ ํญ๋ชฉ๋ง ๋ ๋๋งํ์ฌ ์ฑ๋ฅ์ ๊ทน๋ํํฉ๋๋ค.
import React, { useState, useEffect } from 'react';
const ITEM_HEIGHT = 35; // ๊ฐ ํญ๋ชฉ์ ๋์ด
function VirtualList() {
const [items] = useState([...Array(10000).keys()]);
const [scrollY, setScrollY] = useState(0);
const handleScroll = (event) => {
setScrollY(event.target.scrollTop);
};
const startIndex = Math.floor(scrollY / ITEM_HEIGHT);
const endIndex = startIndex + Math.ceil(window.innerHeight / ITEM_HEIGHT);
return (
<div style={{ height: '100vh', overflowY: 'auto' }} onScroll={handleScroll}>
<ul>
{items.slice(startIndex, endIndex).map((item) => (
<li key={item} style={{ height: ITEM_HEIGHT }}>{item}</li>
))}
</ul>
</div>
);
}
export default VirtualList;
์ด ์์ ๋ ์คํฌ๋กค ์ด๋ฒคํธ์ ๋ฐ๋ผ ํ๋ฉด์ ๋ณด์ด๋ ํญ๋ชฉ๋ง ๋ ๋๋งํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํฉ๋๋ค.
Fiber๋ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก๋ ํจ๊ณผ์ ์ผ๋ก ์์ ์ ์ฒ๋ฆฌํ์ฌ, ์ฌ์ฉ์์๊ฒ ๋ถ๋๋ฌ์ด ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค!
๐ง React Fiber์ ํ๊ณ
1๏ธโฃ ๋ธ๋ผ์ฐ์ ์์ ํ๋ ฅ ํ์
- Fiber๋ ๋ธ๋ผ์ฐ์ ์ ์ฌ์ ์๊ฐ(Idle Time)์ ํ์ฉํ์ฌ ์์ ์ ์ํํฉ๋๋ค. ์ด๋ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐ ์ ๋ฆฌํ์ง๋ง, ๋ธ๋ผ์ฐ์ ์ ์ด๋ฒคํธ ๋ฃจํ์์ ํ๋ ฅ์ด ํ์์ ์ ๋๋ค.
- ๋ง์ฝ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฐ์ ์ํ(์: ๊ธด JavaScript ์คํ, ๋ณต์กํ CSS ์ ๋๋ฉ์ด์ ๋ฑ)๋ผ๋ฉด Fiber์ ๋ ๋๋ง ์์ ์ด ์ง์ฐ๋ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด UI ์ ๋ฐ์ดํธ๊ฐ ๋ฆ์ด์ง๊ฑฐ๋, ์ฌ์ฉ์ ๊ฒฝํ์ด ์ ํ๋ ์ ์์ต๋๋ค.
- ํนํ, ์ฑ๋ฅ์ด ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ด๋ฌํ ๋ธ๋ผ์ฐ์ ์ ์ํ๋ฅผ ๊ณ ๋ คํ์ฌ ์ฝ๋ ์ต์ ํ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ์ ์คํ๊ฒ ์ค๊ณํด์ผ ํฉ๋๋ค.
2๏ธโฃ ํ์ต ๊ณก์
- Fiber์ ๋์ ๋ฐฉ์์ ๊น์ด ์ดํดํ๋ ค๋ฉด ์๊ฐ์ด ํ์ํ ์ ์์ต๋๋ค. Fiber๋ ์ด์ ์ React ๊ตฌ์กฐ์๋ ๋ค๋ฅธ ๊ฐ๋ ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฏ๋ก, ์๋ก์ด ๊ฐ๋ฐ์๋ ๊ธฐ์กด React ๊ฐ๋ฐ์ ๋ชจ๋์๊ฒ ํ์ต ๊ณก์ ์ด ์กด์ฌํฉ๋๋ค.
- ํนํ, ์ค๋จ ๊ฐ๋ฅํ ๋ ๋๋ง, ์์ ๋จ์ ์ฒ๋ฆฌ, ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ ๋๋ง ๋ฑ์ ๊ฐ๋ ์ ์์ ํ ์ดํดํ๊ณ ํ์ฉํ๊ธฐ ์ํด์๋ ๊ฒฝํ์ด ํ์ํฉ๋๋ค.
- ์ด๋ฌํ ๋ณต์ก์ฑ์ผ๋ก ์ธํด, ์ด๋ณด์์๊ฒ๋ ์ง์ ์ฅ๋ฒฝ์ด ๋์์ง ์ ์์ผ๋ฉฐ, ํจ๊ณผ์ ์ผ๋ก Fiber๋ฅผ ํ์ฉํ๊ธฐ ์ํด์๋ ์ค์ ๊ฒฝํ์ด ์ค์ํฉ๋๋ค.
๐ท ์ ์ค์ ๊ฐ๋ฐ์๊ฐ ๋์ด๋ด ์๋น! ๐ท