ํฐ์คํ ๋ฆฌ ๋ทฐ
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์ ํ๊ฒฝ(setTimeout, Promise then, RequestAnimationFrame)
choi95 2021. 3. 11. 14:13
๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ ์ฌ๊ท ํธ์ถ ๊ธฐ๋ฅ์ ์ํํ๋ ๋ ์ฝ๋๊ฐ ์๋ค. ํ์ง๋ง ์ ๋ ์ฝ๋์ ์คํ ๊ฒฐ๊ณผ๋ ๋ค๋ฅด๋ค.
setTimeout()์ผ๋ก ์ฌ๊ท ํธ์ถํ ๊ฒฐ๊ณผ css์ ์ ์ฉ ํ button:hover์ ์์๊ฐ์ด ๋ง์ฐ์ค ์ปค์๋ฅผ ๋์ ๋ ์ ํด์ ๋๋ ๋ฐ๋ฉด์ Promise then์ผ๋ก ์ฌ๊ท ํธ์ถํ ๊ฒฐ๊ณผ๋ ๋ง์ฐ์ค ์ปค์๋ฅผ ๋์์๋ button:hover์ ์์ ๊ฐ์ด ๊ทธ๋๋ก ๋จ์ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด๋ ๋ ๋น๋๊ธฐ ํจ์์ ์ฝ๋ฐฑ ํจ์๊ฐ ๊ฐ๊ธฐ ๋ค๋ฅธ ํ์ ์ ์ฌ๋๊ธฐ ๋๋ฌธ์ด๋ค.
setTimeout()๊ณผ ๊ฐ์ ๊ฒฝ์ฐ๋ ํ ์คํฌ ํ์ ์ ์ฌ๋๋ ๋ฐ๋ฉด Promise then๊ณผ ๊ฐ์ ๊ฒฝ์ฐ๋ Microtask ํ์ ์ ์ฌ๋๋ค. ์ด ๋ ๋ชจ๋ ์ฝ ์คํ์ด ๋น์ด์์ ๋ ์ด๋ฒคํธ ๋ฃจํ์ ์ํด ์ฝ ์คํ์ ์ ์ฌ๋๋ค๋ ์ ์ ๋๊ฐ์ผ๋ ๋ค์ ์ฐจ์ด๊ฐ ์กด์ฌํ๋ค.
ํ ์คํฌ ํ์ ์ ์ฌ ๋ ์ฝ๋ฐฑ ํจ์์ ๊ฐ์ ๊ฒฝ์ฐ๋ ์ฝ ์คํ์ ์ ์ฌ๋์ด ์คํ์ด ์ข ๋ฃํ๊ฒ ๋๋ฉด ํ ์คํฌ ํ์ ๊ทธ ๋ค์ ์ฝ๋ฐฑ ํจ์๊ฐ ์ ์ฌํด ์๋๋ผ๋ ์ด๋ฅผ ์ด์ด์ ์ฒ๋ฆฌํ์ง ์์ ์ฑ, ์ด๋ฒคํธ ๋ฃจํ๋ ๋ค์ ์ํ ์ฐธ์กฐ๋ฅผ ํ๊ฒ ๋๋ค. ์ดํ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ๊ณ์ ์ํ ์ฐธ์กฐํ๊ฒ ๋๋ฉด์ ์ผ์ ์๊ฐ(60fps)๊ฐ ๋์์ ๋ ๋๋๋ง ์ํ์ค๋ฅผ ์ฐธ์กฐํ๊ฒ ๋๊ณ RequestAnimationFrame์ ์ํด button:hover์ ๊ฐ์ด ์ ๋ฐ์ดํธ ๋ ์ ์๋ ๊ธฐํ๊ฐ ์๊ธด๋ค.
๋ฐ๋ฉด์, Microtask ํ์ ๊ฐ์ ๊ฒฝ์ฐ๋ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์์ ์ ์ ์ฅ์ ๋ด์ ์ฝ๋ฐฑ ํจ์๋ค์ด ๋ชจ๋ ๋ค ์์ด์ง ๋๊น์ง ๊ธฐ๋ค๋ฆด ๋ฟ๋ง ์๋๋ผ ์ฝ๋ฐฑ ํจ์๊ฐ ๋ชจ๋ pop ๋์ด ์ข ๋ฃ๋๊ธฐ ์ ์ ์๋ก์ด ์ฝ๋ฐฑ ํจ์๊ฐ Microtask ํ์ ์๋กญ๊ฒ ์ ์ฌ ๋ ์ฝ๋ฐฑ ํจ์๊ฐ ์กด์ฌํ๋ค๋ฉด ์ด๋ฅผ ๊ณ์ ์ฝ ์คํ์ ์ ์ฌํ๋ค. ์ฆ, Promise then์์๋ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์ ์์ ์ผ๋ก ์ํ ์ฐธ์กฐํ์ง ๋ชปํ ์ฑ ๊ณ์ Microtask ํ์ ๋จธ๋ฌผ๊ฒ ๋์ด ๋๋๋ง ์ํ์ค๋ฅผ ์ฐธ์กฐํ ๊ธฐํ๊ฐ ์๊ธฐ์ง ์์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ ๋ฐ์ดํธ ํ์ง ๋ชปํ ์ฑ ์์๊ฐ์ด ๋ณํ์ง ์์ ๊ฒ์ด๋ค.
์์ ์ธ๊ธ ํ requestAnimationFrame ๋ํ ์ด๋ฒคํธ ๋ฃจํ์ ์ํด ์ฐธ์กฐ๋๋ค. ๋ค๋ง, ์ด๋ฒคํธ ๋ฃจํ์ ์ํด ๋งค๋ฒ ์ฐธ์กฐ๋๋ ๊ฒ์ด ์๋๋ผ ์ผ์ ์๊ฐ์ ๋๋๋ง ๊ฐ๊ฒฉ์ ๋ง์ถฐ ์ฐธ์กฐ๊ฐ ์ผ์ด๋๋๋ฐ, ์ด๋ ์ด๋ฒคํธ ๋ฃจํ์ ์ํ ๋๋ ์๋๊ฐ ๋๋๋ง์ด ์ฃผ๊ธฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ 60fps๋ณด๋ค ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค.
requestAnimationFrame ๋ํ ์๋ฃ๋ฅผ ํ ๊ตฌ์กฐ๋ก ์ ์ฅํ๋ค. FIFO(Fisrt in First out)์ด๋ผ๋ ํ์ ํน์ฑ ์ style์ ์ ์ฉ ๋ ์์๋๋ก beige => orange => red ๊ฐ ๋น ์ ธ ๋๊ฐ ์ต์ข ์ ์ผ๋ก red ์์์ด ๋ธ๋ผ์ฐ์ ์ ์ ์ฉ๋๋ค.