์ทจ์ค ์คํฐ๋ JobScript์ ์ฒซ๋ฒ์งธ ๋ฉด์ ์คํฐ๋์์ ์ ๋ฆฌํ ์ง๋ฌธ์ ๋๋ค.
ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ์ ์ฅ์์ CS์ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ์ ์ฉํ๋ค๋ฉด ๋ฌด์จ ์ง๋ฌธ์ด ๋์ฌ๊น ๊ณ ๋ฏผํ๋ฉฐ ์ง๋ฌธ์ ์ ์ ํ์์ต๋๋ค.
๋ฌดํ ์คํฌ๋กค์์ ์ ์ฉํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ฌด์์ธ๊ฐ์?

โ ๋ต๋ณ
๊ฐ์ ์คํฌ๋กค + ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ก ํ๋ฉด์ ๋ณด์ด๋ ์๋์ฐ(start~end) + ์๋ค ๋ฒํผ๋ง ๋ ๋๋งํฉ๋๋ค.
์ด์ ์๋ DOM Element๋ฅผ DOM์ ๊ณ์ append ํ๋ค๋ณด๋, ๋ ธ๋๊ฐ ๊ธฐํ๊ธ์์ ์ผ๋ก ๋์ด๋ Layout/Paint/Composite๊ฐ ๊ณผ๋ํด์ ธ ์ฑ๋ฅ์ด ๊ธ๊ฐํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ๊ฐ์ ์คํฌ๋กค๊ณผ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๋ฐฉ์์ ํตํด ๋ทฐํฌํธ์ ๋ณด์ด๋ ์์ดํ ๋ง dom์ ์ถ๊ฐ(๊ฐ์ ์คํฌ๋กค๋ง)ํฉ๋๋ค.
์คํฌ๋กค ์์๋ requestAnimationFrame(rAF)๋ก ์คํฌ๋กค ์ด๋ฒคํธ๋ฅผ ๋ฌถ์ด ํ๋ ์๋น 1ํ๋ง ์๋์ฐ ๊ณ์ฐ์ ์ํํ๊ณ (= rAF ๋ฐฐ์น), ์ด ๋์ด·topOffset·๋ณด์ด๋ ์์ดํ ์ ๊ฐ์ ๊ฐ์ ๊ฐ์ ์บ์ฑ์ ํตํด ์ฌ์ฌ์ฉํฉ๋๋ค. ์ด๋ ์์ดํ ์ id๋ฅผ key ๊ฐ์ผ๋ก ์ค์ ํด ๊ฒน์น๋ ์์ดํ ์ ์ฌ๋ ๋๋งํ์ง ์๊ณ dom์์ ์ฌํ์ฉํ ์ ์์ต๋๋ค.
ํ๋ฉด์ ๋ณด์ด์ง ์๋ ๊ตฌ๊ฐ์ ์คํ์ด์(๊ฐ์ง ๊ณต๊ฐ)๋ฅผ ๋์ด, ์์ดํ ์ด ์๋ ๊ฐ์ง ๊ณต๊ฐ๋ง ํ ๋นํ์ฌ ์คํฌ๋กค ๊ธธ์ด๋ ์ ์งํ ์ ์๋๋ก ํฉ๋๋ค.
์ด๋ฅผ ํตํด DOM ๊ด๋ฆฌ ๋น์ฉ์ด ์ ์ฒด n → ์์ k(๋ทฐํฌํธ+๋ฒํผ)๋ก ์ถ์๋ฉ๋๋ค.
โ requestionAnimationFrame (rAF)
์ด๋ฒคํธ๋ฅผ ํ๋ ์๋น ๋ฌถ์ด์ 1ํ๋ง ์งํํ์ฌ ๊ณผ๋ํ ๋ ๋๋ง ์ฐ์ฐ์ ์ค์, ํ๋ ์ ๋ ๋๋ง ์ง์ ์ ์ํํจ์ผ๋ก์จ ํ๋ฉด ๋๊ธฐํ ์์ ์ด ๋ง์ ํ๋ฉด ์ ํ์ด ๋งค๋๋ฝ๋ค.
โ vs setTimeOut/์ฐ๋กํ
> setTimeOut : ์๊ฐ ๊ฐ๊ฒฉ ๊ธฐ์ค
> ํ์ธํธ ํ์ด๋ฐ๊ณผ ์ด๊ธ๋ ์ ์์ด ๊ฒฐ๊ตญ์ค๋ณต ๊ณ์ฐ์ด ๊ฐ๋ฅ์ฑ ์กด์ฌ, ๋ ๋๋ง์ ๊ฒฝ์ฐ๋ rAF๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์
๋คํธ์ํฌ ํธ์ถ ๋น๋ ๋ฑ ๋น ๋ ๋ ์์ → ์ค๋กํ/๋๋ฐ์ด์ค
๋ ์ด์์/๋ ๋ ๊ฐฑ์ → raF
1. ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๊ฐ ๋ฌด์์ธ์ง?
์ง๊ธ ๋ณด์ด๋ ๊ตฌ๊ฐ๋ง ์ ์งํ๊ณ , ์คํฌ๋กค์ ๋ง์ถฐ ๊ทธ ๊ตฌ๊ฐ(์๋์ฐ)์ ๋ฏธ๋๋ฌ์ง๋ฏ ์ด๋์ํค๋ ๋ฐฉ์
- ์คํฌ๋กค ์์ scollTop์ผ๋ก start/end ์ธ๋ฑ์ค๋ฅผ ๊ณ์ฐ
- ๋ฐ๋ ๊ฒฝ์ฐ๋ง dom์ ํจ์น
- ์์ดํ ๊ฐ๊ฐ ์์ง์ด์ง ๋ง๊ณ ์ปจํ ์ด๋์ topOffset๋ง ์ ๋ฐ์ดํธ(= ์ปจํ ์ด๋ ์ด๋ ํจํด)
- ์ด ๋ชจ๋ ๊ณ์ฐ์ rAF ๋ฐฐ์น๋ก ํ๋ ์๋น 1ํ ์ํ, ์ด ๋์ด/offset์ ์บ์๋ก ์ฆ์ ์ฌ์ฉ
โ ์ถ๊ฐ ์ค๋ช
: ์ค์ ์ด๋์ ๋ชจ๋ ๊ฐ๋ณ ์์ดํ ๋ค์ ์ด๋์ํค๋ ๊ฒ์ด ์๋๋ผ ์์ดํ ๋ค์ ํ๋์ ๋ฐ์นจ์ ์ฌ๋ ค์ ๊ทธ ๋ฐ์นจ ํ๋๋ง translate(topOffset)๋ก ๋ด๋ฆฐ๋ค.
1๏ธโฃ๋ง์ฝ ์์ดํ ์ ๋์ด๊ฐ ๊ณ ์ ๋์ด ์๋ค๋ฉด,
startIndex๊ฐ ์ง๋์ณ์จ ์์ดํ ์ ๊ฐ์๋ผ๊ณ ํ์ ๋,
: topOffset = startIndex * ์์ดํ ์ ๋์ด
2๏ธโฃ์์ดํ ์ด ๊ฐ๋ณ ๋์ด๋ผ๋ฉด?
: topOffeset : ๊ทธ๋์ ์ง๋๊ฐ ์์ดํ ๋ค์ ๋์ด๋ฅผ ๋ชจ๋ ๋ํ ๋์ ํฉ
2. ๊ทธ๋ฌ๋ฉด ๋ฐฉ๊ธ ๋ณธ ์์ดํ ๋ ์คํฌ๋กค ํ ๋๋ง๋ค ๋ฐ์ดํฐ ํจ์นญ์ ํด์ผ ํ๋๋ฐ ์ค์ด๊ธฐ ์ํ ๋ฐฉ๋ฒ์?
์๋ฐฉํฅ ์ปค์๋ฅผ ๋์ด ํ๋จ ์๋จ sentinel์ด ๋ณด์ผ ๋๋ง after/before ์ปค์๋ก ์์ฒญํ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ ์ต๊ทผ ์ฐฝ๋ง ์ ์งํฉ๋๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ์๋ ์ต๊ทผ ์ฐฝ๋ง ์ ์งํ๊ณ Lateset Recently Used๋ก ๋น์ฐ๊ณ ํ์์ ์ฌ ์์ฒญํฉ๋๋ค.
์๋จ์ ๊ณผ๊ฑฐ ํ์ด์ง๋ฅผ ๋ถ์ผ ๋๋ ์ต์ปค ์์ดํ ์ ๊ธฐ์ค์ผ๋ก scrollTop์ ๋ณด์ ํด ์ฌ์ฉ์๊ฐ ๋ณด๋ ์์น๋ฅผ ๊ทธ๋๋ก ์ ์งํ์ฌ ์ ํ๋ฅผ ๋ฐฉ์ง
โ sentinel
: ๋ฌดํ ์คํฌ๋กค์ด๋ ๊ฐ์ ์คํฌ๋กค๋ง ๊ตฌํ์์ ์ฌ์ฉ๋๋ ๊ฐ์ ์์, ์ฃผ๋ก ์๋จ๊ณผ ํ๋จ์ ํ์์ผ๋ก ๋ฐฐ์น๋์ด ์ฌ์ฉ์์ ์คํฌ๋กค ๋์์ ๊ฐ์ง
์ด๋, ์๋จ sentinel์ ๊ณผ๊ฑฐ ๋ฐ์ดํฐ ๋ก๋ฉ, ํ๋จ sentinel์ ๋ฏธ๋ ๋ฐ์ดํฐ ๋ก๋ฉ ๋ด๋น
์๋จ sentinel์ ํนํ ๋ค์ ์๋ก ์คํฌ๋กค ํ ๋ ์๋จ์ ์์ดํ ์ด ์ถ๊ฐ๋๋ฉด ๊ธฐ์กด ์ฝํ ์ธ ๊ฐ ์๋๋ก ๋ฐ๋ ค๋๊ฒ ๋๋๋ฐ, ์ด๋ ์ต์ปค ์์ดํ ์ ๊ธฐ์ค์ผ๋ก scrollTop์ ๋ด๋ ค๊ฐ ๋งํผ ์ญ์กฐ์ ํ์ฌ ํ๊ธฐ๋ ํ์์ ์ต์ํ
์ฃผ๋ก Intersection Observer์ ํจ๊ป ์ฌ์ฉ๋์ด ๋น๋๊ธฐ์ ์ผ๋ก ์์์ ๊ฐ์์ฑ ๋ณํ๋ฅผ ๊ฐ์งํ์ฌ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ๋ธ๋กํนํ์ง ์๋๋ค.
sentinel์ด ๊ฒฝ๊ณ์ ์ญํ ์ ํ๋ฉด์ ์ ์ ํ ํ์ด๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ฑฐ๋ ํด์ ํจ์ผ๋ก์จ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ท ํ์ ๋ง์ถ๋ค.
3. ์ถ๊ฐ ์ต์ ํ ๋ฐฉ๋ฒ์ด ์์๊น?
๋ค ํ๋ฉด์ ๋ณด์ด๋ ์์ดํ ์ ๋ ๋๋งํ ๋ ์ด์ ๋ทฐํํธ์ ์๋ ์์ดํ ์ ๋ฆฌ๋ ๋๋งํ์ง ์๊ณ DOM ์์ ์ฌํ์ฉ
์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์ ๋ณ๊ฒฝ๋๋ ๋ถ๋ถ๋ง ํจ์นํ๋ ์ ๋ต์ ์ธ์ธ ์ ์๋ค.
- ์์ดํ key๋ index๊ฐ ์๋ Id๋ก ๊ณ ์ ํ์ฌ ๊ฒน์น๋ ๊ตฌ๊ฐ์ DOM์ ์ฌ์ฌ์ฉ
- ์ปดํฌ๋ํธ๋ฅผ ๋ฉ๋ชจํ๋ React.memo์ ์์ ํ๋ props๋ก ๊ฒน์น๋ ์ปดํฌ๋ํธ๋ ๋ฆฌ๋ ๋๋ฅผ ์ฐจ๋จ
์๋์ฐ diff ๋ก ๋ฐฐ์ด ์ ์ฒด๊ฐ ์๋ ์ด์ ๋ค์ ๋ฒ์๋ฅผ ๋น๊ตํด์ ๋ณ๊ฒฝ ๋ถ๋ถ๋ง ํจ์นํ๋ค
โ ์ Index ๊ฐ ์๋ Id๋ก ์งํํ๋?
: Index๋ก ์งํํ๋ฉด ์๋ก ์คํฌ๋กค ์ด๋ ์ ์ค๊ฐ์ ์์ดํ ์ด ์ถ๊ฐ๋์ด index๊ฐ +1 ์ฉ ๋ค๋ก ๋ฐ๋ฆฐ๋ค.
โ ์์ ํ๋ props?
: React.memo๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ฉ๋ชจํด๋ style ์ด๋ ํจ์ ๋ฑ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ props๋ก ๋๊ธฐ๋ฉด ์ํ๊ฐ ๋ฐ๋์๋ค๊ณ ํ๋จ
์ฆ, React.memo๊ฐ ์ ์ฉ๋์ง ์๊ณ ํธ์ถ์๋ง๋ค ๋ฆฌ๋ ๋๋ง
๊ฐ์ฒด๋ฅผ props๋ก ๋๊ฒจ์ผ ํ๋ค๋ฉด cache๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํ์ฌ ์ ๋ฌ
4. ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ฅผ ์ ์ฉํ์ ๋ ๊ฐ๋ณ๋์ด ์์ดํ ๋ค์ด ์์ฌ์์ผ๋ฉด ๋ฌด์จ ๋ฌธ์ ๊ฐ ๋ฐ์? ํด๊ฒฐ์ฑ ์?
์ด๋ฏธ์ง๊ฐ ๋ฆ๊ฒ ๋ก๋ฉ๋๋ ๊ฒฝ์ฐ ๋์ด๊ฐ ๋ณํด์ ์์ดํ ๋ค์ด ์๋๋ก ๋ฐ๋ ค๋ด๋ ค๊ฐ๋ ์คํฌ๋กค์ด ํ๋ ํ์์ด ๋ฐ์
ResizeObserver๋ฅผ ํตํด ์์ดํ ์ ๋์ด ๋ณํ๊ฐ ๊ฐ์ง๋๋ฉด ์์ดํ ์ ๋์ด ๋์ ํฉ์์ ๋ถ๋ถ์ ์ผ๋ก ๊ฐฑ์ ํ๊ณ , ํ๋ฉด ์ต์๋จ์ ์ต์ปค์์ดํ ์ ๊ธฐ์ค์ผ๋ก scrollTop์ ์๋๋ก ๋ด๋ ค๊ฐ ๋งํผ ์ญ์ผ๋ก ์ฌ์กฐ์
๋, ์ด๋ฏธ์ง์ ๊ฒฝ์ฐ placeholder ๋์ด๋ฅผ ๋ฏธ๋ฆฌ ๋์ด ์ ํ ํ์ ์ต์ํ
5. ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๋ฐฉ์์ผ๋ก ์ ์ฉํ๋ฉด ๋จ์ ์?
๊ฒ์ ์ ๊ทผ์ฑ, ๊ฐ๋ณ ๋์ด ์ ํ, ๊ธฐ์กด ์ํ๊ฐ ๋ค ์ฌ๋ผ์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์
1. ๊ฒ์ ์ ๊ทผ์ฑ
: DOM์ ์๋ ํญ๋ชฉ์ ๋ธ๋ผ์ฐ์ ๋ฆฌ๋๊ฐ ๋ณด์ง ๋ชปํด ๊ฒ์์ ํ ์ ์๋ค
→ ๋ด์ฅ ๊ฒ์์ฐฝ์ ํตํด ๋ฐ์ดํฐ ์์ ์์น๋ก ๋งคํํด ๊ทธ ์์น๋ก ์คํฌ๋กค์ ์ด๋์ํค๋ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐ
2. ๊ฐ๋ณ ๋์ด ์ ํ
: ์ด๋ฏธ์ง๊ฐ ๋ฆ๊ฒ ๋ก๋๋์ด ๋์ด๊ฐ ๋์ค์ ์ปค์ง๋ฉด ์คํฌ๋กค์ด ๊ฐ์๊ธฐ ์๋๋ก ํ๋ ํ์์ด ๋ฐ์
→ ๋ทฐํฌํธ ์ต์๋จ์ ๋ณด์ด๋ ์ต์ปค ์์ดํ ์ ๊ธฐ์ค์ผ๋ก ์ผ๊ณ , ๋ณ๊ฒฝ ์ ์์น ์ฐจ์ด๋งํผ scrollTop ์ ๋ฐ๋๋ก ์กฐ์ ํ๊ฑฐ๋ placeholder๋ก ๋ฏธ๋ฆฌ ์ด๋ฏธ์ง ๋์ด๋ฅผ ์์ฝ
3. ๊ธฐ์กด ์ํ๊ฐ ๋ค ์ฌ๋ผ์ง๋ ํ์
: ๋๊ธ์ ์์ฑํ๋ค๊ฐ ์๋ก ์ฌ๋ ธ์ ๋ ์์ฑํ๊ณ ์๋ ๋๊ธ์ฐฝ์ด DOM์์ ์ฌ๋ผ์ง๋ฉด์ ๊ธฐ์กด์ ์์ฑํ๋ ๋๊ธ์ด ์ฌ๋ผ์ง๋ ๋ฌธ์
→ ์ ๋ ฅ์ด๋ ํฌ์ปค์ค ์ํ๋ ์ธ๋ถ ์คํ ์ด์ map ํํ๋ก ์์ดํ ID ์ ์ํ๋ฅผ ์ ์ฅํ๊ณ ํ๋ฉด์ ๋ณด์ผ ๋ ์ํ ๋ณต์