setTimeout(0)์ผ๋ก LCP TTI ์ ์ ์ฌ๋ฆฌ๋๋ฒ: ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ ์ต์ ํ
์ด๋ฒ ๊ธ์ setTimeout 0 ์ฑ๋ฅ ์ต์ ํ ๋ฐฉ๋ฒ์ ํ์ฉํ์ฌ ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ ์ง์ฐ ๋ก๋ฉ์ ๊ตฌํํจ์ผ๋ก์จ, ์ ๋์ผ์ค ๊ด๊ณ ๋ก๋ฉ ์๋ ๊ฐ์ ๋ฐ ๋ธ๋ก๊ทธ ๋๋๋ง ์ต์ ํ ๋ฐฉ๋ฒ ์ ๋๋ค.๋ํ ๋ธ๋ก๊ทธ LCP ์ ์ ์ฌ๋ฆฌ๋ ๋ฐฉ๋ฒ๊ณผ ์๋ํ๋ ์ค TTI ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์๋ค๋ฃน๋๋ค.
๊ตฌ๊ธ ํ์ด์ง์คํผ๋ ์ธ์ฌ์ดํธ ์ ์ ์ต์ ํ๋ฅผ ์ํ ๋ธ๋ผ์ฐ์ ๋ฉ์ธ ์ค๋ ๋ ์ ์ ์จ ๋ฎ์ถ๊ธฐ๊ณ Core Web Vitals ์ฑ๋ฅ ๊ฐ์ ์ค๋ฌด ๋ฐฉ๋ฒ
์น ์ฑ๋ฅ์ ํต์ฌ ์งํ์ธ ์ฝ์ด ์น ๋ฐ์ดํ(Core Web Vitals) ์ ์๋ฅผ ์ฌ๋ฆฌ๊ธฐ ์ํ ์์ฃผ ์๋ฆฌํ ๋ฐฉ๋ฒ์ ํ๋ ์๊ฐํด ๋๋ฆฌ๋ ค๊ณ ํฉ๋๋ค. ๋ง์ ๋ธ๋ก๊ฑฐ์ ๊ฐ๋ฐ์๋ค์ด LCP(์ต๋ ์ฝํ ์ธ ๋ ๋๋ง ์๊ฐ)๋ TTI(์ํธ์์ฉ ์์ ์๊ฐ) ์ ์ ๋๋ฌธ์ ๊ณจ๋จธ๋ฆฌ๋ฅผ ์๊ณ ์์ฃ .
ํนํ ํฐ์คํ ๋ฆฌ๋ ์๋ํ๋ ์ค์ฒ๋ผ ๋ด๊ฐ ์์ค์ฝ๋๋ฅผ 100% ์ ์ดํ๊ธฐ ํ๋ CMS ํ๊ฒฝ์์๋ ์ธ๋ถ ์คํฌ๋ฆฝํธ๋ณด๋ค ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ๊ฐ ์ฑ๋ฅ์ ๋ฐ๋ชฉ์ ์ก๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด๋ ๊ตฌ์ํฌ์๋ก ๋ฑ์ฅํ๋ ๊ฒ์ด ๋ฐ๋ก setTimeout(..., 0)์ ๋๋ค. ์ง์ฐ ์๊ฐ 0์ธ๋ฐ ์ด๊ฒ ํจ๊ณผ๊ฐ ์์ด? ๋ผ๊ณ ์๋ฌธ์ ๊ฐ์ง์๋ ๋ถ๋ค์ ์ํด ๊ทธ ์๋ฆฌ์ ์ ์ฉ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํด ๋๋ฆฝ๋๋ค.
setTimeout(..., 0)์ ๋ง๋ฒ: ์ ์ฑ๋ฅ์ด ์ข์์ง๊น?
๊ฒฐ๋ก ๋ถํฐ ๋ง์๋๋ฆฌ๋ฉด, setTimeout(..., 0)์ ๋ชฉ์ ์ ๊ธฐ๋ค๋ฆผ์ด ์๋๋ผ ์์ ๋ฐ๊พธ๊ธฐ์ ์์ต๋๋ค. ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ํต์ฌ์ ์ด์ฉํ๋ ์๋ฆฌ์ ๋๋ค.
1. ๋ฉ์ธ ์ค๋ ๋ ๋น์ฐ๊ธฐ
setTimeout(..., 0)์ ์ฃผ๋ ๋ชฉ์ ์ ์ฝ๋๋ฅผ ๋ฐ๋ก ์คํํ๋ ๊ฒ์ด ์๋๋ผ, ํ์ฌ ์คํ ์ค์ธ ๋ชจ๋ ๋๊ธฐ(synchronous) ์ฝ๋์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ํํด์ผ ํ๋ ๋ ๋๋ง ์์ (Rendering tasks)์ด ์๋ฃ๋ ํ์ ์คํ๋๋๋ก ์ฝ๋๋ฅผ Task Queue๋ก ๋ฐ์ด ๋ฃ๋ ๊ฒ์ ๋๋ค.
- ๋น๋๊ธฐ ์ฒ๋ฆฌ: ์๋ฐ์คํฌ๋ฆฝํธ(avaScript}์ ์ฑ๊ธ ์ค๋ ๋(Single-threaded) ํ๊ฒฝ์ด๋ฏ๋ก, ๊ธด ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ฉด ๋ธ๋ผ์ฐ์ ์ UI ๋ ๋๋ง์ ๋ง๊ฒ ๋ฉ๋๋ค. setTimeout์ ์ด ์ฝ๋๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ์ฌ, ๋ธ๋ผ์ฐ์ ๊ฐ ๋จผ์ ํ๋ฉด์ ๊ทธ๋ฆฌ๊ณ (LCP, FCP ๊ฐ์ ) ๋์ ํด๋น ์ฝ๋๋ฅผ ์คํํ ์ ์๋ ๊ธฐํ๋ฅผ ์ค๋๋ค.
- Time To Interactive (TTI) ๊ฐ์ : ์ฌ์ฉ์ ๊ฒฝํ(UX) ๊ด์ ์์, ํ์ด์ง๊ฐ ์ฌ์ฉ์์ ์ ๋ ฅ์ ๋ฐ์ํ ์ ์๋ ์๊ฐ์ธ TTI๋ฅผ ๋จ์ถํ๋ ๋ฐ ์ ์ฉํ ๋ฐฉ๋ฒ์ ๋๋ค.
2. ์๋ ์๋ฆฌ (๋งคํฌ๋ก ํ์คํฌ)
setTimeout์ ์ง์ฐ ์๊ฐ(Delay)์ 0์ผ๋ก ์ค์ ํ๋๋ผ๋, ์ค์ ๋ก๋ ๋ธ๋ผ์ฐ์ ์ ์ต์ ์ง์ฐ ์๊ฐ(Minimum delay)์ด ์ ์ฉ๋ฉ๋๋ค(์ผ๋ฐ์ ์ผ๋ก 4ms). ๋ ์ค์ํ ๊ฒ์, ์ด ํจ์๊ฐ ์์ฑํ๋ ์์ ์ ๋งคํฌ๋ก ํ์คํฌ(Macrotask)์ ์ํ๋ฉฐ, ํ์ฌ ์คํ ์ค์ธ ์ฝ ์คํ(Call Stack)์ด ์์ ํ ๋น์์ง๊ณ ๋ ๋๋ง์ด ์๋ฃ๋ ํ์์ผ ์ด๋ฒคํธ ๋ฃจํ(Event Loop)์ ์ํด ์คํ๋๋ค๋ ์ ์ ๋๋ค.
- ์ฝ ์คํ(Call Stack) ๋น์ฐ๊ธฐ: ํ์ฌ ์คํ ์ค์ธ ๋ชจ๋ ๋๊ธฐ ์ฝ๋๊ฐ ๋๋์ผ ํฉ๋๋ค.
- ๋ ๋๋ง ์๋ฃ: ๋ธ๋ผ์ฐ์ ๊ฐ ํ ํ๋ ์์ ํ๋ฉด์ ๋ค ๊ทธ๋ฆฐ ํ์์ผ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ํ์คํฌ ํ์ ์๋ setTimeout ์ฝ๋๋ฅผ ๊ฐ์ ธ์ ์คํํฉ๋๋ค.
์ฆ, ํ๋ฉด ๋จผ์ ๋ค ๊ทธ๋ฆฌ๊ณ ๋์, ๋จ๋ ์๊ฐ์ ์ด ์ฝ๋๋ฅผ ์ฒ๋ฆฌํด! ๋ผ๊ณ ๋ธ๋ผ์ฐ์ ์๊ฒ ๋ช ๋ นํ๋ ์์ฃผ ํจ์จ์ ์ธ ๋ฐฉ์์ธ ๊ฒ์ด์ฃ .

๋ฉ์ธ ์ค๋ ๋์๊ฒ ์จํต์ ํ์์ฃผ๋ค
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋(Single-threaded)๋ก ์๋ํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ HTML์ ์ฝ๋ค๊ฐ ๊ธด ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋๋ฉด ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ์์ ์ ๋ฉ์ถ๊ณ ๊ทธ ์ฝ๋๋ฅผ ์คํํ๋ ๋ฐ ๋งค๋ฌ๋ฆฝ๋๋ค. ์ด๋ ์ฌ์ฉ์ ํ๋ฉด์ ๋ฉ์ถ๊ณ LCP ์ ์๋ ๊น์ด๊ฒ ๋์ฃ .
ํ์ง๋ง ์ฝ๋๋ฅผ setTimeout(..., 0)์ผ๋ก ๊ฐ์ธ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ณํ๊ฐ ์ผ์ด๋ฉ๋๋ค.
- ํ์คํฌ ํ(Task Queue)๋ก ์ด๋: ํด๋น ์ฝ๋๋ ์ฆ์ ์คํ๋์ง ์๊ณ ๋๊ธฐ ๋ช ๋จ(Task Queue)์ ๋งจ ๋ค๋ก ๋ฐ๋ ค๋ฉ๋๋ค.
- ๋ ๋๋ง ์ฐ์ ๊ถ ๋ถ์ฌ: ๋ธ๋ผ์ฐ์ ๋ ์คํฌ๋ฆฝํธ ์คํ ๋์ ํ๋ฉด ๊ทธ๋ฆฌ๊ธฐ(Rendering) ์์ ์ ๋จผ์ ์๋ฃํฉ๋๋ค.
- ์ฑ๋ฅ ์งํ ๊ฐ์ : ํ๋ฉด์ด ๋นจ๋ฆฌ ๋จ๋ FCP, LCP ์ ์๊ฐ ์ฌ๋ผ๊ฐ๊ณ , ๋ฉ์ธ ์ค๋ ๋๊ฐ ๋น์์ง๋ ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ๋๋ ์ ๋ ๋ฐ์ํ๋ TTI ์ ์๋ ๊ฐ์ ๋ฉ๋๋ค.
๋ค๋ฅธ ์ต์ ํ ๋ฐฉ์๊ณผ์ ๋น๊ต
์ฑ๋ฅ ์ต์ ํ์ ๋ชฉํ๋ HTML ํ์ฑ์ ์ฐจ๋จํ์ง ์๊ณ , ์คํฌ๋ฆฝํธ๋ฅผ ๊ฐ๋ฅํ ํ ๋ฆ๊ฒ ์คํํ๋ ๊ฒ์ ๋๋ค. ์๋ ํ๋ ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ ์ง์ฐ ๋ก๋ฉ๊ณผ ์ธ๋ถ ์คํฌ๋ฆฝํธ ์ต์ ํ ๋ฐฉ์์ ๋น๊ตํ ๊ฒ์ ๋๋ค.
| ๋ฐฉ์ | HTML ํ์ฑ ์ฐจ๋จ | ์คํ ์์ | ์ฃผ์ ์ด์ |
|---|---|---|---|
| setTimeout(..., 0) | ์ฐจ๋จ ์ ํจ (๋น๋๊ธฐ) | DOMContentLoaded ํ, ํ์ฌ ์ด๋ฒคํธ ๋ฃจํ ์์ ์๋ฃ ์งํ | ๊ธฐ์กด ์ธ๋ผ์ธ ์ฝ๋๋ฅผ ์ฝ๊ฒ ์ง์ฐ์์ผ LCP/TTI ๊ฐ์ . |
| script defer | ์ฐจ๋จ ์ ํจ (๋ณ๋ ฌ ๋ค์ด๋ก๋) | DOMContentLoaded ๋ฐ์ ์ง์ (์์ ๋ณด์ฅ) | ์ธ๋ถ ์คํฌ๋ฆฝํธ์ ์์ ๋ณด์ฅ ๋ฐ ํ์ฑ ์๋ฃ ์ง์ ์คํ. |
| script async | ์ฐจ๋จ ์ ํจ (๋ณ๋ ฌ ๋ค์ด๋ก๋) | ๋ค์ด๋ก๋ ์๋ฃ ์ฆ์ (์์ ๋น๋ณด์ฅ) | ๊ฐ์ฅ ๋น ๋ฅธ ์คํ์ด ํ์ํ ๋ (์: ๊ด๊ณ , ์ ๋๋ฆฌํฑ์ค). |
์ธ์ setTimeout(..., 0)์ด ์ต์ ์ ์ ํ์ธ๊ฐ?
์ค๋ฌด ๊ฒฝํ์, ๋ค์ ์กฐ๊ฑด์์๋ setTimeout(..., 0)์ด ๋ค๋ฅธ ์ด๋ค ๋ฐฉ์๋ณด๋ค ๊ฐ๋ ฅํฉ๋๋ค. ํนํ ๋ธ๋ผ์ฐ์ ๋ฉ์ธ ์ค๋ ๋ ์ ์ ์จ ๋ฎ์ถ๊ธฐ์ ํ์์ ์ ๋๋ค.
- CMS(ํฐ์คํ ๋ฆฌ, ์๋ํ๋ ์ค) ํ๊ฒฝ: ์ธ๋ถ ํ์ผ๋ก ๋ถ๋ฆฌํ๊ฑฐ๋ defer ์์ฑ์ ๋ฃ๊ธฐ ํ๋ ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ ๊ตฌ์กฐ์ผ ๋ ๊ฐ์ฅ ํ์ค์ ์ธ ๋์์ ๋๋ค.
- ๋นํ์์ ๋ก์ง: ๊ด๊ณ ์ง์ฐ ๋ก๋ฉ, ํธํฐ ์์ ฏ ์ด๊ธฐํ, ์ฌ์ฉ์ ํ๋ ์ถ์ ์ฝ๋ ๋ฑ ํ์ด์ง ๋ก๋ ์ฆ์ ์คํ๋ ํ์๊ฐ ์๋ ์ฝ๋์ ์ ํฉํฉ๋๋ค.
- ๋ ์ด์์ ๊ธฐ๋ฐ ๊ณ์ฐ: ์์์ offsetWidth๋ getBoundingClientRect ๋ฑ์ ๊ณ์ฐํด์ผ ํ๋ ๋ก์ง์ ๋ฐ๋์ ๋ ๋๋ง์ด ๋๋ ํ ์คํ๋์ด์ผ ์ฑ๋ฅ ์ ํ(๋ ์ด์์ ์ค๋์ฑ)๋ฅผ ๋ง์ ์ ์์ต๋๋ค.
- ์ ๋๋ฉ์ด์ ์ด๊ธฐํ: ํ๋ฉด์ด ๋ค ๊ทธ๋ ค์ง ํ ์ ๋๋ฉ์ด์ ์ด ์์๋์ด์ผ ๋ถ๋๋ฌ์ด UX๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํต์ฌ ์์ฝ ๋ฐ ์ฃผ์์ฌํญ
Core Web Vitals ์ฑ๋ฅ ๊ฐ์ ์ค๋ฌด ํ์ ํต์ฌ ์ฐ์ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์คํฌ๋ฆฝํธ ์ต์ ํ ์ฐ์ ์์
- ์ธ๋ถ ์คํฌ๋ฆฝํธ๋ ๋ฌด์กฐ๊ฑด defer ์ฌ์ฉ
- ๋ถ์/๊ด๊ณ ์คํฌ๋ฆฝํธ๋ async ํ์ฉ
- ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ๋ ๋ ๋๋ง ํ ์คํ์ด ํ์ํ ๋ก์ง์ setTimeout(..., 0)
โ ์ฃผ์ํ ์ (FOUC ๋ฐฉ์ง)
์ด๋ฏธ์ง ์ฌ๋ผ์ด๋๋ ์๋จ ๋ฉ๋ด์ฒ๋ผ ์ฌ์ฉ์๊ฐ ๋ฐ๋ก ๋ด์ผ ํ๋ ์๊ฐ์ ์์๋ฅผ ์ด๊ธฐํํ๋ ์ฝ๋์ setTimeout์ ์ฐ๋ฉด ํ๋ฉด์ด ๊น๋นก๊ฑฐ๋ฆฌ๋ FOUC(Flash of Unstyled Content) ํ์์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ฐ ์๊ฐ์ ์์๋ ๊ฐ๊ธ์ ์ง์ฐ์ํค์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
setTimeout(0)์ ์ฌ์ฉํ๋ฉด ๋ฌด์กฐ๊ฑด LCP ์ ์๊ฐ ์ข์์ง๋์?
์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ๊ฐ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ ์ ํ์ฌ ๋ ๋๋ง์ ๋ฐฉํดํ๊ณ ์์๋ค๋ฉด ํ์คํ LCP ๊ฐ์ ํจ๊ณผ๊ฐ ์์ต๋๋ค. ํ์ง๋ง ์ด๋ฏธ์ง๊ฐ ๋ฆ๊ฒ ๋จ๋ ์์ธ์ด ์๋ฒ ์๋ต ์๋๋ ์ด๋ฏธ์ง ํฌ๊ธฐ ์์ฒด์ ์๋ค๋ฉด ํจ๊ณผ๊ฐ ์ ํ์ ์ผ ์ ์์ต๋๋ค.
setTimeout(0)๊ณผ defer์ ์ฐจ์ด์ ์ ๋ฌด์์ธ๊ฐ์?
defer๋ ์ธ๋ถ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ HTML ํ์ฑ๊ณผ ๋ณ๋ ฌ๋ก ๋ค์ด๋ก๋ํ ๋ค ํ์ฑ ์๋ฃ ์์ ์ ์คํํ๋ ๋ฐฉ์์ ๋๋ค. ๋ฐ๋ฉด setTimeout(0)์ ์ด๋ฏธ HTML์ ํฌํจ๋ ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ์ ์คํ ์์๋ฅผ ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ์ดํ๋ก ๋ฏธ๋ฃฐ ๋ ์ฌ์ฉํฉ๋๋ค.
ํฐ์คํ ๋ฆฌ์์ ๊ด๊ณ ์คํฌ๋ฆฝํธ์ ์ด ๋ฐฉ์์ ์ ์ฉํด๋ ๋๋์?
๋ค, ๋งค์ฐ ํจ๊ณผ์ ์ ๋๋ค. ํฐ์คํ ๋ฆฌ์ ํ๋จ ๊ด๊ณ ๋ ์ฌ์ด๋๋ฐ ์์ ฏ ์คํฌ๋ฆฝํธ๋ฅผ setTimeout(0)์ผ๋ก ๊ฐ์ธ๋ฉด ์ด๊ธฐ ๋ก๋ฉ ์๋๋ฅผ ๋์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ๊ณ ๊ฒ์ ์์ง ์ต์ ํ ์ ์๋ฅผ ๋์ผ ์ ์์ต๋๋ค.
์ผํ๋ ๋ฐฉ์์ ์ฐจ์ด๊ฐ ํ ๋ ์ฐจ์ด์ ์ ์๋ฅผ ๋ง๋ญ๋๋ค
setTimeout(..., 0)์ ๋จ์ํ ์ฝ๋๋ฅผ ๋ฆ๊ฒ ์คํํ๋ ๊ผผ์๊ฐ ์๋๋๋ค. ๋ธ๋ผ์ฐ์ ์ ์๋ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ ๋ฆฌ์์ค ๋ถ๋ฐฐ๋ฅผ ์ต์ ํํ๋ ์ ๋ต์ ์ ํ์ ๋๋ค.
์ง๊ธ ๋ธ๋ก๊ทธ ํ๋จ์ ๋ค์ด์๋ ๋ฌด๊ฑฐ์ด ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ๋ค์ setTimeout์ผ๋ก ๊ฐ์ธ๋ณด์ธ์. ๊ตฌ๊ธ ํ์ด์ง์คํผ๋ ์ธ์ฌ์ดํธ ์ ์๊ฐ ๋์ ๋๊ฒ ์ฌ๋ผ๊ฐ๋ ๊ฒ์ ๊ฒฝํํ์ค ์ ์์ ๊ฒ๋๋ค.