React์ ๋ ๋๋ง ์ค์ผ์ค๋ง, ํ๋ ์ ์์ฐ ๊ด๋ฆฌ, ์ต์ ํ ๊ธฐ์ ์ ์ฌ์ธต์ ์ผ๋ก ๋ค๋ฃจ์ด ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ๊ณ ์ฑ๋ฅ ๋ฐ์ํ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ ๋ฐฉ๋ฒ์ ์์๋ด ๋๋ค.
React ๋ ๋๋ง ์ค์ผ์ค๋ง: ์ฑ๋ฅ์ ์ํ ํ๋ ์ ์์ฐ ๊ด๋ฆฌ ๋ง์คํฐํ๊ธฐ
๋น ๋ฅด๊ฒ ๋ณํํ๋ ์น ๊ฐ๋ฐ ์ธ๊ณ์์ ๋ถ๋๋ฝ๊ณ ๋ฐ์์ด ๋น ๋ฅธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ฒ์ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ์ฌ์ฉ์ ์ธํฐํ์ด์ค ๊ตฌ์ถ์ ์ํ ์ธ๊ธฐ ์๋ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ React๋ ๋ ๋๋ง ์ ๋ฐ์ดํธ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. React๊ฐ ๋ ๋๋ง์ ์ค์ผ์ค๋งํ๊ณ ํ๋ ์ ์์ฐ์ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๊ฒ์ ์ฌ์ฉ์์ ์ฅ์น๋ ์์น์ ๊ด๊ณ์์ด ๋น ๋ฅด๊ณ ๋ฐ์์ฑ์ด ์ข์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ์ด ์ข ํฉ ๊ฐ์ด๋์์๋ React ๋ ๋๋ง ์ค์ผ์ค๋ง์ ๋ณต์ก์ฑ์ ํ๊ตฌํ๊ณ , ํ๋ ์ ์์ฐ ๊ด๋ฆฌ๋ฅผ ๋ง์คํฐํ๊ณ ์ต์ ์ ์ฑ๋ฅ์ ๋ฌ์ฑํ๊ธฐ ์ํ ์ค์ฉ์ ์ธ ๊ธฐ์ ์ ์ ๊ณตํฉ๋๋ค.
๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ์ดํด
React์ ํน์ ๋ ๋๋ง ์ค์ผ์ค๋ง ๋ฉ์ปค๋์ฆ์ ๋ํด ์์๋ณด๊ธฐ ์ ์ ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ํฌํจ๋ ๊ธฐ๋ณธ ๋จ๊ณ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- JavaScript ์คํ: ๋ธ๋ผ์ฐ์ ๋ DOM(Document Object Model)์ ์์ ํ ์ ์๋ JavaScript ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
- ์คํ์ผ ๊ณ์ฐ: ๋ธ๋ผ์ฐ์ ๋ CSS ๊ท์น์ ๋ฐ๋ผ DOM์ ๊ฐ ์์์ ์ ์ฉ๋๋ ์คํ์ผ์ ๊ณ์ฐํฉ๋๋ค.
- ๋ ์ด์์: ๋ธ๋ผ์ฐ์ ๋ ๋ ์ด์์ ํธ๋ฆฌ์์ ๊ฐ ์์์ ์์น์ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ํ์ธํธ: ๋ธ๋ผ์ฐ์ ๋ ๊ณ์ฐ๋ ์คํ์ผ๊ณผ ๋ ์ด์์์ ๋ฐ๋ผ ํ๋ฉด์ ๊ฐ ์์๋ฅผ ๊ทธ๋ฆฝ๋๋ค.
- ํฉ์ฑ: ๋ธ๋ผ์ฐ์ ๋ ํ์ธํธ๋ ๋ ์ด์ด๋ค์ ๊ฒฐํฉํ์ฌ ํ์ํ ์ต์ข ์ด๋ฏธ์ง๋ฅผ ๋ง๋ญ๋๋ค.
์ด๋ฌํ ๊ฐ ๋จ๊ณ๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ฉฐ, ๋ธ๋ผ์ฐ์ ๊ฐ ํ ๋จ๊ณ์์ ๋๋ฌด ๋ง์ ์๊ฐ์ ์๋นํ๋ฉด ํ๋ ์ ์๋๊ฐ ๋จ์ด์ ธ ๋ฒ๋ฒ ๊ฑฐ๋ฆฌ๊ฑฐ๋ ๋ฐ์์ด ์๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ด๋ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ๋ชฉํ๋ ์ด๋น 60ํ๋ ์(FPS)์ ๋ถ๋๋ฌ์ด ํ๋ฉด์ ๋ฌ์ฑํ๊ธฐ ์ํด 16.67๋ฐ๋ฆฌ์ด(ms) ๋ด์ ์ด ๋ชจ๋ ๋จ๊ณ๋ฅผ ์๋ฃํ๋ ๊ฒ์ ๋๋ค.
ํ๋ ์ ์์ฐ ๊ด๋ฆฌ์ ์ค์์ฑ
ํ๋ ์ ์์ฐ ๊ด๋ฆฌ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ฐ ํ๋ ์์ ํ ๋น๋ ์๊ฐ(์ผ๋ฐ์ ์ผ๋ก 16.67ms) ๋ด์ ํ์ํ ๋ชจ๋ ๋ ๋๋ง ์์ ์ ์๋ฃํ ์ ์๋๋ก ๋ณด์ฅํ๋ ๊ดํ์ ๋งํฉ๋๋ค. ๋ ๋๋ง ์์ ์ด ํ๋ ์ ์์ฐ์ ์ด๊ณผํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ํ๋ ์์ ๊ฑด๋๋ธ ์๋ฐ์ ์์ด ์๊ฐ์ ๋๊น ํ์๊ณผ ์ ํ๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๋ฐํฉ๋๋ค. ์ด๋ ํนํ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์ค์ํฉ๋๋ค:
- ๋ณต์กํ UI ์ํธ์์ฉ: ์ ๋๋ฉ์ด์ , ์ ํ, ์ฌ์ฉ์ ์ ๋ ฅ ์ฒ๋ฆฌ๋ ๋น๋ฒํ ๋ฆฌ๋ ๋๋ง์ ์ ๋ฐํ์ฌ ์ ์ฌ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ์ ๊ณผ๋ถํ๋ฅผ ์ค ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์ง์ฝ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ : ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ํ์ํ๊ฑฐ๋ ๋ณต์กํ ๊ณ์ฐ์ ์ํํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ๋ถ๋ด์ ์ค ์ ์์ต๋๋ค.
- ์ ์ฌ์ ์ฅ์น: ๋ชจ๋ฐ์ผ ์ฅ์น ๋ฐ ๊ตฌํ ์ปดํจํฐ๋ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ด ์ ํ๋์ด ์์ด ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ๋ ์ทจ์ฝํฉ๋๋ค.
- ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ: ๋๋ฆฐ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ง์ฐ์์ผ ๋ ๋๋ง ์ง์ฐ๊ณผ ๋ฐ์์ฑ ๋ถ์กฑ์ผ๋ก ์ธ์๋ ์ ์์ต๋๋ค. ์ ์ง๊ตญ๊ณผ ๊ฐ๋ฐ๋์๊ตญ ๊ฐ์ ๋คํธ์ํฌ ์ธํ๋ผ๊ฐ ํฌ๊ฒ ๋ค๋ฅธ ์๋๋ฆฌ์ค๋ฅผ ๊ณ ๋ คํด ๋ณด์ธ์. ๊ฐ์ฅ ๋ฎ์ ๊ณตํต ๋ถ๋ชจ์ ๋ง์ถฐ ์ต์ ํํ๋ฉด ๊ฐ์ฅ ๋์ ์ ๊ทผ์ฑ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
React ๋ ๋๋ง ์ค์ผ์ค๋ง: ๋ฐ์์ฑ์ ํต์ฌ
React๋ ์ฑ๋ฅ์ ์ต์ ํํ๊ณ ๋ฉ์ธ ์ค๋ ๋ ์ฐจ๋จ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ๊ตํ ๋ ๋๋ง ์ค์ผ์ค๋ง ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํฉ๋๋ค. React Fiber๋ก ์๋ ค์ง ์ด ๋ฉ์ปค๋์ฆ์ ํตํด React๋ ๋ ๋๋ง ์์ ์ ๋ ์๊ณ ๊ด๋ฆฌ ๊ฐ๋ฅํ ๋ฉ์ด๋ฆฌ๋ก ๋๋๊ณ ์ค์๋์ ๋ฐ๋ผ ์ฐ์ ์์๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
React Fiber ์๊ฐ
React Fiber๋ React์ ํต์ฌ ์ฌ์กฐ์ (reconciliation) ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํ์ฒด์ ๋๋ค. ์ด๋ ์ ์ง์ ๋ ๋๋ง์ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ด์ ์ฌ์กฐ์ ๊ธฐ์ ์์ ํ ์ฌ์์ฑ ๋ฒ์ ์ ๋๋ค. React Fiber์ ์ฃผ์ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ ์ง์ ๋ ๋๋ง: React๋ ๋ ๋๋ง ์์ ์ ๋ ์์ ๋จ์๋ก ๋๋์ด ์ฌ๋ฌ ํ๋ ์์ ๊ฑธ์ณ ์ํํ ์ ์์ต๋๋ค.
- ์ฐ์ ์์ ์ง์ : React๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ํ ์ค์๋์ ๋ฐ๋ผ ๋ค์ํ ์ ํ์ ์ ๋ฐ์ดํธ์ ์ฐ์ ์์๋ฅผ ๋ถ์ฌํ ์ ์์ต๋๋ค.
- ์ผ์ ์ค์ง ๋ฐ ์ฌ๊ฐ: React๋ ํ๋ ์ ์ค๊ฐ์ ๋ ๋๋ง ์์ ์ ์ผ์ ์ค์งํ๊ณ ๋์ค์ ์ฌ๊ฐํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ค๋ฅธ ์์ ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ํ ์ ์์ต๋๋ค.
- ์ค๋จ: React๋ ์ฌ์ฉ์๊ฐ ํ์ด์ง์์ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ์ ๊ฐ์ด ๋ ์ด์ ํ์ํ์ง ์์ ๋ ๋๋ง ์์ ์ ์ค๋จํ ์ ์์ต๋๋ค.
React Fiber์ ์๋ ๋ฐฉ์
React Fiber๋ "ํ์ด๋ฒ(fiber)"๋ผ๋ ์๋ก์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋์ ํฉ๋๋ค. ๊ฐ ํ์ด๋ฒ๋ ์ปดํฌ๋ํธ์ props๋ฅผ ์ ๋ฐ์ดํธํ๊ฑฐ๋ ์ ์์๋ฅผ ๋ ๋๋งํ๋ ๋ฑ ์ํํด์ผ ํ ์์ ๋จ์๋ฅผ ๋ํ๋ ๋๋ค. React๋ ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ๋ฏธ๋ฌ๋งํ๋ ํ์ด๋ฒ ํธ๋ฆฌ๋ฅผ ์ ์งํฉ๋๋ค. ๋ ๋๋ง ํ๋ก์ธ์ค๋ ์ด ํ์ด๋ฒ ํธ๋ฆฌ๋ฅผ ์ํํ๊ณ ํ์ํ ์ ๋ฐ์ดํธ๋ฅผ ์ํํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
React๋ ์ค์ผ์ค๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ์ ๋ฐ์ดํธ๋ฅผ ์ธ์ ์ด๋ป๊ฒ ์ํํ ์ง ๊ฒฐ์ ํฉ๋๋ค. ์ค์ผ์ค๋ฌ๋ ๊ฒฝํ์ ๋ฐฉ๋ฒ๊ณผ ์ฌ์ฉ์๊ฐ ์ ๊ณตํ ์ฐ์ ์์๋ฅผ ์กฐํฉํ์ฌ ์ด๋ค ์ ๋ฐ์ดํธ๋ฅผ ๋จผ์ ์ฒ๋ฆฌํ ์ง ๊ฒฐ์ ํฉ๋๋ค. ์ด๋ฅผ ํตํด React๋ ์ฌ์ฉ์ ์ ๋ ฅ์ ์๋ตํ๊ฑฐ๋ ๋ณด์ด๋ ์์๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฑ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ฅ ์ค์ํ ์ ๋ฐ์ดํธ์ ์ฐ์ ์์๋ฅผ ๋ถ์ฌํ ์ ์์ต๋๋ค.
RequestAnimationFrame: ๋ธ๋ผ์ฐ์ ์ ๋์ฐ๋ฏธ
React๋ requestAnimationFrame
API๋ฅผ ํ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ํ์ดํ๋ผ์ธ๊ณผ ํ๋ ฅํฉ๋๋ค. requestAnimationFrame
์ ํตํด React๋ ๋ธ๋ผ์ฐ์ ์ ์ ํด ์๊ฐ ๋์ ์ํ๋ ๋ ๋๋ง ์์
์ ์์ฝํ์ฌ ์
๋ฐ์ดํธ๊ฐ ํ๋ฉด ์๋ก๊ณ ์นจ ๋น๋์ ๋๊ธฐํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
requestAnimationFrame
์ ์ฌ์ฉํจ์ผ๋ก์จ React๋ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ๋ ๊ฒ์ ํผํ๊ณ ๋ฒ๋ฒ
๊ฑฐ๋ฆฌ๋ ์ ๋๋ฉ์ด์
์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๋ requestAnimationFrame
์ ์ ๋ฌ๋ ์ฝ๋ฐฑ์ด ๋ค์ ๋ฆฌํ์ธํธ ์ ์ ์คํ๋ ๊ฒ์ ๋ณด์ฅํ๋ฏ๋ก React๊ฐ ์
๋ฐ์ดํธ๋ฅผ ๋ถ๋๋ฝ๊ณ ํจ์จ์ ์ผ๋ก ์ํํ ์ ์์ต๋๋ค.
React ๋ ๋๋ง ์ค์ผ์ค๋ง ์ต์ ํ ๊ธฐ์
React์ ๋ ๋๋ง ์ค์ผ์ค๋ง ๋ฉ์ปค๋์ฆ์ ๊ฐ๋ ฅํ์ง๋ง, ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํด ์ด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ค์์ ํ๋ ์ ์์ฐ์ ๊ด๋ฆฌํ๊ณ React ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์์ฑ์ ํฅ์์ํค๊ธฐ ์ํ ๋ช ๊ฐ์ง ์ค์ฉ์ ์ธ ๊ธฐ์ ์ ๋๋ค:
1. ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง ์ต์ํ
React ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ๊ฐ์ฅ ํํ ์์ธ ์ค ํ๋๋ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋๋ค. ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ ๋๋ง๋ค React๋ ๊ฐ์ DOM์ ์ค์ DOM๊ณผ ๋น๊ต(reconcile)ํด์ผ ํ๋ฉฐ, ์ด๋ ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ผ ์ ์์ต๋๋ค.
๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ์ต์ํํ๋ ค๋ฉด ๋ค์ ์ ๋ต์ ๊ณ ๋ คํ์ญ์์ค:
React.memo
์ฌ์ฉ: ํจ์ํ ์ปดํฌ๋ํธ๋ฅผReact.memo
๋ก ๊ฐ์ธ ๋ ๋๋ง๋ ์ถ๋ ฅ์ ๋ฉ๋ชจ์ด์ ์ด์ ํฉ๋๋ค.React.memo
๋ props๊ฐ ๋ณ๊ฒฝ๋์ง ์์๋ค๋ฉด(๊ธฐ๋ณธ์ ์ผ๋ก ์์ ๋น๊ต ์ฌ์ฉ) ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.shouldComponentUpdate
๊ตฌํ (ํด๋์ค ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ): ํด๋์ค ์ปดํฌ๋ํธ์์๋shouldComponentUpdate
์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ๊ตฌํํ์ฌ prop ๋ฐ state ๋ณ๊ฒฝ์ ๋ฐ๋ผ ์กฐ๊ฑด๋ถ๋ก ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํฉ๋๋ค.- ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ฌ์ฉ: ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์์ ํ๋ ๋์ ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ฅผ ํตํด React๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ฝ๊ฒ ๊ฐ์งํ๊ณ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ํผํ ์ ์์ต๋๋ค. Immutable.js๋ Immer์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ JavaScript์์ ๋ถ๋ณ ๋ฐ์ดํฐ ์์ ์ ๋์์ค๋๋ค.
- ๋ ๋๋ง ์ ์ธ๋ผ์ธ ํจ์ ์ฌ์ฉ ํผํ๊ธฐ: ๋ ๋๋ง ๋ฉ์๋ ๋ด์์ ์ ํจ์๋ฅผ ์์ฑํ๋ฉด ๋งค ๋ ๋๋ง๋ง๋ค ํจ์ ์ธ์คํด์ค๊ฐ ๋ณ๊ฒฝ๋๋ฏ๋ก ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
useCallback
์ ์ฌ์ฉํ์ฌ ํจ์ ์ธ์คํด์ค๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ์ธ์. - Context Provider ์ต์ ํ: Context Provider์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ์ด๋ฅผ ์๋นํ๋ ๋ชจ๋ ์ปดํฌ๋ํธ์ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ถํ์ํ ์ ๋ฐ์ดํธ๋ฅผ ํผํ๊ธฐ ์ํด Context Provider๋ฅผ ์ ์คํ๊ฒ ์ค๊ณํ์ธ์. ํฐ ์ปจํ ์คํธ๋ฅผ ๋ ์๊ณ ๊ตฌ์ฒด์ ์ธ ์ปจํ ์คํธ๋ก ๋๋๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์.
์์: React.memo ์ฌ์ฉ
import React from 'react';
const MyComponent = React.memo(function MyComponent(props) {
return (
<div>
<p>{props.name}</p>
</div>
);
});
export default MyComponent;
2. ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋๋ฐ์ด์ฑ ๋ฐ ์ค๋กํ๋ง
์คํฌ๋กค ์ด๋ฒคํธ๋ ์ ๋ ฅ ๋ณ๊ฒฝ๊ณผ ๊ฐ์ด ๋น ๋ฅด๊ฒ ๋ฐ์ํ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ๋น๋ฒํ ๋ฆฌ๋ ๋๋ง์ ์ ๋ฐํ์ฌ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค. ๋๋ฐ์ด์ฑ๊ณผ ์ค๋กํ๋ง์ ์ด๋ฌํ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์คํ ๋น๋๋ฅผ ์ ํํ๋ ๊ธฐ์ ์ ๋๋ค.
- ๋๋ฐ์ด์ฑ: ๋๋ฐ์ด์ฑ์ ํจ์๊ฐ ๋ง์ง๋ง์ผ๋ก ํธ์ถ๋ ํ ์ผ์ ์๊ฐ์ด ์ง๋ ๋๊น์ง ์คํ์ ์ง์ฐ์ํต๋๋ค. ์ด๋ ์ฌ์ฉ์๊ฐ ๊ฒ์์ฐฝ์ ์ ๋ ฅ์ ๋ง์น๋ ๊ฒฝ์ฐ์ ๊ฐ์ด ์ผ๋ จ์ ์ด๋ฒคํธ๊ฐ ๋ฉ์ถ ํ ํจ์๋ฅผ ํ ๋ฒ๋ง ์คํํด์ผ ํ ๋ ์ ์ฉํฉ๋๋ค.
- ์ค๋กํ๋ง: ์ค๋กํ๋ง์ ํจ์๊ฐ ์คํ๋ ์ ์๋ ๋น๋๋ฅผ ์ ํํฉ๋๋ค. ์ด๋ ์คํฌ๋กค ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ๋์ ๊ฐ์ด ์ผ์ ํ ๊ฐ๊ฒฉ์ผ๋ก ํจ์๋ฅผ ์คํํด์ผ ํ ๋ ์ ์ฉํฉ๋๋ค.
Lodash๋ Underscore์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋๋ฐ์ด์ฑํ๊ณ ์ค๋กํ๋งํ๊ธฐ ์ํ ์ ํธ๋ฆฌํฐ ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
์์: ์ ๋ ฅ ํธ๋ค๋ฌ ๋๋ฐ์ด์ฑ
import React, { useState, useCallback } from 'react';
import debounce from 'lodash.debounce';
function MyComponent() {
const [searchTerm, setSearchTerm] = useState('');
const handleInputChange = useCallback(debounce((event) => {
setSearchTerm(event.target.value);
// Perform search based on searchTerm
console.log('Searching for:', event.target.value);
}, 300), []);
return (
<input type="text" onChange={handleInputChange} />
);
}
export default MyComponent;
3. ๊ธด ๋ชฉ๋ก ๊ฐ์ํ
๊ธด ํญ๋ชฉ ๋ชฉ๋ก์ ๋ ๋๋งํ๋ ๊ฒ์ ํนํ ๋ชจ๋ฐ์ผ ์ฅ์น์์ ์ฌ๊ฐํ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ด ๋ ์ ์์ต๋๋ค. ๊ฐ์ํ๋ ํ์ฌ ํ๋ฉด์ ๋ณด์ด๋ ํญ๋ชฉ๋ง ๋ ๋๋งํ๊ณ ์ฌ์ฉ์๊ฐ ์คํฌ๋กคํ ๋ DOM ๋ ธ๋๋ฅผ ์ฌํ์ฉํ๋ ๊ธฐ์ ์ ๋๋ค. ์ด๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ํํด์ผ ํ ์์ ์ ์์ ๊ทน์ ์ผ๋ก ์ค์ฌ ์คํฌ๋กค ์ฑ๋ฅ์ ํฅ์์ํค๊ณ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ผ ์ ์์ต๋๋ค.
react-window
๋ react-virtualized
์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ React์์ ๊ธด ๋ชฉ๋ก์ ๊ฐ์ํํ๊ธฐ ์ํ ์ปดํฌ๋ํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์์: react-window ์ฌ์ฉ
import React from 'react';
import { FixedSizeList } from 'react-window';
const Row = ({ index, style }) => (
<div style={style}>
Row {index}
</div>
);
function MyComponent() {
return (
<FixedSizeList
height={400}
width={300}
itemSize={35}
itemCount={1000}
>
{Row}
</FixedSizeList>
);
}
export default MyComponent;
4. ์ฝ๋ ๋ถํ ๋ฐ ์ง์ฐ ๋ก๋ฉ
์ฝ๋ ๋ถํ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์์ ๋ฐ๋ผ ๋ก๋ํ ์ ์๋ ๋ ์์ ๋ฒ๋ค๋ก ๋๋๋ ๊ธฐ์ ์ ๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๊ธฐ ๋ก๋ ์๊ฐ์ ์ค์ด๊ณ ์ฒด๊ฐ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์ง์ฐ ๋ก๋ฉ์ ํ์ํ ๋๋ง ์ปดํฌ๋ํธ๋ฅผ ๋ก๋ํ๋ ํน์ ์ ํ์ ์ฝ๋ ๋ถํ ์
๋๋ค. ์ด๋ React์ React.lazy
์ Suspense
์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
์์: ์ปดํฌ๋ํธ ์ง์ฐ ๋ก๋ฉ
import React, { Suspense } from 'react';
const MyComponent = React.lazy(() => import('./MyComponent'));
function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<MyComponent />
</Suspense>
);
}
export default App;
5. ์ด๋ฏธ์ง ๋ฐ ๊ธฐํ ์์ฐ ์ต์ ํ
ํฐ ์ด๋ฏธ์ง ๋ฐ ๊ธฐํ ์์ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ก๋ ์๊ฐ๊ณผ ๋ ๋๋ง ์ฑ๋ฅ์ ์๋นํ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ๋ค์์ ํตํด ์ด๋ฏธ์ง๋ฅผ ์ต์ ํํ์ธ์:
- ์ด๋ฏธ์ง ์์ถ: ์ด๋ฏธ์ง ์์ถ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ง ์ ํ ์์ด ์ด๋ฏธ์ง ํ์ผ ํฌ๊ธฐ๋ฅผ ์ค์ ๋๋ค.
- ์ ์ ํ ์ด๋ฏธ์ง ํ์ ์ฌ์ฉ: ๊ฐ ์ด๋ฏธ์ง์ ์ ํฉํ ์ด๋ฏธ์ง ํ์์ ์ ํํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ง์๋ JPEG๋ฅผ, ํฌ๋ช ๋๊ฐ ์๋ ๊ทธ๋ํฝ์๋ PNG๋ฅผ ์ฌ์ฉํฉ๋๋ค. WebP ํ์์ JPEG ๋ฐ PNG์ ๋นํด ์ฐ์ํ ์์ถ๋ฅ ๊ณผ ํ์ง์ ์ ๊ณตํ๋ฉฐ ๋๋ถ๋ถ์ ์ต์ ๋ธ๋ผ์ฐ์ ์์ ์ง์๋ฉ๋๋ค.
- ๋ฐ์ํ ์ด๋ฏธ์ง ์ฌ์ฉ: ์ฌ์ฉ์์ ํ๋ฉด ํฌ๊ธฐ ๋ฐ ์ฅ์น ํฝ์
๋น์จ์ ๋ฐ๋ผ ๋ค๋ฅธ ํฌ๊ธฐ์ ์ด๋ฏธ์ง๋ฅผ ์ ๊ณตํฉ๋๋ค. <picture> ์์์ <img> ์์์
srcset
์์ฑ์ ์ฌ์ฉํ์ฌ ๋ฐ์ํ ์ด๋ฏธ์ง๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. - ์ด๋ฏธ์ง ์ง์ฐ ๋ก๋ฉ: ํ๋ฉด์ ๋ณด์ผ ๋๋ง ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํฉ๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๊ธฐ ๋ก๋ ์๊ฐ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
6. ๋ฌด๊ฑฐ์ด ๊ณ์ฐ์ ์ํ ์น ์์ปค
์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ณต์กํ ๊ณ์ฐ์ด๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๊ฐ์ ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์ ์ํํ๋ ๊ฒฝ์ฐ, ์ด๋ฌํ ์์ ์ ์น ์์ปค(Web Worker)๋ก ์คํ๋ก๋ํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์. ์น ์์ปค๋ ๋ฉ์ธ ์ค๋ ๋์ ๋ณ๋์ ์ค๋ ๋์์ ์คํ๋๋ฏ๋ก UI๋ฅผ ์ฐจ๋จํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ๋ฐ์์ฑ์ ํฅ์์ํต๋๋ค. Comlink์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฉ์ธ ์ค๋ ๋์ ์น ์์ปค ๊ฐ์ ํต์ ์ ๋จ์ํํ ์ ์์ต๋๋ค.
7. ํ๋กํ์ผ๋ง ๋ฐ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง
ํ๋กํ์ผ๋ง๊ณผ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง์ React ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ํด๊ฒฐํ๋ ๋ฐ ํ์์ ์ ๋๋ค. React Profiler(React ๊ฐ๋ฐ์ ๋๊ตฌ์์ ์ฌ์ฉ ๊ฐ๋ฅ)๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ์ ์ฑ๋ฅ์ ์ธก์ ํ๊ณ ์ต์ ํํ ์์ญ์ ์๋ณํ์ธ์. ์ค์ ์ฌ์ฉ์ ๋ชจ๋ํฐ๋ง(RUM) ๋๊ตฌ๋ ์ค์ ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ๋ํ ๊ท์คํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ ํ์ด์ง ๋ก๋ ์๊ฐ, ์ฒซ ๋ฐ์ดํธ๊น์ง์ ์๊ฐ(TTFB), ์ค๋ฅ์จ๊ณผ ๊ฐ์ ์งํ๋ฅผ ์บก์ฒํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ํ ํฌ๊ด์ ์ธ ์๊ฐ์ ์ ๊ณตํฉ๋๋ค.
React ๋์์ฑ ๋ชจ๋: ๋ ๋๋ง ์ค์ผ์ค๋ง์ ๋ฏธ๋
React ๋์์ฑ ๋ชจ๋(Concurrent Mode)๋ ๋ฐ์์ฑ ์๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ React ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ์๋ก์ด ๊ฐ๋ฅ์ฑ์ ์ด์ด์ฃผ๋ ์คํ์ ์ธ ๊ธฐ๋ฅ ์ธํธ์ ๋๋ค. ๋์์ฑ ๋ชจ๋๋ฅผ ์ฌ์ฉํ๋ฉด React๊ฐ ๋ ๋๋ง ์์ ์ ์ค๋จ, ์ผ์ ์ค์ง ๋ฐ ์ฌ๊ฐํ ์ ์์ด ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ๋ํ ๋ ์ธ๋ถํ๋ ์ ์ด๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
๋์์ฑ ๋ชจ๋์ ์ฃผ์ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ํ Suspense: Suspense๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋ ๋ก๋ฉ ์ํ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ์ธ์ ์ผ๋ก ์ง์ ํ ์ ์์ต๋๋ค. React๋ ๋ฐ์ดํฐ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํด์ง ๋๊น์ง ๋ ๋๋ง์ ์๋์ผ๋ก ์ค๋จํ์ฌ ๋ ๋ถ๋๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
- Transitions: Transitions๋ฅผ ์ฌ์ฉํ๋ฉด ํน์ ์ ๋ฐ์ดํธ๋ฅผ ๋ฎ์ ์ฐ์ ์์๋ก ํ์ํ์ฌ React๊ฐ ์ฌ์ฉ์ ์ ๋ ฅ๊ณผ ๊ฐ์ ๋ ์ค์ํ ์ ๋ฐ์ดํธ์ ์ฐ์ ์์๋ฅผ ๋ถ์ฌํ ์ ์์ต๋๋ค. ์ด๋ ๋ฒ๋ฒ ๊ฑฐ๋ฆฌ๋ ์ ๋๋ฉ์ด์ ์ ๋ฐฉ์งํ๊ณ ๋ฐ์์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ์ ํ์ ํ์ด๋๋ ์ด์ : ์ ํ์ ํ์ด๋๋ ์ด์ ์ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์ด๋ ๋ถ๋ถ๋ง ํ์ด๋๋ ์ด์ ํ์ฌ ์ด๊ธฐ ๋ก๋ ์๊ฐ๊ณผ ์ํธ์์ฉ ๊ฐ๋ฅ ์๊ฐ(TTI)์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
๋์์ฑ ๋ชจ๋๋ ์์ง ์คํ ๋จ๊ณ์ด์ง๋ง, React ๋ ๋๋ง ์ค์ผ์ค๋ง์ ๋ฏธ๋๋ฅผ ๋ํํ๋ฉฐ ๊ณ ์ฑ๋ฅ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ์ ์ํ ํฅ๋ฏธ๋ก์ด ๊ฐ๋ฅ์ฑ์ ์ ๊ณตํฉ๋๋ค.
๊ฒฐ๋ก
React ๋ ๋๋ง ์ค์ผ์ค๋ง๊ณผ ํ๋ ์ ์์ฐ ๊ด๋ฆฌ๋ฅผ ๋ง์คํฐํ๋ ๊ฒ์ ํ๋ฅญํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ณ ์ฑ๋ฅ์ ๋ฐ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ์ดํดํ๊ณ , React์ ๋ ๋๋ง ์ค์ผ์ค๋ง ๋ฉ์ปค๋์ฆ์ ํ์ฉํ๋ฉฐ, ์ด ๊ฐ์ด๋์์ ์ค๋ช ํ ์ต์ ํ ๊ธฐ์ ์ ์ ์ฉํจ์ผ๋ก์จ, ์ ์ฌ์ ์ฅ์น๋ ์ด์ ํ ๋คํธ์ํฌ ์กฐ๊ฑด์์๋ ๋น ๋ฅด๊ณ ๋ฐ์์ฑ์ด ์ข์ React ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค. ์ฑ๋ฅ ์ต์ ํ๋ ์ง์์ ์ธ ๊ณผ์ ์์ ๊ธฐ์ตํ์ธ์. ์ ๊ธฐ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋กํ์ผ๋งํ๊ณ , ์ค์ ํ๊ฒฝ์์์ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ๋ฉฐ, ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์ผ๊ด๋๊ฒ ์ฐ์ํ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํ๊ธฐ ์ํด ํ์์ ๋ฐ๋ผ ์ ๋ต์ ์กฐ์ ํ์ธ์.
์ง์์ ์ผ๋ก ์ฑ๋ฅ ์งํ๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ ์ฌ์ฉ์์ ์์น๋ ์ฅ์น์ ๊ด๊ณ์์ด ํน์ ์๊ตฌ์ ๋ง๊ฒ ์ ๊ทผ ๋ฐฉ์์ ์กฐ์ ํ๋ ๊ฒ์ด ์ฅ๊ธฐ์ ์ธ ์ฑ๊ณต์ ์ด์ ์ ๋๋ค. ๊ธ๋ก๋ฒ ๊ด์ ์ ์์ฉํ๋ฉด ์ฌ๋ฌ๋ถ์ React ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ํ ๋์งํธ ํ๊ฒฝ์์ ๋ฒ์ฐฝํ ๊ฒ์ ๋๋ค.