๋ธ๋ก๊ทธ ๊ด๊ณ ์ฑ๋ฅ๊ณผ Intersection Observer๋ฅผ ํ์ฉํ Core Web Vitals ํฅ์ํ๊ธฐ
Intersection Observer ์ ์ฉ: ์ ๋์ผ์ค ๋ฑ ๋ฌด๊ฑฐ์ด ๋ธ๋ก๊ทธ ๊ด๊ณ ์คํฌ๋ฆฝํธ๋ฅผ ๋น๋๊ธฐ ์ง์ฐ ๋ก๋ฉํ์ฌ ์น ์ฑ๋ฅ ์ ํ๋ฅผ ๋ฐฉ์งํ๊ณ SEO ์ ์๋ฅผ ์ฌ๋ฆฌ๋ ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.โ
์น ํ๊ฒฝ์์SEO(๊ฒ์ ์์ง ์ต์ ํ)์ ํต์ฌ์ ์ด์ ์ฌ์ฉ์ ๊ฒฝํ(UX)์ด๋ฉฐ, ๊ตฌ๊ธ์ ์ด๋ฅผ Core Web Vitals(์ฝ์ด ์น ๋ฐ์ดํ)์ด๋ผ๋ ๊ณต์ ์งํ๋ฅผ ํตํด ์๊ฒฉํ๊ฒ ์ธก์ ํฉ๋๋ค. Core Web Vitals๋ ์น์ฌ์ดํธ์ ๋ก๋ฉ ์๋, ์ํธ์์ฉ ๋ฐ์์ฑ, ๊ทธ๋ฆฌ๊ณ ์๊ฐ์ ์์ ์ฑ์ ์ข ํฉ์ ์ผ๋ก ํ๊ฐํ๋ ํต์ฌ ์งํ์ ๋๋ค.
ํนํ ๊ด๊ณ ๋ ๋ฌด๊ฑฐ์ด ์๋ํํฐ ์คํฌ๋ฆฝํธ(์: Google AdSense, ๋ฐ์ด๋ธ, ํ๋ถ๋ผ ๋ฑ ๋ค์ดํฐ๋ธ ๊ด๊ณ ์๋ฃจ์ )๋ฅผ ํ์ด์ง์ ํตํฉํ๋ ๊ณผ์ ์์ ๋ฐ์ํ๋ ์ฑ๋ฅ ์ ํ๋ ์น์ฌ์ดํธ์ ์์กด๊ณผ ๊ฒ์ ์์ง ์์๋ฅผ ์ํํ๋ ๊ฐ์ฅ ํฐ ์์์ ๋๋ค.
๋ง์ ํผ๋ธ๋ฆฌ์ ๋ค์ด "์์ตํ = ์๋ ์ ํ"๋ผ๋ ์๋ชป๋ ๋ฑ์์ ๋ฐ์๋ค์ด์ง๋ง,์ด๋ Intersection Observer(์ธํฐ์น์ ์ต์ ๋ฒ) API๋ผ๋ ์ต์ ์น ํ์ค ๊ธฐ์ ์ ํตํด ์ถฉ๋ถํ ๊ทน๋ณตํ๊ณ ์คํ๋ ค ์ฑ๋ฅ๊ณผ ์์ต์ ๋์์ ์ฌ๋ฆด ์ ์์ต๋๋ค.
์ด์ LCP(Largest Contentful Paint), CLS(Cumulative Layout Shift), ๊ทธ๋ฆฌ๊ณ INP(Interaction to Next Paint) ๊ฐ์ ํต์ฌ ์งํ๋ฅผ ์์์ํค์ง ์์ผ๋ฉด์๋ ๊ด๊ณ ๋ ธ์ถ ํจ์จ, ์ฆ Viewability๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ์ง์ฐ ๋ก๋ฉ(Lazy Loading)์ ๊ธฐ์ ์ ์๋ฆฌ์ ์ ๋์ผ์ค ๊ด๊ณ (AdSense ์ฝ๋)์ ์ ์ฉํ๋ ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ์ ์์๋ณด๊ณ , ๊ณ ์ฑ๋ฅ ์น ์ํคํ ์ฒ ๊ตฌ์ถ์ ์์ํฉ๋๋ค.
1. ๋ธ๋ก๊ทธ ๊ด๊ณ ๋ก ์ธํ ์ฑ๋ฅ ์ ํ์ ๊ทผ๋ณธ ์์ธ์ ๋ฌด์์ผ๊ฐ์?
๊ณผ๊ฑฐ ์๋ ๋์ ์น ๊ฐ๋ฐ์๋ค์ ํน์ ์์๊ฐ ๋ทฐํฌํธ์ ๋ค์ด์๋์ง ๊ฐ์งํ๊ณ ์ฝํ ์ธ ๋ฅผ ๋ก๋ํ๊ธฐ ์ํด window.onscroll ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ์์กดํด ์์ต๋๋ค. ์ด ๋ฐฉ์(์คํฌ๋กค ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ฒ๋ฆฌ)์ ๊ทผ๋ณธ์ ์ผ๋ก ๋นํจ์จ์ ์ด๋ฉฐ, ๋ธ๋ผ์ฐ์ ์ฑ๋ฅ ์ ํ์ ์ฃผ์ ์์ธ ์ค ํ๋์ ๋๋ค.

ํนํ์ด๊ธฐ ๊ด๊ณ ๋ก๋ฉ ์ต์ ํ๋ฅผ ์ํด ์คํฌ๋กค ์ด๋ฒคํธ๋ฅผ ํ์ฉํ๋ ์ฌ๋ก๊ฐ ๋ง์๋๋ฐ, ์ด๋ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๋์ฑ ์ ํ์ํค๋ ์์ธ์ด ๋์์ต๋๋ค. ์คํฌ๋กค ์ด๋ฒคํธ๋ ์ฌ์ฉ์ ์ํธ์์ฉ ์ค ๊ฐ์ฅ ๋น๋ฒํ๊ฒ ๋ฐ์ํ๋ ์ด๋ฒคํธ์ด๊ธฐ ๋๋ฌธ์, ์ด ๋ฆฌ์ค๋ ๋ด๋ถ์์ ๋ฌด๊ฑฐ์ด ์์ ์ ์ฒ๋ฆฌํ๋ฉด ๋ธ๋ผ์ฐ์ ์ ํฐ ๋ถ๋ด์ ์ฃผ๊ฒ ๋ฉ๋๋ค. ์ด๋ CPU ๋ถํ๋ฅผ ์ฆ๊ฐ์ํค๊ณ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ๋ณ๋ชฉ ํ์์ ์ ๋ฐํฉ๋๋ค.
๋ํ ์ด ๋ฐฉ์์ ๋๋ฐ์ด์ฑ(Debouncing)์ด๋ ์ค๋กํ๋ง(Throttling) ๊ฐ์ ๋ณด์กฐ์ ์ธ ์ต์ ํ ๊ธฐ๋ฒ์ ์ถ๊ฐ๋ก ์ ์ฉํด์ผ ํ๋ฏ๋ก ์ฝ๋ ๋ณต์ก๋๋ ์ฆ๊ฐํ๊ณ , ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๋ฉ์ธ ์ค๋ ๋์๋ ์ฌ์ ํ ์๋นํ ๋ถ๋ด์ ๋จ๊ธฐ๋ ๋ฌธ์ ๊ฐ ์กด์ฌํฉ๋๋ค. Intersection Observer๋ ์ด๋ฌํ ์๋์ ์ธ ์ต์ ํ ์์ ์์ฒด๋ฅผ ํ์ ์๊ฒ ๋ง๋ญ๋๋ค.
1. ๋ฉ์ธ ์ค๋ ๋(Main Thread)์ ๊ณผ๋ถํ์ INP ์ ํ
window.onscroll ์ด๋ฒคํธ๋ ์ฌ์ฉ์๊ฐ ์คํฌ๋กคํ ๋๋ง๋ค ๋งค์ฐ ๋์ ๋น๋(์ด๋น ์์ญ ํ)๋ก ์ฝ๋ฐฑ ํจ์๋ฅผ ์คํํฉ๋๋ค. ์ด ์ฝ๋ฐฑ ๋ด์์ ๋ทฐํฌํธ ์์น๋ฅผ ํ์ธํ๊ธฐ ์ํด element.getBoundingClientRect() ๊ฐ์ ๋๊ธฐ์ ์ธ ๋ ์ด์์ ๊ณ์ฐ ํจ์๋ฅผ ํธ์ถํ๋ ์๊ฐ, ๋ธ๋ผ์ฐ์ ์ ๋ฉ์ธ ์ค๋ ๋๊ฐ ๊ฐ์ ๋ก ์ ์ ๋ฉ๋๋ค.
๋ฉ์ธ ์ค๋ ๋๋ DOM ์กฐ์, ์คํ์ผ ๊ณ์ฐ, ๋ ์ด์์ ์ฒ๋ฆฌ, ํ์ธํ , ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ(ํด๋ฆญ, ํค ์ ๋ ฅ) ๋ฑ ๋ชจ๋ ์ค์ํ ์์ ์ ๋ด๋นํ๋ ๋จ์ผ ์์ ๋จ์์ ๋๋ค.

๋น๋ฒํ ์คํฌ๋กค ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ฐ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฅ์๊ฐ ์ ์ ํ๊ฒ ๋๋ฉด, ๋ธ๋ก๊ทธ ์๋ต ์๋๊ฐ ์ ํ๋๊ณ FID(First Input Delay)๋ ๋ฌผ๋ก , INP(Interaction to Next Paint) ์ ์๊ฐ ์ ํ๋ฉ๋๋ค. ๋ฉ์ธ ์ค๋ ๋ ๋ธ๋กํน์ ์ฌ์ฉ์ ์ํธ์์ฉ์ ๋ํ ์๋ต์ ์ง์ฐ์ํค๋ ์ฅ๊ธฐ ์คํ ์์ (Long Task)์ ์ ๋ฐํ๋ฉฐ, ์ด๋ INP์ ๊ถ์ฅ ์๊ณ๊ฐ(300ms)์ ์ฝ๊ฒ ์ด๊ณผํ๊ฒ ๋ง๋ญ๋๋ค.
INP๋ ๋ฌด์์ธ๊ฐ์?
INP๋ ์ฌ์ฉ์๊ฐ ํ์ด์ง์ ์ํธ์์ฉ(ํด๋ฆญ, ํญ, ํค ์ ๋ ฅ ๋ฑ)ํ์ ๋๋ถํฐ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ค์ ์๊ฐ์ ์ ๋ฐ์ดํธ(Next Paint)๋ฅผ ํ๋ฉด์ ํ์ํ ๋๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ธก์ ํฉ๋๋ค. ์ฆ, ์ฌ์ฉ์๊ฐ ์ก์ ์ ์ทจํ ํ ๋์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ธฐ๊น์ง์์ฒด๊ฐ ์๋ต ์๋๋ฅผ ์ธก์ ํ๋ ์งํ์ด๋ฉฐ, ์น์ฌ์ดํธ์ ์ ๋ฐ์ ์ธ ๋ฐ์์ฑ ํ์ง์ ๋ํ๋ ๋๋ค. 50ms ์ด์์ ์๋ต ์ง์ฐ์ ์ฌ์ฉ์์๊ฒ ๋ถ์พ๊ฐ์ ์ค ์ ์์ต๋๋ค.

2. Layout Thrashing์ ์ ์ํ๊ณผ ๊ฐ์ Re-Flow
๋ ์ฌ๊ฐํ ๋ฌธ์ ๋ ๋ ์ด์์ ์ค๋์ฑ(Layout Thrashing)์
๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์์์ ์์น๋ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํด DOM์์ ๊ฐ์ ์ฝ์ด์จ ์งํ(์: offsetTop, clientWidth, getComputedStyle()), ๊ณง๋ฐ๋ก DOM์ ๋ณ๊ฒฝ(์: height = '200px', style.top = '10px')ํ๋ฉด, ๋ธ๋ผ์ฐ์ ๋ ์ต์ ๊ฐ์ ๋ฐ์ํ๊ธฐ ์ํด ๊ฐ์ ๋ก ๋๊ธฐ์ ์ธ ์ฌ๊ณ์ฐ(Re-Flow/Re-Layout)์ ์ํํด์ผ ํฉ๋๋ค.
Layout Thrashing์ด๋, JavaScript๊ฐ ํ๋ฉด ์ ๋ณด๋ฅผ ์ฝ๊ณ ์์ ํ๋ ์์ ์ ๋ฐ๋ณตํ๋ฉด์ ๋ธ๋ผ์ฐ์ ์ ๊ฐ์ ๋ ์ด์์ ์ฌ๊ณ์ฐ์ ์ผ์ผํค๋ ๋นํจ์จ์ ์ธ ํจํด์ ๋๋ค. ์ด๋ฌํ '์ฝ๊ธฐ-์ฐ๊ธฐ-์ฝ๊ธฐ-์ฐ๊ธฐ'์ ๋ฐ๋ณต์ ์ธ ๋นํจ์จ์ ๋ ์ด์์ ์ฌ๊ณ์ฐ ๋น์ฉ์ ์์ญ ๋ฐฐ ์ด์ ์ฆ๊ฐ์์ผ CPU ๋ถํ๋ฅผ ๊ทน๋๋ก ์ฆ๊ฐ์ํค๋ฉฐ,ํ์ด์ง๊ฐ ๋ฒ๋ฒ ๊ฑฐ๋ฆฌ๋ '๋(Lag)' ํ์์ ์ ๋ฐํ๋ ์ง์ ์ ์ธ ์์ธ์ด ๋ฉ๋๋ค.
ํนํ ์คํฌ๋กค ๊ธฐ๋ฐ ๊ฐ์ง ๋ก์ง์ ์ด๋ฌํ ๋ฐ๋ณต์ ์์ฃผ ์ ๋ฐํ์ง๋ง, Intersection Observer๋ ์ด ๋ฌธ์ ๋ฅผ ๋ฉ์ธ ์ค๋ ๋์์ ์ ๊ฑฐํด ์ฑ๋ฅ ์ ํ๋ฅผ ๊ทผ๋ณธ์ ์ผ๋ก ํด๊ฒฐํฉ๋๋ค.

2. Intersection Observer์ ๊ธฐ์ ์ ์ฐ์: ๋น๋๊ธฐ ๋ฐ ๋ธ๋ผ์ฐ์ ๋ค์ดํฐ๋ธ ์ต์ ํ
Intersection Observer API๋ ์ด๋ฌํ ๊ตฌ์๋์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋์ ๋ ์ ์ธ์ (Declarative)์ด๋ฉฐ ๋น๋๊ธฐ์ ์ธ(Asynchronous) ๊ด์ฐฐ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ์ด API๋ ์น ์ฑ๋ฅ ์ต์ ํ์ ํจ๋ฌ๋ค์์ ๋ฐ๊พผ ํต์ฌ ๊ธฐ์ ์ ๋๋ค.
1. ๋ฉ์ธ ์ค๋ ๋๋ก๋ถํฐ์ ์์ ๋ถ๋ฆฌ ๋ฐ ๋น๋๊ธฐ ์ฝ๋ฐฑ์ ์ฅ์
IO๋ ์์์ ๊ต์ฐจ(Intersection) ์ฌ๋ถ๋ฅผ ๋ธ๋ผ์ฐ์ ์์ฒด์ ๋ค์ดํฐ๋ธ ์ฝ๋ ๋ ๋ฒจ์์, ์ฆ ๋ฉ์ธ ์ค๋ ๋ ๋ฐ์ ํฉ์ฑ ์ค๋ ๋(Compositor Thread)์ ๊ฐ์ ๋ ํจ์จ์ ์ธ ๋ฐฉ์์ผ๋ก ๊ฐ์ํ๊ณ ๊ณ์ฐํฉ๋๋ค. ๋ฐ๋ผ์ ์คํฌ๋กค ์ด๋ฒคํธ์๋ ๋ฌ๋ฆฌ, IO์ ์ฝ๋ฐฑ ํจ์๋ ๊ด์ฐฐ ๋์ ์์๊ฐ ๊ฐ๋ฐ์๊ฐ ์ค์ ํ ์๊ณ๊ฐ(threshold)์ ๋๋ฌํ์ ๋๋ง ๋น๋๊ธฐ์ ์ผ๋ก ํธ์ถ๋ฉ๋๋ค.
์ด ๋น๋๊ธฐ์ ํน์ฑ ๋๋ถ์ ์ฝ๋ฐฑ ์คํ์ด ๋ฉ์ธ ์ค๋ ๋์ ๋ค๋ฅธ ์ค์ํ ์์ (์ฌ์ฉ์ ์ ๋ ฅ ์ฒ๋ฆฌ ๋ฑ)์ ๋ฐฉํดํ์ง ์์ผ๋ฉฐ, ๋ฉ์ธ ์ค๋ ๋์ ๋ถํ๋ฅผ ํ๊ธฐ์ ์ผ๋ก ์ค์ ๋๋ค.
์ด๋ ํนํ First Input Delay(FID)์ INP ์งํ๋ฅผ ๊ฐ์ ํ๋ ๋ฐ ํต์ฌ์ ์ธ ์ญํ ์ ํฉ๋๋ค. IO๋ ํนํ ์ด๊ธฐ ๋ก๋ฉ ์ ๋ณด์ด์ง ์๋ ์๋ง์ ๊ด๊ณ ์ฌ๋กฏ์ด๋ ์ด๋ฏธ์ง์ ๋ก๋ฉ์ ์ง์ฐ์์ผ ์ด๊ธฐ ๋ก๋ฉ ์ฑ๋ฅ(FCP, LCP) ๊ฐ์ ์ ๊ฒฐ์ ์ ์ธ ์ญํ ์ ํฉ๋๋ค. ๋ถํ์ํ ๋คํธ์ํฌ ์์ฒญ์ ์ค์ด๊ณ ๋ฆฌ์์ค๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.

2. rootMargin์ ํตํ ์ค๋งํธํ ์ฌ์ ๋ก๋ฉ๊ณผ Viewability ํ๋ณด ์ ๋ต
IO๋ ๊ด์ฐฐ ์์ญ(Root) ์ธ์ rootMargin์ด๋ผ๋ ์ค์ํ ์ต์
์ ์ ๊ณตํฉ๋๋ค. ์ด ์ต์
์ ์ฌ์ฉํ๋ฉด ๋ทฐํฌํธ์ ์ค์ ๋ก ๋ค์ด์ค๊ธฐ ์ง์ (์: ๋ทฐํฌํธ ํ๋จ์ผ๋ก๋ถํฐ 250px ์)์ ๊ด๊ณ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฏธ๋ฆฌ ์คํํ์ฌ ๋ก๋ฉ์ ์์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ค๋งํธํ ์ฌ์ ๋ก๋ฉ(Pre-loading)์ด๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
๋์งํธ ๊ด๊ณ ์์ Viewability๋ ๊ด๊ณ ์ ์ค์ํ ์์ต ์งํ์ ๋๋ค.
Viewability (๋ทฐ์ด๋น๋ฆฌํฐ)๋?
๊ด๊ณ ๊ฐ ์ค์ ๋ก ์ฌ์ฉ์์๊ฒ ๋ ธ์ถ๋์๋์ง๋ฅผ ์ธก์ ํ๋ ์งํ์ ๋๋ค. ๋จ์ํ ๊ด๊ณ ํ์ด์ง๊ฐ ๋ก๋ฉ๋์๋ค๋ ๊ฒ ์ด์์, ๊ด๊ณ ๊ฐ ์ฌ์ฉ์์ ํ๋ฉด์ ๋ณด์ฌ์ง ์ ์๋ ์ํ์๋์ง๋ฅผ ํ์ธํ๋ ํต์ฌ ์ฑ๊ณผ ์งํ(KPI)์ ๋๋ค. IAB(Interactive Advertising Bureau)์ ๊ธฐ์ค์ ์ถฉ์กฑํด์ผ ๊ด๊ณ ๋ ธ์ถ๋ก ์ธ์ ๋์ด ์์ต์ผ๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค.
| ๊ด๊ณ ์ ํ | ์ต์ ๊ธฐ์ค |
|---|---|
| ๋์คํ๋ ์ด ๊ด๊ณ (๋ฐฐ๋ ๊ด๊ณ ) | ๊ด๊ณ ํฝ์ ์ 50% ์ด์์ด ์ต์ 1์ด ์ด์ ์ฌ์ฉ์ ๋ธ๋ผ์ฐ์ ์ ๋ทฐํฌ(Viewport) ๋ด์ ๋ ธ์ถ๋์ด์ผ ํฉ๋๋ค. |
| ๋์์ ๊ด๊ณ (Video Ads) | ๊ด๊ณ ํฝ์ ์ 50% ์ด์์ด ์ต์ 2์ด ์ด์ ์ฐ์์ ์ผ๋ก ๋ทฐํฌํธ ๋ด์ ๋ ธ์ถ๋์ด์ผ ํฉ๋๋ค. |
rootMargin: '250px 0px 250px 0px'์ ๊ฐ์ด ์ค์ ํ๋ฉด, ์ฌ์ฉ์๊ฐ ์คํฌ๋กค ํ์ ๋ ๊ด๊ณ ๊ฐ ์ด๋ฏธ ๋ก๋ฉ๋์ด ํ์๋๋ฏ๋ก, ์ง์ฐ ๋ก๋ฉ์ผ๋ก ์ธํ ๋น ๊ณต๊ฐ ๋
ธ์ถ(UX ์ ํ) ์์ด ๊ด๊ณ ๋
ธ์ถ ํจ์จ(Viewability)์ ๋์ผ์ ์์ต๋๋ค. ์ด ๊ฐ์ ์กฐ์ ํ์ฌ ์ฑ๋ฅ๊ณผ ์์ต ์ฌ์ด์ ์ต์ ์ ๊ท ํ์ ์ ์ฐพ์ ์ ์์ต๋๋ค.
3. Core Web Vitals ์ต์ ํ์ ๋ฏธ์น๋ ์ง์ ์ ์ธ ์ํฅ
Intersection Observer ๊ธฐ๋ฐ์ ์ง์ฐ ๋ก๋ฉ์ LCP(Largest Contentful Paint)์ CLS(Cumulative Layout Shift)๋ผ๋ ๋ ๊ฐ์ง ํต์ฌ Core Web Vitals ์งํ๋ฅผ ๊ฐ์ ํ๋ ๊ฐ์ฅ ๊ฐ๋ ฅํ๊ณ ํจ๊ณผ์ ์ธ ์๋จ์ ๋๋ค.
1. LCP(Largest Contentful Paint) ๊ฐ์ ์ ํตํ SEO ์ ์ ํ๋ณด
LCP๋ ๋ทฐํฌํธ ๋ด์์ ๊ฐ์ฅ ํฐ ์ฝํ ์ธ ์์(ํ ์คํธ ๋ธ๋ก, ์ด๋ฏธ์ง, ๋น๋์ค ํฌ์คํฐ ๋ฑ)๊ฐ ๋ก๋๋์ด ์ฌ์ฉ์์๊ฒ ๋ณด์ด๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ธก์ ํฉ๋๋ค. LCP๋ ํ์ด์ง์ ์ด๊ธฐ ๋ก๋ฉ ์ฒด๊ฐ์ ์ธก์ ํ๋ ๊ฐ์ฅ ์ค์ํ ์งํ์ ๋๋ค.
์ด๊ธฐ ํ์ด์ง ๋ก๋ฉ ์, ๋ฌด๊ฑฐ์ด ์๋ํํฐ ๊ด๊ณ ์คํฌ๋ฆฝํธ(adsbygoogle.js๋ฑ)๋ฅผ ์ฆ์ ์คํํ์ง ์๊ณ ์ง์ฐ(Defer)์ํค๋ฉด, ๋ธ๋ผ์ฐ์ ๋ ๊ด๊ณ ์ฒ๋ฆฌ๋ก ์ธํ ๋ฉ์ธ ์ค๋ ๋ ๊ฒฝ์ ๋ฐ ๋คํธ์ํฌ ๋ฆฌ์์ค ๊ฒฝ์์์ ๋ฒ์ด๋ ํ
์คํธ๋ ๋ฉ์ธ ์ด๋ฏธ์ง ๊ฐ์ ์ฃผ์ ์ฝํ
์ธ ์ ๋ ๋๋ง์ ์ง์คํ ์ ์์ต๋๋ค.
์ด๋ ์ด๊ธฐ ๋ก๋ ์๊ฐ์ ๋จ์ถ์ํค๊ณ Total Blocking Time (TBT)์ ์ค์ฌ LCP๋ฅผ 2.5์ด ์ด๋ด๋ก ์ ์งํ๋ ๋ฐ ๊ฒฐ์ ์ ์ธ ๊ธฐ์ฌ๋ฅผ ํ๋ฉฐ, ์ด๋ ๊ณง SEO ์ ์ ํฅ์์ผ๋ก ์ด์ด์ง๋๋ค.

2. CLS(Cumulative Layout Shift) ๋ฐฉ์ง๋ฅผ ์ํ ๊ณต๊ฐ ํ๋ณด ์๋ฌด์ CSS ์ ๋ต
CLS๋ ์์์น ๋ชปํ ๋ ์ด์์ ์ด๋๋์ ์ธก์ ํ๋ฉฐ, ๊ด๊ณ ๊ฐ ๋ฆ๊ฒ ๋ก๋๋๋ฉด์ ํ์ด์ง ์ฝํ ์ธ ๋ฅผ ๋ฐ์ด๋ด๋ ๊ฒ์ด CLS ์ ํ์ ์ฃผ์ ์์ธ์ ๋๋ค. Intersection Observer๋ฅผ ์ฌ์ฉํ๋๋ผ๋, ๊ด๊ณ ์์ญ์ด ๋ก๋๋ ๋ ๋ฐ๋ฆผ์ด ๋ฐ์ํ๋ฉด CLS ์ ์๊ฐ ๊ธ๋ฑํฉ๋๋ค. CLS ๋ชฉํ๋ 0.1 ์ดํ์ ๋๋ค.
๋ฐ๋ผ์ ์ง์ฐ ๋ก๋ฉ์ ๊ตฌํํ ๋๋ ๊ด๊ณ ์ปจํ
์ด๋(Placeholder)์ CSS๋ฅผ ์ฌ์ฉํ์ฌ ๊ด๊ณ ๊ฐ ๋ค์ด์ฌ ์ต์ ๊ณต๊ฐ(min-height, min-width)์ ๋ฏธ๋ฆฌ ํ๋ณดํด์ผ ํฉ๋๋ค. ๊ด๊ณ ํฌ๊ธฐ๋ฅผ ์ ํํ ์์ธกํ ์ ์๋ค๋ฉด Aspect Ratio Box ๊ธฐ๋ฒ(์: padding-bottom์ ์ฌ์ฉํ์ฌ ๋น์จ ์ ์ง)์ ํ์ฉํ๋ ๊ฒ์ด ์ต์ ์
๋๋ค.
๊ด๊ณ ๊ฐ ๋ก๋๋์ด ์ค์ ์ฝํ ์ธ ๋ก ์ฑ์์ง๋๋ผ๋, ๋ฏธ๋ฆฌ ํ๋ณด๋ ๊ณต๊ฐ ๋๋ถ์ ์ฃผ๋ณ ์์๋ ์์ง์ด์ง ์์ ์๊ฐ์ ์์ ์ฑ์ ๋ณด์ฅํ๊ณ CLS๋ฅผ ์๋ฒฝํ๊ฒ ๋ฐฉ์ดํ ์ ์์ต๋๋ค.
4. ์ ๋์ผ์ค ๊ด๊ณ ์ ์ธ ๊ตฌ์ฑ ์์์ IO ์ ์ฉ ๋ฐฉ๋ฒ
Google AdSense ๊ด๊ณ ์ฝ๋๋ ์ธ ๊ฐ์ง ํต์ฌ ๋ถ๋ถ์ผ๋ก ๋๋๋ฉฐ, Intersection Observer๋ฅผ ์ ์ฉํ๋ ์ ๋ต์ 3๋ฒ ์ต์ข ์คํ ๋ช ๋ น์ ์ฌ์ฉ์ ๋ทฐํฌํธ ์ง์ ์์ ์ผ๋ก ์ง์ฐ ์ ์ด(Lazy Execution)ํ๋ ๊ฒ์ ์์ต๋๋ค. ์ด ์ ๋ต์ ํตํด ๊ด๊ณ ์์ฒญ ๋ฐ ๋ ๋๋ง์ ์ต์ ์ ์์ ์ ์ํํ์ฌ ์ด๊ธฐ ๋ก๋ฉ ์ฑ๋ฅ์ ํ๋ณดํฉ๋๋ค.
1. 1๋จ๊ณ: ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋น๋๊ธฐ ๋ก๋ (`adsbygoogle.js`)

์ด ์ฝ๋๋ head ๋๋ body ์๋จ์ ๋ฐ๋์ async ์์ฑ๊ณผ ํจ๊ป ์ฝ์
๋์ด์ผ ํฉ๋๋ค. async ์์ฑ์ ์คํฌ๋ฆฝํธ ๋ค์ด๋ก๋ ์์ฒด๋ HTML ํ์ฑ์ ๋ธ๋กํนํ์ง ์๋๋ก ๋ณด์ฅํ์ง๋ง, ๋ค์ด๋ก๋๊ฐ ์๋ฃ๋๋ ์ฆ์ ์คํฌ๋ฆฝํธ ์คํ์ด ์์๋ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๊ด๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ค์ด๋ก๋ ์ง์ฐ์ดLCP์ ๋ฏธ์น๋ ์ํฅ์ ์ต์ํํฉ๋๋ค.
2. 2๋จ๊ณ: ๊ด๊ณ ์ปจํ ์ด๋ (Placeholder) ์ ์ ๋ฐ CLS ๋ฐฉ์ง

์ ๋์ผ์ค(AdSense)๊ด๊ณ ์ TML ์์๋ ๊ด๊ณ ์ฌ๋กฏ ID๋ฅผ ํฌํจํ๋ฉฐ, ์ด๊ฒ์ด ๋ฐ๋ก Intersection Observer์ ๊ด์ฐฐ ๋์์ด ๋ฉ๋๋ค. SEO ๊ด์ ์์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ด ์์ ๋๋ ์ด๋ฅผ ๊ฐ์ธ๋ ๋ถ๋ชจ์๊ณต๊ฐ ํ๋ณด CSS๋ฅผ ์ ์ฉํ๋ ๊ฒ์
๋๋ค. min-height๋ฅผ ์ง์ ํ์ฌ ๊ด๊ณ ๊ฐ ๋ก๋๋ ๋ ๋ค๋ฅธ ์ฝํ
์ธ ๋ฅผ ๋ฐ์ด๋ด๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๊ฒ์ด CLS ๋ฐฉ์ง๋ฅผ ์ํ ์ ๊ฒฐ ์กฐ๊ฑด์
๋๋ค.
3. 3๋จ๊ณ: IO๋ฅผ ํ์ฉํ ์ต์ข ์คํ ๋ช ๋ น ์ง์ฐ ๋ฐ Offloading

์๋ ์ฆ์ ์คํ๋๋ ๊ด๊ณ ์์ฒญ ๋ฐ ๋ ๋๋ง ๋ช
๋ น์ธ (adsbygoogle = window.adsbygoogle || []).push({});๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ ํจ์ ๋ด๋ถ๋ก ์บก์ํํ๊ณ ,Intersection Observer์ ์ฝ๋ฐฑ ํจ์์์๋ง ์คํ๋๋๋ก ์๊ฒฉํ ์ ์ดํฉ๋๋ค. ์ด๋ก์จ ๊ด๊ณ ์คํฌ๋ฆฝํธ์ ๋ฌด๊ฑฐ์ด ์คํ ์์
์ ํ์ด์ง ๋ก๋ฉ ์ด๊ธฐ ๋จ๊ณ์์ ์ง์ฐ(Offloading)์์ผ ๋ฉ์ธ ์ค๋ ๋์ ๋ถํ๋ฅผ ์ค์
๋๋ค. ์ด๋ ์ด๊ธฐ ์ฑ๋ฅ ์งํ๋ฅผ ํฌ๊ฒ ๊ฐ์ ํฉ๋๋ค.
์๋ํ ๊ด๊ณ ๊ฐ SEO์ ์ ์ํฅ์ ์ฃผ๋ ์ฃผ์ ์์ธ
์๋ํ ๊ด๊ณ ๋ ์คํฌ๋ฆฝํธ๊ฐ ํ์ด์ง์ ๋์ ์ผ๋ก ๊ด๊ณ ๋ฅผ ์ฝ์ ํ๊ธฐ ๋๋ฌธ์, ํนํ ๋ค์ ์ธ ๊ฐ์ง Core Web Vitals ์งํ๋ฅผ ์ ํ์ํฌ ์ํ์ด ๋์ต๋๋ค. ๊ฐ๋ฅํ๋ฉด ์ต์ ์ ๊ด๊ณ ์์น๋ฅผ ์ ์ ํด์ ์๋์ผ๋ก ๊ด๊ณ ๋ฅผ ์ ์ฉํ์ธ์!
1.CLS (Cumulative Layout Shift) ์ ํ
- ๋ฌธ์ : ์๋ํ ๊ด๊ณ ๋ ํ์ด์ง ๋ก๋ ์์ ์ ๊ด๊ณ ๊ฐ ๋ค์ด๊ฐ ์์ญ์ ๊ณต๊ฐ์ ๋ฏธ๋ฆฌ ํ๋ณดํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ํ์ด์ง ์ฝํ ์ธ ๊ฐ ๋ชจ๋ ๋ก๋๋ ํ์ ๊ด๊ณ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋์ด ๊ฐ์๊ธฐ ๊ด๊ณ ๊ฐ ์ฝ์ ๋๋ฉด, ์ฃผ๋ณ ํ ์คํธ๋ ๋ฒํผ์ด ์๋๋ก ๋ฐ๋ ค๋ฉ๋๋ค.
- ๊ฒฐ๊ณผ: ์ด๋ฌํ ์์์น ๋ชปํ ์๊ฐ์ ๋ถ์์ ์ฑ ๋๋ฌธ์ CLS ์ ์๊ฐ ๋์์ง๊ณ , ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ ์ ํ๋ก ์ด์ด์ ธ SEO์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. (์ฌ์ฉ์๊ฐ ๋ฒํผ์ ํด๋ฆญํ๋ ค๋๋ฐ ๊ด๊ณ ๋๋ฌธ์ ์์น๊ฐ ๋ฐ๋์ด ์ค์๋ก ๊ด๊ณ ๋ฅผ ํด๋ฆญํ๋ ๋ฑ์ ๋ฌธ์ ๋ฐ์)
2. LCP (Largest Contentful Paint) ์ง์ฐ
- ๋ฌธ์ : ์๋ ๊ด๊ณ ๋ฅผ ๋ก๋ํ๋ ์คํฌ๋ฆฝํธ(adsbygoogle.js ๋ฑ)๋ ๋ฌด๊ฑฐ์ด ์๋ํํฐ ์คํฌ๋ฆฝํธ์ ๋๋ค. ์ด ์คํฌ๋ฆฝํธ๊ฐ ์ด๊ธฐ ๋ก๋ฉ ๋จ๊ณ์์ ์คํ๋๋ฉด, ๋ธ๋ผ์ฐ์ ์ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ ์ ํ์ฌ ๊ฐ์ฅ ํฐ ์ฝํ ์ธ (LCP)์ธ ๋ฉ์ธ ์ด๋ฏธ์ง๋ ํ ์คํธ์ ๋ ๋๋ง์ ๋ฐฉํดํ ์ ์์ต๋๋ค.
- ๊ฒฐ๊ณผ: ํ์ด์ง ๋ก๋ ์๋(์ฒด๊ฐ ์๋)๊ฐ ๋๋ ค์ ธ LCP ์ ์๊ฐ ๊ถ์ฅ ๊ธฐ์ค(2.5์ด ์ด๋ด)์ ์ด๊ณผํ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋๋ค. ์ด๊ธฐ ํ์ด์ง ๋ ๋๋ง์ ๊ด๊ณ ๋ฆฌ์์ค๊ฐ ๊ฒฝ์ํ๋ฉด์ ์ค์ํ ์ฝํ ์ธ ์ ํ์๊ฐ ์ง์ฐ๋ฉ๋๋ค.
3. INP (Interaction to Next Paint) ์ ํ
- ๋ฌธ์ : ์๋ ๊ด๊ณ ์คํฌ๋ฆฝํธ๊ฐ ๋ณต์กํ ๊ด๊ณ ์ฝํ ์ธ ๋ฅผ ๋ก๋ํ๊ณ ๋ ๋๋งํ๋ ๊ณผ์ ์์ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฅ์๊ฐ ์ ์ ํ์ฌ ๋ธ๋กํน์ด ๋ฐ์ํฉ๋๋ค. ์ด๋ ์๋ฐฑ ๋ฐ๋ฆฌ์ด์ ๋ฌํ๋ ๊ธด ์์ (Long Task)์ ์ ๋ฐํ ์ ์์ต๋๋ค.
- ๊ฒฐ๊ณผ: ์ด ์์ ์ ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ํด๋ฆญํ๊ฑฐ๋ ์คํฌ๋กคํ๋ ๋ฑ์ ์ํธ์์ฉ์ ์๋ํ๋ฉด, ๋ฉ์ธ ์ค๋ ๋๊ฐ ๊ด๊ณ ์ฒ๋ฆฌ์ ๋ฐ๋น ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ํ ์๋ต์ด ์ง์ฐ๋ฉ๋๋ค. ์ด๋ก ์ธํด INP ์ ์๊ฐ ์ ํ๋ฉ๋๋ค.
๊ณ ์ฑ๋ฅ ์น์ฌ์ดํธ์ ํ์์ ์ธ ๊ด๊ณ ์ต์ ํ ์ํคํ ์ฒ
Intersection Observer ๊ธฐ๋ฐ์ ์ง์ฐ ๋ก๋ฉ์ ๋ ์ด์ ์ ํ์ ๊ธฐ๋ฅ์ด ์๋๋ผ, Core Web Vitals๋ฅผ ์ถฉ์กฑํ๊ณ SEO ๊ฒฝ์์์ ์ฐ์๋ฅผ ์ ํ๊ธฐ ์ํ ํ์์ ์ธ ๊ธฐ์ ์คํ์ ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ์คํฌ๋ฆฝํธ ์คํ์ ์ฌ์ฉ์ ์์ ์ ๋ง์ถฐ ๋น๋๊ธฐ์ ์ผ๋ก ์ง์ฐ์์ผ LCP์ INP๋ฅผ ๋จ์ถํ๊ณ , ๊ณต๊ฐ ํ๋ณด CSS์์ ๊ฒฐํฉ์ ํตํด CLS๋ฅผ ์๋ฒฝํ๊ฒ ๋ฐฉ์ดํฉ๋๋ค.
์ด ์ต์ ํ๋ ์ํคํ ์ฒ๋ฅผ ํตํด ํ์ด์ง ์๋ ๋ฌธ์ ์ SEO ํจ๋ํฐ ๊ฑฑ์ ์์ด, ๋ฐฉ๋ฌธ์์๊ฒ ์ต์์ ๊ฒฝํ์ ์ ๊ณตํ๊ณ ๊ด๊ณ ์์ต์ ์ฌ๋ฆด์ ์๋ ์ฑ๊ณต์ ์ธ ์น์ฌ์ดํธ๋ฅผ ๊ตฌ์ถํ์๊ธธ ๋ฐ๋๋๋ค.
Q1. ์คํฌ๋กค ์ด๋ฒคํธ ๊ธฐ๋ฐ ๊ด๊ณ ๋ก๋ฉ ๋ฐฉ์์ด ์ ์ฑ๋ฅ์ ์ ํ์ํฌ๊น์?
์คํฌ๋กค ์ด๋ฒคํธ๋ ์ด๋น ์์ญ ํ ๋ฐ์ํ๋ฉฐ, ์ด๋๋ง๋ค DOM ์์น ๊ณ์ฐ๊ณผ ๋ ์ด์์ ์ฌ๊ณ์ฐ์ด ๋๊ธฐ์ ์ผ๋ก ๋ฐ๋ณต๋ฉ๋๋ค. ์ด๋ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฅ์๊ฐ ์ ์ ํด INP์ FID๋ฅผ ์ ํ์ํค๋ฉฐ, ๊ด๊ณ ๋ก๋ฉ ์ ๋ฒ๋ฒ ์ ํ์์ ์ ๋ฐํฉ๋๋ค.
Q2. Intersection Observer๋ ๊ธฐ์กด ๋ฐฉ์๊ณผ ์ด๋ค ๊ทผ๋ณธ์ ์ธ ์ฐจ์ด๊ฐ ์๋์?
Intersection Observer๋ ๋ทฐํฌํธ ์ง์ ์ฌ๋ถ๋ฅผ ๋ธ๋ผ์ฐ์ ๋ค์ดํฐ๋ธ ๋ ๋ฒจ์์ ๋น๋๊ธฐ์ ์ผ๋ก ๊ฐ์งํ๋ฉฐ, ์คํฌ๋กค ์ด๋ฒคํธ ์์ด๋ ์์๋ค์ ๋ ธ์ถ ์ํ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด์ฐฐํฉ๋๋ค. ์ด ๋ฐฉ์์ ๋ฉ์ธ ์ค๋ ๋ ๋ถํ๋ฅผ ํฌ๊ฒ ์ค์ฌ Core Web Vitals๋ฅผ ๊ฐ์ ํฉ๋๋ค.
Q3. Layout Thrashing์ ์ด๋ค ์ํฉ์์ ๋ฐ์ํ๋ฉฐ ์ ์ํํ๊ฐ์?
์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ํ๋ฉด ์ ๋ณด๋ฅผ ์ฝ๊ธฐ,์ฐ๊ธฐ๋ฅผ ๋ฐ๋ณตํ ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ฐ์ ๋ก ๋ ์ด์์์ ์ฌ๊ณ์ฐํ๋ฉด์ CPU ์ฌ์ฉ๋์ด ๊ธ์ฆํฉ๋๋ค. ํนํ ์คํฌ๋กค ๊ธฐ๋ฐ ๊ด๊ณ ๊ฐ์ง ์ฝ๋์์ ํํ ๋ฐ์ํ๋ฉฐ ํ์ด์ง ์ ์ฒด๋ฅผ ๋ฒ๋ฒ ๊ฑฐ๋ฆฌ๊ฒ ๋ง๋ญ๋๋ค.
Q4. ๊ด๊ณ Viewability๋ฅผ ์ฌ๋ฆฌ๋ฉด์๋ LCP,INP๋ฅผ ์งํฌ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋์?
Intersection Observer์ rootMargin ์ต์
์ ํ์ฉํ๋ฉด, ๋ทฐํฌํธ ์ง์
์ง์ ์ ๊ด๊ณ ๋ฅผ ์ฌ์ ๋ก๋ฉํ์ฌ ๋น ๊ณต๊ฐ ๋
ธ์ถ ์์ด ๊ด๊ณ ๊ฐ ์ฆ์ ํ์๋ฉ๋๋ค. ์ด๋ ๊ด๊ณ ์์ต ์งํ(Viewability)๋ฅผ ๋์ด๋ฉด์๋ ์ฑ๋ฅ ์ ํ๋ฅผ ๋ง์ต๋๋ค.
๊ตฌ๊ธ ์ ๋์ผ์ค ๊ด๊ณ ์ ์ฉ ์ฝ๋ ์์
์๋ ์ฝ๋๋ฅผ ์์ ์ ์ ๋์ผ์ค ์ฝ๋๋ฅผ ์ ์ฉํด์ HTML ์ฝ๋ /BODY ๋ถ๋ถ์์ ๋ฃ์ด ์ฃผ์๋ฉด ๋ฉ๋๋ค.