PIVOT CREATIVEPIVOT CREATIVE
Labs
Core Web Vitals ์‹ค์ „ ๊ฐ€์ด๋“œ โ€” LCPยทINPยทCLS๋ฅผ ๋ฐ์ดํ„ฐ๋กœ ๋‹ค๋ฃจ๋Š” ๋ฒ•
PIVOT LABSํ…Œํฌ

Core Web Vitals ์‹ค์ „ ๊ฐ€์ด๋“œ โ€” LCPยทINPยทCLS๋ฅผ ๋ฐ์ดํ„ฐ๋กœ ๋‹ค๋ฃจ๋Š” ๋ฒ•

๋Ÿฐ์นญ ์ „ ๋ฐ˜๋“œ์‹œ ํ™•์ธํ•ด์•ผ ํ•  ์›นยท๋ชจ๋ฐ”์ผ ์„ฑ๋Šฅ ๋ฐ”์ดํƒˆ(Core Web Vitals) ๊ธฐ์ค€๊ณผ, ์ธก์ • โ†’ ์›์ธ ๊ท€์† โ†’ ์ตœ์ ํ™” โ†’ ์žฌ์ธก์ •์œผ๋กœ ์ด์–ด์ง€๋Š” ์‹ค์ „ ๊ธฐ์ˆ  ๊ฐ€์ด๋“œ. LCPยทINPยทCLS ์ •๋ฐ€ ํ•ด๋ถ€ + Lab/RUM ์ธก์ • ๋ฐฉ๋ฒ•๋ก  + ๊ธฐ๋ณธ ์ตœ์ ํ™” ๊ธฐ๋ฒ•.

์š”์•ฝ

  • ์„ฑ๋Šฅ์€ ์ฃผ๊ด€์  ๋А๋‚Œ์ด ์•„๋‹ˆ๋ผ ์ธก์ • ๊ฐ€๋Šฅํ•œ ์ง€ํ‘œ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. ์‚ฌ์šฉ์ž ์ฒด๊ฐ์˜ ํ•ต์‹ฌ์€ Core Web Vitals(CWV) ์„ธ ๊ฐ€์ง€ โ€” LCP(๋กœ๋”ฉ), INP(๋ฐ˜์‘์„ฑ), CLS(์‹œ๊ฐ์  ์•ˆ์ •์„ฑ).
  • ํŒ์ • ๊ธฐ์ค€(Google ๊ณต์‹ Core Web Vitals): LCP โ‰ค 2.5s, INP โ‰ค 200ms, CLS โ‰ค 0.1 ์ด๋ฉด "์ข‹์Œ". ํ˜„์žฅ ๋ฐ์ดํ„ฐ๋Š” P75(์ƒ์œ„ 75ํผ์„ผํƒ€์ผ) ๋กœ ๋ณธ๋‹ค.
  • ์ธก์ •์€ ๋‘ ์ถ•์ด๋‹ค. Lab(ํ•ฉ์„ฑ) ์€ ์žฌํ˜„ ๊ฐ€๋Šฅยท๋ฐฐํฌ ์ „ ์ง„๋‹จ์šฉ, RUM(์‹ค์‚ฌ์šฉ์ž) ์€ ์ง„์งœ ์ฒด๊ฐยทํ•„๋“œ ๋Œ€ํ‘œ์„ฑ์šฉ. INP ์‹ค์ธก์€ RUM์—์„œ๋งŒ ๋‚˜์˜ค๊ณ , Lab์—์„œ๋Š” TBT๋ฅผ ํ”„๋ก์‹œ๋กœ ์“ด๋‹ค.
  • ์ตœ์ ํ™”๋Š” ์ผํšŒ์„ฑ์ด ์•„๋‹ˆ๋ผ ์ธก์ • โ†’ ์›์ธ ๊ท€์†(attribution) โ†’ ๊ฐœ์„  โ†’ ์žฌ์ธก์ •์˜ ์ง€์† ์‚ฌ์ดํด์ด๋‹ค.
  • ์•„๋ž˜ ๋ณธ๋ฌธ์€ ๊ฐ ๊ธฐ๋ฒ•์„ โ‘  ๋ฌธ์ œ โ†’ โ‘ก ์›๋ฆฌ โ†’ โ‘ข ์ ์šฉ โ†’ โ‘ฃ ์ฝ”๋“œ โ†’ โ‘ค ๊ฒ€์ฆ ํ‹€๋กœ ์ •๋ฆฌํ•œ๋‹ค.

1. ์„œ๋ก  โ€” ์„ฑ๋Šฅ์€ ์™œ UX์ด์ž ๋น„์ฆˆ๋‹ˆ์Šค ๋ฌธ์ œ์ธ๊ฐ€

1.1 ๋ชจ๋ฐ”์ผ์ด๋ผ๋Š” ์ œ์•ฝ์ด ํฐ ์‹คํ–‰ ํ™˜๊ฒฝ

๋ฐ์Šคํฌํ†ฑ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ "๋น ๋ฅด๋‹ค"๊ณ  ๋А๋‚€ ํŽ˜์ด์ง€๊ฐ€ ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ๋ชจ๋ฐ”์ผ์—์„œ ๋А๋ฆฐ ์ด์œ ๋Š”, ๋‘ ํ™˜๊ฒฝ์˜ ๋ฌผ๋ฆฌ์  ์กฐ๊ฑด์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • CPU: ์ค‘์ €๊ฐ€ ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์˜ ๋‹จ์ผ ์ฝ”์–ด ์„ฑ๋Šฅ์€ ๊ฐœ๋ฐœ์šฉ ๋ฐ์Šคํฌํ†ฑ ๋Œ€๋น„ ํฌ๊ฒŒ ๋‚ฎ๋‹ค. JavaScript ํŒŒ์‹ฑยท์‹คํ–‰ยท๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ์ด ๋ชจ๋‘ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์ผ์–ด๋‚˜๋ฏ€๋กœ, CPU๊ฐ€ ๋А๋ฆฌ๋ฉด ๊ฐ™์€ ์ฝ”๋“œ๋ผ๋„ ๋ช‡ ๋ฐฐ ๋А๋ฆฌ๊ฒŒ ์‹คํ–‰๋œ๋‹ค.
  • ๋„คํŠธ์›Œํฌ: ์…€๋ฃฐ๋Ÿฌ ํ™˜๊ฒฝ์€ ๋Œ€์—ญํญ๋ฟ ์•„๋‹ˆ๋ผ ์ง€์—ฐ(latency)๊ณผ ๋ณ€๋™์„ฑ์ด ํฌ๋‹ค. TTFB์™€ ๋ฆฌ์†Œ์Šค ๋กœ๋“œ๊ฐ€ ๋“ค์ญ‰๋‚ ์ญ‰ํ•ด์ง„๋‹ค.
  • ๋‹จ๋ง ํŽธ์ฐจ: ์ตœ์‹  ํ”Œ๋ž˜๊ทธ์‹ญ๋ถ€ํ„ฐ ์ˆ˜๋…„ ์ „ ๋ณด๊ธ‰ํ˜•๊นŒ์ง€ ์ŠคํŽ™ ๋ถ„ํฌ๊ฐ€ ๋„“๋‹ค. "๋‚ด ํฐ์—์„  ๋น ๋ฅธ๋ฐ"๊ฐ€ ํ†ตํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋น„์œ : ์„ฑ๋Šฅ ์ตœ์ ํ™”๋Š” ๊ฐ€์žฅ ์ข‹์€ ํšŒ์„ ์˜ ์ตœ์‹  ํฐ์ด ์•„๋‹ˆ๋ผ ๋ถ๋น„๋Š” ์ง€ํ•˜์ฒ ์—์„œ 3๋…„ ๋œ ๋ณด๊ธ‰ํฐ์„ ์“ฐ๋Š” ์‚ฌ์šฉ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์„ค๊ณ„ํ•˜๋Š” ์ผ์ด๋‹ค.

1.2 ์„ฑ๋Šฅ์ด ์ง€ํ‘œ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ(์ผ๋ฐ˜๋ก )

์ผ๋ฐ˜์ ์œผ๋กœ ๋กœ๋”ฉ์ด ๋А๋ฆฌ๊ณ  ๋ฐ˜์‘์ด ๊ตผ๋œฌ ํŽ˜์ด์ง€๋Š” ์ดํƒˆ๋ฅ ์ด ์˜ค๋ฅด๊ณ  ์ „ํ™˜ยท์žฌ๋ฐฉ๋ฌธ์— ๋ถ€์ •์  ์˜ํ–ฅ์„ ์ค€๋‹ค๋Š” ๊ฒƒ์ด ์—…๊ณ„์˜ ๊ณตํ†ต๋œ ๊ด€์ฐฐ์ด๋‹ค. ๊ตฌ์ฒด์  ์ˆ˜์น˜๋Š” ์„œ๋น„์Šคยท์—…์ข…ยทํŠธ๋ž˜ํ”ฝ ํŠน์„ฑ์— ๋”ฐ๋ผ ํฌ๊ฒŒ ๋‹ค๋ฅด๋ฏ€๋กœ ์ž์‚ฌ ๋ฐ์ดํ„ฐ๋กœ ํ™•์ธํ•ด์•ผ ํ•˜๋ฉฐ, ์—ฌ๊ธฐ์„œ๋Š” "์„ฑ๋Šฅ ๊ฐœ์„ ์ด UXยท๋น„์ฆˆ๋‹ˆ์Šค ์ง€ํ‘œ์™€ ์ƒ๊ด€๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค"๋Š” ์›์น™๋งŒ ์ „์ œํ•œ๋‹ค.

ํ•ต์‹ฌ ์š”์•ฝ: ๋ชจ๋ฐ”์ผ์˜ ๋А๋ฆฐ CPUยท๋ถˆ์•ˆ์ • ๋„คํŠธ์›Œํฌยท๋„“์€ ๋‹จ๋ง ํŽธ์ฐจ๊ฐ€ ์ฒด๊ฐ ์„ฑ๋Šฅ์„ ์ขŒ์šฐํ•œ๋‹ค. ์„ฑ๋Šฅ์€ ์ธก์ •ํ•ด ๊ด€๋ฆฌํ•ด์•ผ ํ•  UXยท๋น„์ฆˆ๋‹ˆ์Šค ์ง€ํ‘œ๋‹ค.

2. Core Web Vitals ์ •๋ฐ€ ํ•ด๋ถ€

Core Web Vitals(CWV)๋Š” Google์ด ์ •์˜ํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ง€ํ‘œ๋กœ, ๊ฒฝํ—˜์„ ์„ธ ์ถ• โ€” ๋กœ๋”ฉ(LCP) ยท ๋ฐ˜์‘์„ฑ(INP) ยท ์‹œ๊ฐ์  ์•ˆ์ •์„ฑ(CLS) โ€” ์œผ๋กœ ๊ณ„๋Ÿ‰ํ•œ๋‹ค. ์•„๋ž˜ ํŒ์ • ์ž„๊ณ„๊ฐ’์€ Google์ด ๊ณต์‹ ๋ฌธ์„œ์—์„œ ๊ณต๊ฐœํ•œ Core Web Vitals ๊ธฐ์ค€์„ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ฅธ๋‹ค(web.dev = Google์ด ์šด์˜ํ•˜๋Š” ์›น ๊ฐœ๋ฐœ ๊ณต์‹ ๋ฌธ์„œ ์‚ฌ์ดํŠธ, ๋ฐ Chrome ๊ฐœ๋ฐœ์ž ๋ฌธ์„œ. ์›๋ฌธ ๋งํฌ๋Š” ๋ฌธ์„œ ๋ง๋ฏธ ใ€Œ์ฐธ๊ณ  ์ž๋ฃŒใ€ ์ฐธ์กฐ).

2.1 ์ง€ํ‘œ ๊ธฐ์ค€ํ‘œ (Google ๊ณต์‹ Core Web Vitals ๊ธฐ์ค€)

์ง€ํ‘œ ์ธก์ • ๋Œ€์ƒ ์ข‹์Œ(Good) ๊ฐœ์„  ํ•„์š” ๋‚˜์จ(Poor)
LCP ์ตœ๋Œ€ ์ฝ˜ํ…์ธ  ๋ Œ๋” ์‹œ์ (๋กœ๋”ฉ) โ‰ค 2.5s 2.5s ~ 4.0s > 4.0s
INP ์ธํ„ฐ๋ž™์…˜ ๋ฐ˜์‘์„ฑ โ‰ค 200ms 200ms ~ 500ms > 500ms
CLS ๋ˆ„์  ๋ ˆ์ด์•„์›ƒ ์ด๋™(์•ˆ์ •์„ฑ) โ‰ค 0.1 0.1 ~ 0.25 > 0.25

ํ•„๋“œ(ํ˜„์žฅ) ๋ฐ์ดํ„ฐ๋Š” ๋ฐฉ๋ฌธ์ž ๋ถ„ํฌ์˜ P75(์ƒ์œ„ 75ํผ์„ผํƒ€์ผ) ๊ฐ’์œผ๋กœ ํŒ์ •ํ•œ๋‹ค. "๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒช๋Š” ์ตœ์•…์— ๊ฐ€๊นŒ์šด ๊ฒฝํ—˜"์„ ๊ธฐ์ค€์„ ์œผ๋กœ ์‚ผ๊ธฐ ์œ„ํ•จ์ด๋‹ค.

2.2 LCP (Largest Contentful Paint)

์ •์˜. ๋ทฐํฌํŠธ์— ๋ณด์ด๋Š” ์š”์†Œ ์ค‘ ๊ฐ€์žฅ ํฐ ์ฝ˜ํ…์ธ  ์š”์†Œ๊ฐ€ ๋ Œ๋”๋ง๋œ ์‹œ์ . ๋ณดํ†ต ํžˆ์–ด๋กœ ์ด๋ฏธ์ง€, ํฐ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€, ํฐ ํ…์ŠคํŠธ ๋ธ”๋ก(H1ยท๋ฌธ๋‹จ)์ด LCP ์š”์†Œ๊ฐ€ ๋œ๋‹ค.

๋ฌด์—‡์ด LCP ์š”์†Œ์ธ๊ฐ€. <img>, <image>(SVG ๋‚ด), background-image๊ฐ€ ์žˆ๋Š” ๋ธ”๋ก, <video>์˜ ํฌ์Šคํ„ฐ, ํฐ ํ…์ŠคํŠธ ๋…ธ๋“œ ๋“ฑ. ๋ Œ๋” ๊ณผ์ •์—์„œ ๋” ํฐ ์š”์†Œ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด LCP ํ›„๋ณด๊ฐ€ ๊ฐฑ์‹ ๋œ๋‹ค.

ํ”ํ•œ ์ง€์—ฐ ์›์ธ(4๋Œ€ ๊ตฌ๊ฐ„).

  • ๋А๋ฆฐ ์„œ๋ฒ„ ์‘๋‹ต(TTFB) โ€” ๋ฌธ์„œ ์ž์ฒด๊ฐ€ ๋Šฆ๊ฒŒ ๋„์ฐฉ.
  • ๋ Œ๋” ์ฐจ๋‹จ ๋ฆฌ์†Œ์Šค โ€” <head>์˜ ๋™๊ธฐ CSS/JS๊ฐ€ ๋ Œ๋”๋ฅผ ๋ง‰์Œ.
  • ๋ฆฌ์†Œ์Šค ๋กœ๋“œ ์ง€์—ฐ โ€” LCP ์ด๋ฏธ์ง€๊ฐ€ ๋Šฆ๊ฒŒ ๋ฐœ๊ฒฌ๋˜๊ฑฐ๋‚˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์Œ.
  • ํด๋ผ์ด์–ธํŠธ ๋ Œ๋”๋ง(CSR) โ€” ๋นˆ HTML์„ ๋ฐ›์€ ๋’ค JS๋กœ ๊ทธ๋ฆฌ๋ฉด, JS ์‹คํ–‰์ด ๋๋‚˜์•ผ LCP๊ฐ€ ์ฐํž˜.

์ง„๋‹จ ํฌ์ธํŠธ. LCP๋ฅผ ์œ„ ๋„ค ๊ตฌ๊ฐ„(TTFB โ†’ ๋ฆฌ์†Œ์Šค ๋กœ๋“œ ์ง€์—ฐ โ†’ ๋กœ๋“œ ์‹œ๊ฐ„ โ†’ ๋ Œ๋” ์ง€์—ฐ)์œผ๋กœ ์ชผ๊ฐœ์–ด ์–ด๋А ๊ตฌ๊ฐ„์ด ํฐ์ง€ ๋ณธ๋‹ค. CSR ๊ธฐ๋ฐ˜ ํŽ˜์ด์ง€๋Š” LCP๊ฐ€ ๊ตฌ์กฐ์ ์œผ๋กœ ๋ถˆ๋ฆฌํ•˜๋‹ค.

2.3 INP (Interaction to Next Paint)

์ •์˜. ์‚ฌ์šฉ์ž์˜ ์ธํ„ฐ๋ž™์…˜(ํด๋ฆญยทํƒญยทํ‚ค ์ž…๋ ฅ)์— ๋Œ€ํ•ด ๋‹ค์Œ ํ”„๋ ˆ์ž„์ด ๊ทธ๋ ค์ง€๊ธฐ๊นŒ์ง€์˜ ์ง€์—ฐ. ํŽ˜์ด์ง€ ์ˆ˜๋ช… ๋™์•ˆ ๋ฐœ์ƒํ•œ ์ธํ„ฐ๋ž™์…˜๋“ค ์ค‘ ๋Œ€ํ‘œ๊ฐ’(๋Œ€์ฒด๋กœ ์ตœ์•…์— ๊ฐ€๊นŒ์šด ๊ฐ’)์„ ๋ณด๊ณ ํ•œ๋‹ค. INP๋Š” ๋‹ค์Œ ์„ธ ๊ตฌ๊ฐ„์˜ ํ•ฉ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

  • ์ž…๋ ฅ ์ง€์—ฐ(Input delay) โ€” ์ด๋ฒคํŠธ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๊ธฐ ์ „, ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋‹ค๋ฅธ ์ž‘์—…์— ์ ์œ ๋œ ์‹œ๊ฐ„.
  • ์ฒ˜๋ฆฌ ์‹œ๊ฐ„(Processing time) โ€” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์‹ค์ œ๋กœ ์‹คํ–‰๋˜๋Š” ์‹œ๊ฐ„.
  • ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ์ง€์—ฐ(Presentation delay) โ€” ํ•ธ๋“ค๋Ÿฌ ํ›„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ค์Œ ํ”„๋ ˆ์ž„์„ ๊ทธ๋ฆฌ๊ธฐ๊นŒ์ง€์˜ ์‹œ๊ฐ„.

์™œ FID๋ฅผ ๋Œ€์ฒดํ–ˆ๋‚˜. ๊ณผ๊ฑฐ ์ง€ํ‘œ FID(First Input Delay)๋Š” ์ฒซ ์ž…๋ ฅ์˜ ์ง€์—ฐ๋งŒ ์ธก์ •ํ•ด "์ž…๋ ฅ ์ง€์—ฐ" ํ•œ ์กฐ๊ฐ๋งŒ ๋ดค๋‹ค. INP๋Š” ๋ชจ๋“  ์ธํ„ฐ๋ž™์…˜์˜ ์ „์ฒด ์ง€์—ฐ(์ฒ˜๋ฆฌ+ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ํฌํ•จ) ์„ ๋ณด๋ฏ€๋กœ ์‹ค์ œ ๋ฐ˜์‘์„ฑ์„ ํ›จ์”ฌ ์ •ํ™•ํžˆ ๋ฐ˜์˜ํ•œ๋‹ค. INP๋Š” 2024๋…„ 3์›” CWV์˜ ๋ฐ˜์‘์„ฑ ์ง€ํ‘œ๋กœ ์ •์‹ ์ฑ„ํƒ๋˜์–ด FID๋ฅผ ๋Œ€์ฒดํ–ˆ๋‹ค.

์•…ํ™” ์›์ธ. ๊ธด ์ž‘์—…(Long Task)์œผ๋กœ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ ์œ ๋จ, ๊ณผ๋„ํ•˜๊ฑฐ๋‚˜ ๋ฌด๊ฑฐ์šด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ, ํฐ DOM ๊ฐฑ์‹ , ์„œ๋“œํŒŒํ‹ฐ ์Šคํฌ๋ฆฝํŠธ์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ๊ฒฝ์Ÿ.

2.4 CLS (Cumulative Layout Shift)

์ •์˜. ๋กœ๋”ฉยท์ธํ„ฐ๋ž™์…˜ ์ค‘ ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ์š”์†Œ๊ฐ€ ๋ฐ€๋ฆฌ๋Š” ์–‘์˜ ๋ˆ„์ ์น˜(์ด๋™ ์˜ํ–ฅ ร— ์ด๋™ ๊ฑฐ๋ฆฌ). ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ ค๋Š” ์ˆœ๊ฐ„ ๋ ˆ์ด์•„์›ƒ์ด ๋ฐ€๋ ค ์˜คํ„ฐ์น˜๊ฐ€ ๋‚˜๋Š” ๊ฒฝํ—˜์ด CLS๋กœ ๊ณ„๋Ÿ‰๋œ๋‹ค.

ํ”ํ•œ ์›์ธ.

  • ํฌ๊ธฐ ๋ฏธ์ง€์ • ์ด๋ฏธ์ง€/๋ฏธ๋””์–ด โ€” ๋กœ๋“œ ์ „ ๊ณต๊ฐ„์ด ์˜ˆ์•ฝ๋˜์ง€ ์•Š์•„ ๋กœ๋“œ ์‹œ ๋ฐ€๋ฆผ.
  • ๋™์  ์‚ฝ์ž… ์ฝ˜ํ…์ธ  โ€” ๋ฐฐ๋„ˆยท์•Œ๋ฆผยท๊ด‘๊ณ ๊ฐ€ ๊ธฐ์กด ์ฝ˜ํ…์ธ  ์œ„์— ๋ผ์–ด๋“ฆ.
  • ์›นํฐํŠธ FOIT/FOUT โ€” ํฐํŠธ ๊ต์ฒด ์‹œ ๊ธ€์ž ํฌ๊ธฐยท์ž๊ฐ„์ด ๋ฐ”๋€Œ๋ฉฐ ์žฌ๋ฐฐ์น˜.
  • ๊ด‘๊ณ ยท์ž„๋ฒ ๋“œ โ€” ํฌ๊ธฐ๊ฐ€ ๊ฐ€๋ณ€์ ์ธ ์„œ๋“œํŒŒํ‹ฐ ์‚ฝ์ž…๋ฌผ.

2.5 ๋ณด์กฐ ์ง€ํ‘œ โ€” FCPยทTTFBยทTBTยทSpeed Index

์ง€ํ‘œ ์˜๋ฏธ CWV์™€์˜ ๊ด€๊ณ„
TTFB (Time To First Byte) ์ฒซ ๋ฐ”์ดํŠธ ๋„์ฐฉ๊นŒ์ง€ LCP์˜ ํ•˜์œ„ ๊ตฌ๊ฐ„. ์„œ๋ฒ„ยท๋„คํŠธ์›Œํฌ ๋ณ‘๋ชฉ ์ง„๋‹จ
FCP (First Contentful Paint) ์ฒซ ์ฝ˜ํ…์ธ  ๋ Œ๋” LCP์˜ ์„ ํ–‰ ์ง€ํ‘œ. ๋ Œ๋” ์ฐจ๋‹จ ์ง„๋‹จ
TBT (Total Blocking Time) ๋กœ๋“œ ์ค‘ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ง‰ํžŒ ์ด ์‹œ๊ฐ„ Lab์—์„œ INP/๋ฐ˜์‘์„ฑ์˜ ํ”„๋ก์‹œ
Speed Index ํ™”๋ฉด์ด ์‹œ๊ฐ์ ์œผ๋กœ ์ฑ„์›Œ์ง€๋Š” ์†๋„ ๋กœ๋”ฉ ์ฒด๊ฐ ๋ณด์กฐ ์ง€ํ‘œ

ํ•ต์‹ฌ ์š”์•ฝ: CWV๋Š” ๋กœ๋”ฉ(LCP)ยท๋ฐ˜์‘์„ฑ(INP)ยท์•ˆ์ •์„ฑ(CLS) ์„ธ ์ถ•์ด๋ฉฐ ๊ธฐ์ค€์€ 2.5s / 200ms / 0.1. ๋ณด์กฐ ์ง€ํ‘œ(TTFBยทFCPยทTBTยทSI)๋Š” ๊ฐ CWV์˜ ์›์ธ ๊ตฌ๊ฐ„์„ ํŒŒ๊ณ ๋“ค ๋•Œ ์“ด๋‹ค.

3. Lab(ํ•ฉ์„ฑ) vs RUM(์‹ค์‚ฌ์šฉ์ž) โ€” ์ธก์ •์˜ ๋‘ ์ถ•

์„ฑ๋Šฅ ๋ฐ์ดํ„ฐ์—๋Š” ์„ฑ๊ฒฉ์ด ๋‹ค๋ฅธ ๋‘ ์ข…๋ฅ˜๊ฐ€ ์žˆ๊ณ , ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ๋ณด๋ฉด ๋ฐ˜๋“œ์‹œ ์˜คํŒํ•œ๋‹ค.

3.1 Lab(ํ•ฉ์„ฑ, Synthetic)

ํ†ต์ œ๋œ ํ™˜๊ฒฝ์—์„œ ์ž๋™ํ™” ๋„๊ตฌ๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•ด ์ธก์ •ํ•œ๋‹ค.

  • ์žฅ์ : ์žฌํ˜„์„ฑ(๊ฐ™์€ ์กฐ๊ฑด ๋ฐ˜๋ณต), ๋ฐฐํฌ ์ „ ์ธก์ • ๊ฐ€๋Šฅ, ์ƒ์„ธํ•œ ์›์ธ ๋ถ„์„(ํŠธ๋ ˆ์ด์Šค) ๊ฐ€๋Šฅ.
  • ํ•œ๊ณ„: ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ๋‹ค์–‘ํ•œ ๊ธฐ๊ธฐยท๋„คํŠธ์›Œํฌยท์ธํ„ฐ๋ž™์…˜์„ ๋‹ด์ง€ ๋ชปํ•œ๋‹ค. ํŠนํžˆ ์‹ค์ œ ์ธํ„ฐ๋ž™์…˜์ด ์—†์œผ๋ฏ€๋กœ INP๋ฅผ ์ธก์ •ํ•  ์ˆ˜ ์—†๋‹ค.

3.2 RUM(์‹ค์‚ฌ์šฉ์ž, Real User Monitoring)

์‹ค์ œ ๋ฐฉ๋ฌธ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์„ฑ๋Šฅ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•œ๋‹ค.

  • ์žฅ์ : ์ง„์งœ ์ฒด๊ฐ ์„ฑ๋Šฅ, ํ•„๋“œ ๋Œ€ํ‘œ์„ฑ(์‹ค์ œ ๊ธฐ๊ธฐยทํšŒ์„  ๋ถ„ํฌ).
  • ํ•œ๊ณ„: ๋ฐฐํฌ ํ›„์—๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์Œ“์ด๊ณ , ํ™˜๊ฒฝ ํŽธ์ฐจ๊ฐ€ ์ปค ๊ฐœ๋ณ„ ์›์ธ ๊ทœ๋ช…์ด ์–ด๋ ต๋‹ค.

3.3 ํ•ต์‹ฌ ์›๋ฆฌ โ€” INP๋Š” ์™œ Lab์—์„œ ์•ˆ ๋‚˜์˜ค๋‚˜

INP๋Š” ์‹ค์ œ ์ธํ„ฐ๋ž™์…˜์ด ์žˆ์–ด์•ผ ์ธก์ •๋œ๋‹ค. Lab์€ ์ž๋™ ๋กœ๋“œ๋งŒ ํ•˜๊ณ  ์‚ฌ๋žŒ์˜ ํด๋ฆญยท์ž…๋ ฅ์ด ์—†์œผ๋ฏ€๋กœ INP๋ฅผ ์ง์ ‘ ์ธก์ •ํ•˜์ง€ ๋ชปํ•œ๋‹ค. ๊ทธ๋ž˜์„œ:

  • Lab์—์„œ๋Š” TBT(Total Blocking Time) ๋ฅผ ๋ฐ˜์‘์„ฑ์˜ ํ”„๋ก์‹œ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. TBT๊ฐ€ ํฌ๋ฉด ์ธํ„ฐ๋ž™์…˜๋„ ๋А๋ฆด ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.
  • ์‹ค์ธก INP๋Š” RUM/ํ•„๋“œ ๋ฐ์ดํ„ฐ์—์„œ๋งŒ ์–ป๋Š”๋‹ค.

3.4 75๋ฒˆ์งธ ๋ฐฑ๋ถ„์œ„์ˆ˜(P75) โ€” ๊ณต์‹ ํ‰๊ฐ€ ๋ฐฉ๋ฒ•

Google์€ Core Web Vitals๋ฅผ ํŽ˜์ด์ง€ ๋ฐฉ๋ฌธ ๋ถ„ํฌ์˜ 75๋ฒˆ์งธ ๋ฐฑ๋ถ„์œ„์ˆ˜(75th percentile, ํ†ต์นญ P75) ๊ฐ’์—์„œ ํ‰๊ฐ€ํ•œ๋‹ค. ์ด๋Š” web.devยทChrome ๊ฐœ๋ฐœ์ž ๋ฌธ์„œ์— ๋ช…์‹œ๋œ ๊ณต์‹ ํ‰๊ฐ€ ๋ฐฉ๋ฒ•์ด๋ฉฐ, "ํ•ฉ๊ฒฉ/๋ถˆํ•ฉ๊ฒฉ" ํŒ์ •๋„ ์ด P75 ๊ฐ’ ๊ธฐ์ค€์ด๋‹ค. ํ‰๊ท ์€ ์†Œ์ˆ˜์˜ ๋น ๋ฅธ ์„ธ์…˜์— ๊ฐ€๋ ค ๋ฌธ์ œ๋ฅผ ๊ฐ์ถ”์ง€๋งŒ, 75๋ฒˆ์งธ ๋ฐฑ๋ถ„์œ„์ˆ˜๋Š” "๋ฐฉ๋ฌธ์˜ ์•ฝ 3/4๊ฐ€ ์ด ๊ฐ’๋ณด๋‹ค ์ข‹๊ฒŒ ๊ฒฝํ—˜ํ•œ๋‹ค"๋Š” ๋ณด์ˆ˜์  ๊ธฐ์ค€์„ ์„ ์ œ๊ณตํ•œ๋‹ค.

ํ•ต์‹ฌ ์š”์•ฝ: Lab์€ ๋ฐฐํฌ ์ „ ์žฌํ˜„ยท์›์ธ๋ถ„์„, RUM์€ ๋ฐฐํฌ ํ›„ ์‹ค์ฒด๊ฐ. INP ์‹ค์ธก์€ RUM์—์„œ๋งŒ ๋‚˜์˜ค๊ณ  Lab์€ TBT๋กœ ๋Œ€์‹  ๋ณธ๋‹ค. ํ•„๋“œ๋Š” P75๋กœ ํŒ์ •ํ•œ๋‹ค.

4. ์ธก์ • ๋ฐฉ๋ฒ•๋ก  โ€” ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์น˜๋ฅผ ์–ป๋Š” ๋ฒ•

์ˆ˜์น˜๋Š” ์–ด๋–ป๊ฒŒ ์ธก์ •ํ–ˆ๋А๋ƒ์— ๋”ฐ๋ผ ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง„๋‹ค. ๋ฐฉ๋ฒ•๋ก ์ด ํ”๋“ค๋ฆฌ๋ฉด ๊ฐœ์„  ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์—†๋‹ค.

4.1 ์Šค๋กœํ‹€๋ง โ€” ์กฐ๊ฑด์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋งž์ถ˜๋‹ค

  • CPU ์Šฌ๋กœ์šฐ๋‹ค์šด: ๊ฐœ๋ฐœ ๊ธฐ๊ธฐ์˜ CPU๋ฅผ ์ธ์œ„์ ์œผ๋กœ ๋А๋ฆฌ๊ฒŒ(์˜ˆ: 4ร—/6ร— ์Šฌ๋กœ์šฐ๋‹ค์šด) ์„ค์ •ํ•ด ๋ณด๊ธ‰ํ˜• ๋ชจ๋ฐ”์ผ์— ๊ทผ์ ‘์‹œํ‚จ๋‹ค.
  • ๋„คํŠธ์›Œํฌ ์กฐ๊ฑด: ๋Œ€์—ญํญยท์ง€์—ฐ์„ ์ œํ•œ(์˜ˆ: ๋А๋ฆฐ 4G ํ”„๋กœํŒŒ์ผ)ํ•ด ์‹ค์ œ ํšŒ์„ ์— ๊ทผ์ ‘์‹œํ‚จ๋‹ค.
  • ์ฃผ์˜: ์Šค๋กœํ‹€๋ง ์„ค์ •๊ณผ ์‹คํ–‰ ๊ธฐ๊ธฐ์— ๋”ฐ๋ผ Lab ๊ฐ’์€ ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง„๋‹ค. ๋”ฐ๋ผ์„œ Lab ์ˆ˜์น˜๋Š” "์ ˆ๋Œ€๊ฐ’"์ด ์•„๋‹ˆ๋ผ ๋™์ผ ์กฐ๊ฑด์—์„œ์˜ ์ƒ๋Œ€ ๋น„๊ต(๊ฐœ์„  ์ „/ํ›„) ๋กœ ํ•ด์„ํ•ด์•ผ ํ•œ๋‹ค.

4.2 First View vs Repeat View, ๊ทธ๋ฆฌ๊ณ  ์ค‘์•™๊ฐ’

  • First View(์ฒซ ๋ฐฉ๋ฌธ) ์™€ Repeat View(์žฌ๋ฐฉ๋ฌธ) ๋Š” ์บ์‹œ ์˜ํ–ฅ์œผ๋กœ ๊ฐ’์ด ๋‹ค๋ฅด๋‹ค. ๋ชฉ์ ์— ๋งž๋Š” ๊ฒƒ์„ ๋ณธ๋‹ค(์‹ ๊ทœ ์œ ์ž… ์ตœ์ ํ™”๋ฉด First View).
  • ๋‹จ์ผ ์ธก์ •์€ ๋…ธ์ด์ฆˆ๊ฐ€ ํฌ๋‹ค. ์—ฌ๋Ÿฌ ํšŒ ์ธก์ • ํ›„ ์ค‘์•™๊ฐ’(median) ์„ ์‚ฌ์šฉํ•œ๋‹ค. ํ•œ ๋ฒˆ์˜ ์ข‹์€/๋‚˜์œ ๊ฐ’์— ์†์ง€ ์•Š๊ธฐ ์œ„ํ•จ์ด๋‹ค.

4.3 ์›์ธ ๊ท€์†(attribution) โ€” DevTools Performance

๋ณ‘๋ชฉ์„ "๋А๋‚Œ"์œผ๋กœ ์ฐพ์ง€ ๋ง๊ณ  ํŠธ๋ ˆ์ด์Šค๋กœ ๊ท€์†ํ•œ๋‹ค. Chrome DevTools์˜ Performance ํŒจ๋„์ด ํ‘œ์ค€ ๋„๊ตฌ๋‹ค.

  • Bottom-Up vs Call Tree
    • Bottom-Up(self time): ๊ฐ ํ•จ์ˆ˜๊ฐ€ ์ž๊ธฐ ์ž์‹ ์—์„œ ์‹ค์ œ๋กœ ์†Œ๋น„ํ•œ CPU ์‹œ๊ฐ„. "์‹ค์ œ๋กœ ๋ฌด๊ฑฐ์šด ํ•จ์ˆ˜"๋ฅผ ์ฐพ๋Š”๋‹ค.
    • Call Tree(total time): ์ž์‹ ํ˜ธ์ถœ์„ ํฌํ•จํ•œ ์ด ์‹œ๊ฐ„. "์–ด๋А ํ˜ธ์ถœ ๊ฒฝ๋กœ๊ฐ€ ๋ฌด๊ฑฐ์šด๊ฐ€"๋ฅผ ๋ณธ๋‹ค.
    • ์‹ค๋ฌด ์ˆœ์„œ: Bottom-Up์œผ๋กœ self time์ด ํฐ ํ•ญ๋ชฉ์„ ์ฐพ๊ณ  โ†’ Call Tree๋กœ ํ˜ธ์ถœ ๋งฅ๋ฝ์„ ํ™•์ธํ•œ๋‹ค.
  • Group by ๋กœ ๋ณ‘๋ชฉ ์ฃผ์ฒด ์ขํžˆ๊ธฐ: URL / ์„œ๋“œํŒŒํ‹ฐ ์ฃผ์ฒด / ์ž‘์—… ์ข…๋ฅ˜(์Šคํฌ๋ฆฝํŒ…ยท๋ Œ๋”ยทํŽ˜์ธํŠธ) / ์นดํ…Œ๊ณ ๋ฆฌ ๋กœ ๋ฌถ์–ด, "์–ด๋А ๋„๋ฉ”์ธยท์–ด๋А ์Šคํฌ๋ฆฝํŠธยท์–ด๋–ค ์ข…๋ฅ˜์˜ ์ž‘์—…"์ด ์‹œ๊ฐ„์„ ๋จน๋Š”์ง€ ๋‹จ๊ณ„์ ์œผ๋กœ ์ขํžŒ๋‹ค.
  • ์ตœ์‹  ์–ดํŠธ๋ฆฌ๋ทฐ์…˜ ๊ธฐ๋ฒ•: Long Animation Frames API(LoAF) ์™€ web-vitals ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(v4๋Œ€)์˜ INP ์–ดํŠธ๋ฆฌ๋ทฐ์…˜ ์„ ์“ฐ๋ฉด "์–ด๋–ค ์Šคํฌ๋ฆฝํŠธ/์–ด๋–ค ์ธํ„ฐ๋ž™์…˜์ด ๋А๋ฆฐ ํ”„๋ ˆ์ž„์„ ์œ ๋ฐœํ–ˆ๋Š”๊ฐ€"๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹จ, ๋ธŒ๋ผ์šฐ์ €ยทAPI ์ง€์› ๋ฒ”์œ„์™€ ์‚ฌ์šฉ๋ฒ•์€ ์‹œ์ ์— ๋”ฐ๋ผ ๋ฐ”๋€Œ๋ฏ€๋กœ ์ตœ์‹  ๊ณต์‹ ๋ฌธ์„œ ํ™•์ธ์„ ๊ถŒ์žฅํ•œ๋‹ค.

ํ•ต์‹ฌ ์š”์•ฝ: ์Šค๋กœํ‹€๋งยทFirst/Repeatยท์ค‘์•™๊ฐ’์œผ๋กœ ์กฐ๊ฑด์„ ํ†ต์ œํ•˜๊ณ , DevTools์˜ Bottom-Up/Call Tree + Group by๋กœ ๋ณ‘๋ชฉ์„ ๊ท€์†ํ•œ๋‹ค. INP ์›์ธ์€ LoAFยทweb-vitals ์–ดํŠธ๋ฆฌ๋ทฐ์…˜์œผ๋กœ ์ขํžŒ๋‹ค(์ง€์› ๋ฒ”์œ„๋Š” ๊ณต์‹ ๋ฌธ์„œ ํ™•์ธ).

5. ๊ธฐ๋ณธ ์ตœ์ ํ™” ๊ธฐ๋ฒ•

๊ฐ ๊ธฐ๋ฒ•์„ โ‘  ๋ฌธ์ œ โ†’ โ‘ก ์›๋ฆฌ โ†’ โ‘ข ์ ์šฉ โ†’ โ‘ฃ ์ฝ”๋“œ(์•ˆํ‹ฐํŒจํ„ดโ†’๊ฐœ์„ ) โ†’ โ‘ค ๊ฒ€์ฆ ํ‹€๋กœ ์ •๋ฆฌํ•œ๋‹ค.

5.1 ๋ Œ๋”๋ง ์ง€์—ฐ โ€” content-visibility

โ‘  ๋ฌธ์ œ. ๊ธด ํŽ˜์ด์ง€์—์„œ ํ™”๋ฉด ๋ฐ–(์Šคํฌ๋กคํ•ด์•ผ ๋ณด์ด๋Š”) ์ฝ˜ํ…์ธ ๊นŒ์ง€ ์ดˆ๊ธฐ ๋ Œ๋”์— ํฌํ•จ๋˜์–ด ๋ ˆ์ด์•„์›ƒยทํŽ˜์ธํŠธ ๋น„์šฉ์ด ์ปค์ง„๋‹ค. โ‘ก ์›๋ฆฌ. content-visibility: auto ๋Š” ํ™”๋ฉด ๋ฐ– ์š”์†Œ์˜ ๋ Œ๋”๋ง(๋ ˆ์ด์•„์›ƒยทํŽ˜์ธํŠธ)์„ ํ•„์š”ํ•  ๋•Œ๊นŒ์ง€ ๊ฑด๋„ˆ๋›ด๋‹ค. ๋‹จ, ๋ Œ๋”๋ฅผ ์Šคํ‚ตํ•˜๋ฉด ํฌ๊ธฐ๋ฅผ ๋ชจ๋ฅด๊ฒŒ ๋˜์–ด ์Šคํฌ๋กค๋ฐ”๊ฐ€ ํŠ€๋ฏ€๋กœ contain-intrinsic-size ๋กœ ์˜ˆ์ƒ ํฌ๊ธฐ๋ฅผ ์•Œ๋ ค์ค˜์•ผ ํ•œ๋‹ค. โ‘ข ์ ์šฉ. ์„ธ๋กœ๋กœ ๊ธด, ๋…๋ฆฝ์ ์ธ ์„น์…˜(์นด๋“œ ๋ชฉ๋ก, ์•„ํ‹ฐํด ๋ธ”๋ก)์— ์ ์šฉ. ์ฃผ์˜: display:none ์œผ๋กœ ์ด๋ฏธ ์ˆจ๊ธด ์š”์†Œ์—” ์˜๋ฏธ๊ฐ€ ์—†๊ณ (๋ Œ๋” ๋Œ€์ƒ์ด ์•„๋‹˜), ์•ต์ปคํ˜• display:block ์„น์…˜์—์„œ ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค.

โ‘ฃ ์ฝ”๋“œ

CSS
/* ๊ฐœ์„ : ํ™”๋ฉด ๋ฐ– ์„น์…˜ ๋ Œ๋” ์Šคํ‚ต + ํฌ๊ธฐ ์˜ˆ์•ฝ */
.section {
  content-visibility: auto;
  contain-intrinsic-size: auto 600px; /* ์˜ˆ์ƒ ๋†’์ด โ€” ์Šคํฌ๋กค ์ ํ”„ ๋ฐฉ์ง€ */
}

โ‘ค ๊ฒ€์ฆ. DevTools Performance์—์„œ ์ดˆ๊ธฐ ๋ Œ๋”์˜ Layout/Paint ์‹œ๊ฐ„ ๊ฐ์†Œ๋ฅผ ํ™•์ธ. ์Šคํฌ๋กค ์‹œ ๋ ˆ์ด์•„์›ƒ ์ ํ”„(CLS)๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๋Š”์ง€ ํ•จ๊ป˜ ๋ณธ๋‹ค.

5.2 ๊ฐ•์ œ ๋ฆฌํ”Œ๋กœ์šฐ(๋ ˆ์ด์•„์›ƒ ์Šค๋ž˜์‹ฑ) ํšŒํ”ผ

โ‘  ๋ฌธ์ œ. ๋ฃจํ”„ ์•ˆ์—์„œ ์ฝ๊ธฐ(์ธก์ •)์™€ ์“ฐ๊ธฐ(์Šคํƒ€์ผ ๋ณ€๊ฒฝ)๋ฅผ ๋ฒˆ๊ฐˆ์•„ ํ•˜๋ฉด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋งค๋ฒˆ ๋ ˆ์ด์•„์›ƒ์„ ๋‹ค์‹œ ๊ณ„์‚ฐ(๊ฐ•์ œ ๋ฆฌํ”Œ๋กœ์šฐ)ํ•ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์žก์•„๋จน๋Š”๋‹ค. โ‘ก ์›๋ฆฌ. ๋ ˆ์ด์•„์›ƒ ๊ฐ’์„ ์ฝ๋Š” ์ˆœ๊ฐ„ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ตœ์‹  ๋ ˆ์ด์•„์›ƒ์„ ์ฆ‰์‹œ ๊ณ„์‚ฐํ•ด์•ผ ํ•œ๋‹ค. ์ฝ๊ธฐโ†’์“ฐ๊ธฐโ†’์ฝ๊ธฐ๊ฐ€ ์„ž์ด๋ฉด ๊ณ„์‚ฐ์ด ๋ฐ˜๋ณต๋œ๋‹ค. ์ฝ๊ธฐ๋ฅผ ๋จผ์ € ๋ชฐ์•„์„œ ํ•˜๊ณ , ์“ฐ๊ธฐ๋ฅผ ๋‚˜์ค‘์— ๋ชฐ์•„์„œ ํ•˜๋ฉด ๋ฆฌํ”Œ๋กœ์šฐ๊ฐ€ ํ•œ ๋ฒˆ์œผ๋กœ ์ค„์–ด๋“ ๋‹ค. โ‘ข ์ ์šฉ. ์ธก์ •๊ฐ’์€ ์บ์‹ฑํ•˜๊ณ , DOM ์“ฐ๊ธฐ๋Š” ๋ฐฐ์นญํ•œ๋‹ค.

โ‘ฃ ์ฝ”๋“œ

JS
// ์•ˆํ‹ฐํŒจํ„ด: ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๊ฐ€ ๊ต์ฐจ โ†’ ๋งค ๋ฐ˜๋ณต ๊ฐ•์ œ ๋ฆฌํ”Œ๋กœ์šฐ
items.forEach((el) => {
  const w = el.getBoundingClientRect().width; // ์ฝ๊ธฐ
  el.style.width = w * 1.1 + 'px';            // ์“ฐ๊ธฐ โ†’ ๋‹ค์Œ ์ฝ๊ธฐ์—์„œ ๋ฆฌํ”Œ๋กœ์šฐ
});

// ๊ฐœ์„ : ์ฝ๊ธฐ ๋ฐฐ์นญ โ†’ ์“ฐ๊ธฐ ๋ฐฐ์นญ
const widths = items.map((el) => el.getBoundingClientRect().width); // ์ฝ๊ธฐ ๋ชฐ์•„์„œ
items.forEach((el, i) => { el.style.width = widths[i] * 1.1 + 'px'; }); // ์“ฐ๊ธฐ ๋ชฐ์•„์„œ

โ‘ค ๊ฒ€์ฆ. Performance ํŠธ๋ ˆ์ด์Šค์—์„œ "Recalculate Style / Layout"์ด ๋ฐ˜๋ณต์ ์œผ๋กœ ์ฐํžˆ๋Š” ๋ณด๋ผ์ƒ‰ ๊ตฌ๊ฐ„์ด ์ค„์—ˆ๋Š”์ง€ ํ™•์ธ.

5.3 ๊ธด ์ž‘์—…(Long Task, >50ms) ๋ถ„ํ• 

โ‘  ๋ฌธ์ œ. 50ms๋ฅผ ๋„˜๋Š” ์ž‘์—…์€ ๊ทธ ๋™์•ˆ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๋…์ ํ•ด ์ธํ„ฐ๋ž™์…˜์„ ๋ง‰๋Š”๋‹ค(์ž…๋ ฅ ์ง€์—ฐ โ†’ INP ์•…ํ™”). โ‘ก ์›๋ฆฌ. ํฐ ์ž‘์—…์„ ์ž˜๊ฒŒ ์ชผ๊ฐœ ์ค‘๊ฐ„์ค‘๊ฐ„ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์–‘๋ณด(yield) ํ•˜๋ฉด, ์‚ฌ์ด์‚ฌ์ด ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด ์ฒ˜๋ฆฌ๋  ํ‹ˆ์ด ์ƒ๊ธด๋‹ค. โ‘ข ์ ์šฉ. ๋Œ€๋Ÿ‰ ๋ฐ˜๋ณตยท์ง๋ ฌ ๊ณ„์‚ฐ์„ ์ฒญํ‚นํ•˜๊ณ , ๊ธ‰ํ•˜์ง€ ์•Š์€ ์ž‘์—…์€ ์œ ํœด ์‹œ๊ฐ„์— ๋ฏธ๋ฃฌ๋‹ค.

โ‘ฃ ์ฝ”๋“œ

JS
// ๊ฐœ์„ : ์ค‘๊ฐ„์— ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์–‘๋ณด (scheduler.yield ์ง€์› ์‹œ)
async function processAll(items) {
  for (let i = 0; i < items.length; i++) {
    doHeavyWork(items[i]);
    // ์ผ์ • ์ฃผ๊ธฐ๋งˆ๋‹ค ์–‘๋ณด โ†’ ์ž…๋ ฅ ์ฒ˜๋ฆฌ ํ‹ˆ์„ ํ™•๋ณด
    if (i % 50 === 0 && 'scheduler' in window && 'yield' in scheduler) {
      await scheduler.yield();
    }
  }
}

// ๊ธ‰ํ•˜์ง€ ์•Š์€ ์ž‘์—…์€ ์œ ํœด ์‹œ๊ฐ„์—
requestIdleCallback(() => precomputeCache());

scheduler.yield() ๋Š” ๋น„๊ต์  ์ตœ์‹  API๋กœ ๋ธŒ๋ผ์šฐ์ € ์ง€์› ๋ฒ”์œ„๊ฐ€ ์ œํ•œ์ ์ผ ์ˆ˜ ์žˆ์œผ๋‹ˆ ํด๋ฐฑ(์˜ˆ: setTimeout(0)/await new Promise(r=>setTimeout(r)))๊ณผ ํ•จ๊ป˜ ์“ฐ๊ณ , ์ตœ์‹  ์ง€์› ํ˜„ํ™ฉ์€ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•œ๋‹ค.

โ‘ค ๊ฒ€์ฆ. Performance์—์„œ 50ms๋ฅผ ๋„˜๋Š” Long Task(๋นจ๊ฐ„ ์‚ผ๊ฐํ˜•)๊ฐ€ ์ค„์—ˆ๋Š”์ง€, ํ•„๋“œ INP(RUM)๊ฐ€ ๊ฐœ์„ ๋˜๋Š”์ง€ ํ™•์ธ.

5.4 ์ด๋ฒคํŠธยท์Šคํฌ๋กค ์„ฑ๋Šฅ

โ‘  ๋ฌธ์ œ. ์Šคํฌ๋กคยทํ„ฐ์น˜ยทresize ๊ฐ™์€ ๊ณ ๋นˆ๋„ ์ด๋ฒคํŠธ์—์„œ ๋ฌด๊ฑฐ์šด ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋งค ํ”„๋ ˆ์ž„ ์‹คํ–‰๋˜๋ฉด ์Šคํฌ๋กค์ด ๋Š๊ธด๋‹ค. โ‘ก ์›๋ฆฌ. passive ๋ฆฌ์Šค๋„ˆ๋กœ ์Šคํฌ๋กค ๋ธ”๋กœํ‚น์„ ์—†์• ๊ณ , ์‹œ๊ฐ ๊ฐฑ์‹ ์€ requestAnimationFrame ์— ๋งž์ถ˜๋‹ค. ๊ณ ๋นˆ๋„ ์ž…๋ ฅ์€ debounce/throttle ๋กœ ์‹คํ–‰ ๋นˆ๋„๋ฅผ ๋‚ฎ์ถ˜๋‹ค.

โ‘ฃ ์ฝ”๋“œ

JS
// ๊ฐœ์„ : passive + rAF๋กœ ์Šคํฌ๋กค ํ•ธ๋“ค๋Ÿฌ ์ตœ์ ํ™”
let ticking = false;
window.addEventListener('scroll', () => {
  if (!ticking) {
    requestAnimationFrame(() => { updateOnScroll(); ticking = false; });
    ticking = true;
  }
}, { passive: true });

โ‘ค ๊ฒ€์ฆ. ์Šคํฌ๋กค ์ค‘ Performance ํŠธ๋ ˆ์ด์Šค์—์„œ ํ”„๋ ˆ์ž„ ๋“œ๋กญ(๊ธด ํ”„๋ ˆ์ž„)์ด ์ค„๊ณ  60fps์— ๊ทผ์ ‘ํ•˜๋Š”์ง€ ํ™•์ธ.

5.5 ์ด๋ฏธ์ง€ ์ตœ์ ํ™”

โ‘  ๋ฌธ์ œ. ์ด๋ฏธ์ง€๋Š” ๋Œ€๊ฐœ ํŽ˜์ด์ง€์—์„œ ๊ฐ€์žฅ ๋ฌด๊ฑฐ์šด ๋ฆฌ์†Œ์Šค์ด์ž LCP ์š”์†Œ๋‹ค. ๋ฌด๊ฒ๊ฑฐ๋‚˜ ๋Šฆ๊ฒŒ ๋ฐœ๊ฒฌ๋˜๋ฉด LCP๊ฐ€ ๋‚˜๋น ์ง€๊ณ , ํฌ๊ธฐ ๋ฏธ์ง€์ •์ด๋ฉด CLS๋ฅผ ์œ ๋ฐœํ•œ๋‹ค. โ‘ก ์›๋ฆฌ. โ‘ด ํฌ๋งท์„ ๊ฐ€๋ณ๊ฒŒ(WebP/AVIF), โ‘ต ํ™”๋ฉด ํฌ๊ธฐ์— ๋งž๋Š” ํ•ด์ƒ๋„๋งŒ ์ „๋‹ฌ(๋ฐ˜์‘ํ˜•), โ‘ถ ํ™”๋ฉด ๋ฐ– ์ด๋ฏธ์ง€๋Š” ์ง€์—ฐ ๋กœ๋“œ, โ‘ท LCP ์ด๋ฏธ์ง€๋Š” ์ผ์ฐยท๋†’์€ ์šฐ์„ ์ˆœ์œ„๋กœ ๋กœ๋“œ. โ‘ข ์ ์šฉ.

โ‘ฃ ์ฝ”๋“œ

HTML
<!-- ์•ˆํ‹ฐํŒจํ„ด: ํฌ๊ธฐ ๋ฏธ์ง€์ • + ์›๋ณธ ๊ทธ๋Œ€๋กœ โ†’ CLS + ๊ณผ๋Œ€ ์ „์†ก -->
<img src="/hero.png" />

<!-- ๊ฐœ์„ : ํฌ๊ธฐ ์ง€์ •(CLS ๋ฐฉ์ง€) + ๋ฐ˜์‘ํ˜• + ์ง€์—ฐ/์šฐ์„ ์ˆœ์œ„ -->
<img
  src="/hero-800.avif"
  srcset="/hero-400.avif 400w, /hero-800.avif 800w, /hero-1600.avif 1600w"
  sizes="(max-width: 768px) 100vw, 800px"
  width="800" height="450"
  loading="lazy" decoding="async" alt="์„ค๋ช…" />

<!-- LCP ์ด๋ฏธ์ง€๋Š” ์ง€์—ฐ ๋กœ๋“œํ•˜์ง€ ๋ง๊ณ  preload + ๋†’์€ ์šฐ์„ ์ˆœ์œ„ -->
<link rel="preload" as="image" href="/hero-800.avif" fetchpriority="high" />

์ฃผ์˜: LCP ์ด๋ฏธ์ง€์—๋Š” loading="lazy" ๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค(๋ฐœ๊ฒฌยท๋กœ๋“œ๊ฐ€ ๋Šฆ์–ด์ ธ ์˜คํžˆ๋ ค LCP ์•…ํ™”). lazy๋Š” ํ™”๋ฉด ๋ฐ– ์ด๋ฏธ์ง€์—๋งŒ. โ‘ค ๊ฒ€์ฆ. LCP ์š”์†Œ๊ฐ€ ์ด๋ฏธ์ง€๋ฉด ๊ทธ ๋กœ๋“œ ์‹œ์ ์ด ์•ž๋‹น๊ฒจ์กŒ๋Š”์ง€, ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์ง€์ •์œผ๋กœ CLS๊ฐ€ ์‚ฌ๋ผ์กŒ๋Š”์ง€ ํ™•์ธ.

5.6 ํฐํŠธ ์ตœ์ ํ™”

โ‘  ๋ฌธ์ œ. ์›นํฐํŠธ ๋กœ๋“œ ์ค‘ ํ…์ŠคํŠธ๊ฐ€ ์•ˆ ๋ณด์ด๊ฑฐ๋‚˜(FOIT), ์‹œ์Šคํ…œ ํฐํŠธ๋กœ ๋ณด์˜€๋‹ค๊ฐ€ ๊ต์ฒด๋˜๋ฉฐ(FOUT) ๋ ˆ์ด์•„์›ƒ์ด ๋ฐ€๋ ค CLSยทFCP๊ฐ€ ๋‚˜๋น ์ง„๋‹ค. โ‘ก ์›๋ฆฌ. font-display ๋กœ ๊ต์ฒด ์ •์ฑ…์„ ์ •ํ•˜๊ณ , ํฐํŠธ๋ฅผ preload ๋กœ ์ผ์ฐ ๋ฐ›์œผ๋ฉฐ, ์‚ฌ์šฉ ๊ธ€์ž๋งŒ ์„œ๋ธŒ์…‹์œผ๋กœ ์ค„์—ฌ ์šฉ๋Ÿ‰์„ ๋‚ฎ์ถ˜๋‹ค.

โ‘ฃ ์ฝ”๋“œ

CSS
@font-face {
  font-family: 'Brand';
  src: url('/fonts/brand-subset.woff2') format('woff2');
  font-display: swap;      /* ํ…์ŠคํŠธ ์ฆ‰์‹œ ํ‘œ์‹œ ํ›„ ๊ต์ฒด (FOIT ๋ฐฉ์ง€) */
  font-weight: 400 700;    /* ๊ฐ€๋ณ€ํฐํŠธ๋ฉด ๋ฒ”์œ„ ์ง€์ • */
}
HTML
<link rel="preload" as="font" type="font/woff2" href="/fonts/brand-subset.woff2" crossorigin />

๊ต์ฒด ์‹œ CLS๋ฅผ ๋” ์ค„์ด๋ ค๋ฉด ํด๋ฐฑ ํฐํŠธ์˜ ๋ฉ”ํŠธ๋ฆญ์„ ๋งž์ถ”๋Š” ๊ธฐ๋ฒ•(์˜ˆ: size-adjust/ascent-override ๋“ฑ)์„ ํ•จ๊ป˜ ๊ฒ€ํ† ํ•œ๋‹ค. ์„ธ๋ถ€ ์ง€์›์€ ๊ณต์‹ ๋ฌธ์„œ ํ™•์ธ ๊ถŒ์žฅ. โ‘ค ๊ฒ€์ฆ. ํฐํŠธ ๊ต์ฒด ์‹œ์ ์˜ ๋ ˆ์ด์•„์›ƒ ์ด๋™(CLS)๊ณผ ํ…์ŠคํŠธ ํ‘œ์‹œ ์‹œ์ (FCP)์„ ํ™•์ธ.

5.7 ๋ฆฌ์†Œ์Šค ์ „๋‹ฌ โ€” ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…ยทํฌ๋ฆฌํ‹ฐ์ปฌ CSSยทํ”„๋ฆฌ์ปค๋„ฅํŠธ

โ‘  ๋ฌธ์ œ. ์ดˆ๊ธฐ ๋กœ๋“œ์— ๋ถˆํ•„์š”ํ•œ JS/CSS๊นŒ์ง€ ํ•จ๊ป˜ ๋ฐ›์œผ๋ฉด ๋ Œ๋”๊ฐ€ ๋Šฆ์–ด์ง„๋‹ค(๋ Œ๋” ์ฐจ๋‹จ). โ‘ก ์›๋ฆฌ. โ‘ด ์ดˆ๊ธฐ ํ™”๋ฉด์— ํ•„์š”ํ•œ ์ฝ”๋“œ๋งŒ ๋‚˜๋ˆ„์–ด ๋กœ๋“œ(์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…), โ‘ต ์ฒซ ํ™”๋ฉด์— ํ•„์š”ํ•œ CSS๋งŒ ์šฐ์„ (ํฌ๋ฆฌํ‹ฐ์ปฌ CSS), โ‘ถ ๊ณง ์—ฐ๊ฒฐํ•  ๋„๋ฉ”์ธ์€ ๋ฏธ๋ฆฌ ์ปค๋„ฅํŠธ(preconnect), ์ค‘์š”ํ•œ ๋ฆฌ์†Œ์Šค๋Š” preload, โ‘ท ๋ Œ๋” ์ฐจ๋‹จ ๋ฆฌ์†Œ์Šค ์ œ๊ฑฐ.

โ‘ฃ ์ฝ”๋“œ

HTML
<!-- ๊ณง ์“ธ ์„œ๋“œํŒŒํ‹ฐ ๋„๋ฉ”์ธ ์—ฐ๊ฒฐ ์ค€๋น„ -->
<link rel="preconnect" href="https://cdn.example.com" crossorigin />
JS
// ๊ฐœ์„ : ํ•„์š”ํ•  ๋•Œ๋งŒ ๋ฌด๊ฑฐ์šด ๋ชจ๋“ˆ ๋กœ๋“œ(์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…)
button.addEventListener('click', async () => {
  const { openEditor } = await import('./editor.js'); // ์ดˆ๊ธฐ ๋ฒˆ๋“ค์—์„œ ๋ถ„๋ฆฌ
  openEditor();
});

โ‘ค ๊ฒ€์ฆ. ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐยท๋ Œ๋” ์ฐจ๋‹จ ๋ฆฌ์†Œ์Šค ์ˆ˜ ๊ฐ์†Œ, FCP/LCP ๊ฐœ์„ ์„ ํ™•์ธ.

5.8 ์„œ๋“œํŒŒํ‹ฐ ์Šคํฌ๋ฆฝํŠธ ๊ฑฐ๋ฒ„๋„Œ์Šค (๋ถ„์„ยท๋งˆ์ผ€ํŒ… ํƒœ๊ทธ)

โ‘  ๋ฌธ์ œ. ๋ถ„์„ยท๊ด‘๊ณ ยท์ฑ—๋ด‡ ๋“ฑ ์„œ๋“œํŒŒํ‹ฐ ํƒœ๊ทธ๋Š” ๋Œ€๋ถ€๋ถ„ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋œ๋‹ค. ํƒœ๊ทธ๊ฐ€ ๋Š˜์ˆ˜๋ก ์šฐ๋ฆฌ ์ฝ”๋“œ์™€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๋†“๊ณ  ๊ฒฝ์Ÿํ•ด ์ž…๋ ฅ ์ง€์—ฐ โ†’ INP๊ฐ€ ์•…ํ™”๋œ๋‹ค. ๋˜ํ•œ ๋ Œ๋” ์ฐจ๋‹จยท์ถ”๊ฐ€ ์ปค๋„ฅ์…˜์œผ๋กœ LCP์—๋„ ์˜ํ–ฅ์„ ์ค€๋‹ค. โ‘ก ์›๋ฆฌ. โ‘ด ๋กœ๋”ฉ์„ ๋น„์ฐจ๋‹จ์œผ๋กœ(async/defer), โ‘ต ์ฆ‰์‹œ ํ•„์š” ์—†๋Š” ํƒœ๊ทธ๋Š” ์กฐ๊ฑด๋ถ€ยท์ง€์—ฐ ๋กœ๋”ฉ(๊ฐ€์‹œ์„ฑยท์ƒํ˜ธ์ž‘์šฉ ์‹œ์ ์—), โ‘ถ ํƒœ๊ทธ ๋งค๋‹ˆ์ €์˜ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์ตœ์†Œํ™”, โ‘ท ๊ฐ€๋Šฅํ•˜๋ฉด ์„œ๋ฒ„์‚ฌ์ด๋“œ ํƒœ๊น…์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ๋ถ€๋‹ด ์ด์ „, โ‘ธ ๋ฌด๊ฑฐ์šด ์„œ๋“œํŒŒํ‹ฐ JS๋Š” ์›น์›Œ์ปค๋กœ ์˜คํ”„๋กœ๋“œ(Partytown ๋“ฑ)ํ•ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋บ€๋‹ค. โ‘ข ์ ์šฉ. "์ด ํƒœ๊ทธ๊ฐ€ ์ดˆ๊ธฐ ํ™”๋ฉดยท์ฒซ ์ธํ„ฐ๋ž™์…˜์— ๊ผญ ํ•„์š”ํ•œ๊ฐ€?"๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋กœ๋“œ ์‹œ์ ์„ ๋ฏธ๋ฃฌ๋‹ค.

โ‘ฃ ์ฝ”๋“œ

HTML
<!-- ์•ˆํ‹ฐํŒจํ„ด: ๋™๊ธฐ ๋กœ๋“œ โ†’ ๋ Œ๋”ยท๋ฉ”์ธ์Šค๋ ˆ๋“œ ์ฐจ๋‹จ -->
<script src="https://third-party.example.com/tag.js"></script>

<!-- ๊ฐœ์„ : ๋น„์ฐจ๋‹จ ๋กœ๋“œ -->
<script src="https://third-party.example.com/tag.js" async></script>
JS
// ๊ฐœ์„ : ์ƒํ˜ธ์ž‘์šฉ/์œ ํœด ์‹œ์ ๊นŒ์ง€ ์ง€์—ฐ ๋กœ๋“œ
const load = () => import('./analytics.js');
if ('requestIdleCallback' in window) requestIdleCallback(load);
else window.addEventListener('load', load);

Partytownยท์„œ๋ฒ„์‚ฌ์ด๋“œ ํƒœ๊น… ๋“ฑ์€ ๊ตฌ์„ฑยทํ˜ธํ™˜์„ฑ ๊ณ ๋ ค๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ๋ชจ๋“  ํƒœ๊ทธ์— ์ ์šฉ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค. ๋„์ž… ์ „ ๋Œ€์ƒ ํƒœ๊ทธ์˜ ๋™์ž‘ยท์ง€์›์„ ๊ฒ€์ฆํ•œ๋‹ค. โ‘ค ๊ฒ€์ฆ. DevTools Performance์˜ Group by ์„œ๋“œํŒŒํ‹ฐ ์ฃผ์ฒด๋กœ ๊ฐ ํƒœ๊ทธ์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์ ์œ ๋ฅผ ์ธก์ •ํ•˜๊ณ , ๊ฐœ์„  ํ›„ TBT(Lab)ยทINP(RUM) ๋ณ€ํ™”๋ฅผ ํ™•์ธ.

5.9 ์ตœ์ ํ™” ๊ธฐ๋ฒ• ์š”์•ฝํ‘œ

๋ชฉํ‘œ ์ง€ํ‘œ ๊ธฐ๋ฒ• ํ•ต์‹ฌ ํ•œ ์ค„
LCP LCP ์ด๋ฏธ์ง€ preload + fetchpriority ๊ฐ€์žฅ ํฐ ์š”์†Œ๋ฅผ ์ผ์ฐยท์šฐ์„  ๋กœ๋“œ
LCP/FCP ๋ Œ๋” ์ฐจ๋‹จ ์ œ๊ฑฐยทํฌ๋ฆฌํ‹ฐ์ปฌ CSSยท์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… ์ดˆ๊ธฐ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€๋ณ๊ฒŒ
INP Long Task ๋ถ„ํ• ยทyield, ์„œ๋“œํŒŒํ‹ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๋น„์›Œ ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค
INP ๋ฆฌํ”Œ๋กœ์šฐ ํšŒํ”ผ(์ฝ๊ธฐ/์“ฐ๊ธฐ ๋ฐฐ์นญ) ๋ถˆํ•„์š”ํ•œ ๋ ˆ์ด์•„์›ƒ ์žฌ๊ณ„์‚ฐ ์ œ๊ฑฐ
CLS ์ด๋ฏธ์ง€ยท๋ฏธ๋””์–ด ํฌ๊ธฐ ์ง€์ •, ๊ณต๊ฐ„ ์˜ˆ์•ฝ ๋ฐ€๋ฆผ์„ ์›์ฒœ ์ฐจ๋‹จ
CLS font-displayยทํฐํŠธ preloadยท์„œ๋ธŒ์…‹ ํฐํŠธ ๊ต์ฒด๋กœ ์ธํ•œ ์žฌ๋ฐฐ์น˜ ์ตœ์†Œํ™”
๋ Œ๋” ๋น„์šฉ content-visibility + contain-intrinsic-size ํ™”๋ฉด ๋ฐ– ๋ Œ๋” ์Šคํ‚ต

ํ•ต์‹ฌ ์š”์•ฝ: ๊ธฐ๋ฒ•์€ ๊ฒฐ๊ตญ "โ‘  ์ดˆ๊ธฐ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€๋ณ๊ฒŒ(LCP) โ‘ก ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๋น„์›Œ ์ž…๋ ฅ์„ ๋ฐ›๊ฒŒ(INP) โ‘ข ๊ณต๊ฐ„์„ ๋ฏธ๋ฆฌ ์˜ˆ์•ฝํ•ด ์•ˆ ๋ฐ€๋ฆฌ๊ฒŒ(CLS)"๋กœ ์ˆ˜๋ ดํ•œ๋‹ค.

6. ํŽ˜์ด์ง€ ์ž‘์„ฑ ํ›„ ์„ฑ๋Šฅ ์ ๊ฒ€ ์›Œํฌํ”Œ๋กœ์šฐ

6.1 ๊ถŒ์žฅ ์ ˆ์ฐจ (4๋‹จ๊ณ„)

  • ๊ฐœ๊ด„ ํ™•์ธ โ€” PageSpeed Insights: ํ•œ URL์— ๋Œ€ํ•ด Lab ์ ์ˆ˜ + ํ•„๋“œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ๊ฐœ๊ด„ํ•œ๋‹ค.
  • ํ•„๋“œ ํ™•์ธ โ€” CrUX/RUM: ์‹ค์ œ ์‚ฌ์šฉ์ž ๊ธฐ์ค€ CWV, ํŠนํžˆ Lab์—์„œ ์•ˆ ๋‚˜์˜ค๋Š” INP๋ฅผ P75๋กœ ํ™•์ธํ•œ๋‹ค.
  • ์›์ธ ๊ท€์† โ€” DevTools Performance: ๋ฌธ์ œ ์ง€ํ‘œ์˜ ๋ณ‘๋ชฉ์„ Bottom-Up/Call Tree + Group by๋กœ ๊ท€์†ํ•œ๋‹ค.
  • ๊ฐœ์„  ํ›„ ์žฌ์ธก์ •: ๊ฐ€์„ค์„ ํ•˜๋‚˜์”ฉ ์ ์šฉํ•˜๊ณ  ๋™์ผ ์กฐ๊ฑด์—์„œ ์žฌ์ธก์ •ํ•ด ์ธ๊ณผ๋ฅผ ํ™•์ธํ•œ๋‹ค.

6.2 ๋„๊ตฌ ๋น„๊ตํ‘œ (๊ณต๊ฐœ ๋„๊ตฌ)

๋„๊ตฌ ์„ฑ๊ฒฉ ์ฃผ ์šฉ๋„
PageSpeed Insights Lab + ํ•„๋“œ ์š”์•ฝ ๋ฐฐํฌ URL์˜ ์ƒํƒœ ๊ฐœ๊ด„
Chrome DevTools Performance Lab / ์›์ธ ๋ถ„์„ ๋ณ‘๋ชฉ ํŠธ๋ ˆ์ด์Šคยท์›์ธ ๊ท€์†
WebPageTest Lab(๋‹ค์–‘ํ•œ ์กฐ๊ฑด) ์กฐ๊ฑด๋ณ„ ์ƒ์„ธ ์ธก์ •ยท๋น„๊ต
CrUX (Chrome UX Report) RUM(ํ•„๋“œ) ์‹ค์‚ฌ์šฉ์ž CWV(P75)
web-vitals ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ RUM(์ž์ฒด ์ˆ˜์ง‘) ์ž์‚ฌ ํŽ˜์ด์ง€์—์„œ CWVยท์–ดํŠธ๋ฆฌ๋ทฐ์…˜ ์ˆ˜์ง‘

6.3 ํŒ์ • ์›์น™

  • ํŒ์ •์€ Google ๊ณต์‹ CWV ๊ธฐ์ค€(web.devยทChrome ๋ฌธ์„œ) (2.5s / 200ms / 0.1, P75)์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • Lab ๋‹จ์ผ ์ ์ˆ˜์— ์ง‘์ฐฉํ•˜์ง€ ๋ง ๊ฒƒ. Lab ์ ์ˆ˜๋Š” ์กฐ๊ฑด์— ๋ฏผ๊ฐํ•˜๊ณ  INP๋ฅผ ๋‹ด์ง€ ๋ชปํ•œ๋‹ค. ๋ฐ˜๋“œ์‹œ ํ•„๋“œ ๋ฐ์ดํ„ฐ์™€ ๋ณ‘ํ–‰ํ•ด "์‹ค์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ๊ฐœ์„ ๋˜์—ˆ๋Š”๊ฐ€"๋กœ ์ตœ์ข… ํŒ์ •ํ•œ๋‹ค.

ํ•ต์‹ฌ ์š”์•ฝ: PSI(๊ฐœ๊ด„) โ†’ ํ•„๋“œ(INP ํฌํ•จ) โ†’ DevTools(๊ท€์†) โ†’ ์žฌ์ธก์ •. Lab ์ ์ˆ˜ ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ผ ํ•„๋“œ ๋ฐ์ดํ„ฐ๋กœ ํŒ์ •ํ•œ๋‹ค.

7. ๊ฒฐ๋ก  โ€” ์„ฑ๋Šฅ์€ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ ์‚ฌ์ดํด์ด๋‹ค

์„ฑ๋Šฅ ์ตœ์ ํ™”๋Š” "ํ•œ ๋ฒˆ ๋๋‚ด๋Š” ์ž‘์—…"์ด ์•„๋‹ˆ๋ผ ์ธก์ • โ†’ ์›์ธ ๊ท€์† โ†’ ๊ฐœ์„  โ†’ ์žฌ์ธก์ • ์„ ๋ฐ˜๋ณตํ•˜๋Š” ์ง€์†์  ํ”„๋กœ์„ธ์Šค๋‹ค. ์ฝ”๋“œยท์ฝ˜ํ…์ธ ยท์„œ๋“œํŒŒํ‹ฐ ํƒœ๊ทธ๋Š” ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉฐ ๊ณ„์† ๋Š˜๊ณ  ๋ณ€ํ•˜๋ฏ€๋กœ, ํ•œ ๋ฒˆ ์ข‹์•˜๋˜ ์ง€ํ‘œ๋„ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด ํ‡ดํ™”ํ•œ๋‹ค.

ํ•ต์‹ฌ ํƒœ๋„๋Š” ์„ธ ๊ฐ€์ง€๋‹ค. โ‘ด ๋А๋‚Œ์ด ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ๋กœ ๋งํ•œ๋‹ค(Lab+ํ•„๋“œ ๋ณ‘ํ–‰). โ‘ต ๊ฐ€์žฅ ๋ถˆ๋ฆฌํ•œ ์‚ฌ์šฉ์ž(๋А๋ฆฐ ๊ธฐ๊ธฐยทํšŒ์„ )๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์„ค๊ณ„ํ•œ๋‹ค. โ‘ถ ๊ฐœ์„ ์€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ, ์žฌ์ธก์ •์œผ๋กœ ์ธ๊ณผ๋ฅผ ํ™•์ธํ•œ๋‹ค.

์‹คํ–‰ ์ฒดํฌ๋ฆฌ์ŠคํŠธ (๋Ÿฐ์นญ ์ „)

  • LCP ์š”์†Œ๋ฅผ ์‹๋ณ„ํ•˜๊ณ , LCP ์ด๋ฏธ์ง€๋Š” preload + fetchpriority="high"(lazy ๊ธˆ์ง€).
  • ๋ชจ๋“  ์ด๋ฏธ์ง€ยท๋ฏธ๋””์–ด์— width/height(๋˜๋Š” aspect-ratio) ์ง€์ • โ†’ CLS ๋ฐฉ์ง€.
  • ์›นํฐํŠธ font-display: swap + preload + ์„œ๋ธŒ์…‹ ์ ์šฉ.
  • ์ดˆ๊ธฐ ๋ Œ๋” ์ฐจ๋‹จ JS/CSS ์ œ๊ฑฐ, ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…ยทํฌ๋ฆฌํ‹ฐ์ปฌ CSS ์ ์šฉ.
  • Long Task(>50ms) ํ™•์ธยท๋ถ„ํ• , ๊ณ ๋นˆ๋„ ์ด๋ฒคํŠธ passive+rAF+throttle.
  • ์„œ๋“œํŒŒํ‹ฐ ํƒœ๊ทธ ๋ชฉ๋กํ™” โ†’ ๋น„์ฐจ๋‹จ/์ง€์—ฐ/์กฐ๊ฑด๋ถ€ ๋กœ๋”ฉ, ๋ถˆํ•„์š” ํƒœ๊ทธ ์ œ๊ฑฐ.
  • content-visibility๋กœ ๊ธด ํŽ˜์ด์ง€์˜ ํ™”๋ฉด ๋ฐ– ๋ Œ๋” ๋น„์šฉ ์ ˆ๊ฐ(display:none ์š”์†Œ ์ œ์™ธ).
  • PSI๋กœ ๊ฐœ๊ด„ โ†’ ํ•„๋“œ(CrUX/RUM)์—์„œ INP ํฌํ•จ P75 ํ™•์ธ โ†’ DevTools๋กœ ๊ท€์† โ†’ ์žฌ์ธก์ •.
  • ํŒ์ •์€ Google ๊ณต์‹ ๊ธฐ์ค€(2.5s / 200ms / 0.1, P75)์œผ๋กœ, Lab+ํ•„๋“œ ๋ณ‘ํ–‰.

์ฐธ๊ณ  ์ž๋ฃŒ (๊ณต์‹ยท๊ณต๊ฐœ ๋ฌธ์„œ)

๋ณธ๋ฌธ์˜ ๋ชจ๋“  ์ž„๊ณ„๊ฐ’ยท์ •์˜๋Š” ์•„๋ž˜ โ‘  Core Web Vitals ๊ณต์‹ ๊ธฐ์ค€(Google) ์„ 1์ฐจ ์›์ถœ์ฒ˜๋กœ ์‚ผ๋Š”๋‹ค. web.dev๋Š” Google์ด ์šด์˜ํ•˜๋Š” ์›น ๊ฐœ๋ฐœ ๊ณต์‹ ๋ฌธ์„œ ์‚ฌ์ดํŠธ์ด๋ฉฐ, developer.chrome.com์€ Chrome ๊ฐœ๋ฐœ์ž ๊ณต์‹ ๋ฌธ์„œ๋‹ค. ์•„๋ž˜ ๋งํฌ๋Š” ์ž‘์„ฑ ์‹œ์  ์ ‘๊ทผ ๊ฐ€๋Šฅ(200 ์‘๋‹ต) ํ™•์ธ.

โ‘  Core Web Vitals ๊ณต์‹ ๊ธฐ์ค€ โ€” Google (1์ฐจ ์›์ถœ์ฒ˜)
Core Web Vitals ๊ฐœ์š”ยท์ž„๊ณ„๊ฐ’web.dev/articles/vitalsLCP(์ •์˜ยท๊ธฐ์ค€)web.dev/articles/lcpINP(์ •์˜ยท๊ธฐ์ค€)web.dev/articles/inpCLS(์ •์˜ยท๊ธฐ์ค€)web.dev/articles/clsTTFBweb.dev/articles/ttfb
โ‘ก ์ตœ์ ํ™” ๊ฐ€์ด๋“œ โ€” Google
LCP ์ตœ์ ํ™”web.dev/articles/optimize-lcpINP ์ตœ์ ํ™”web.dev/articles/optimize-inpLong Animation Frames(LoAF)developer.chrome.com/docs/web-platform/long-animation-frames
โ‘ข ์ธก์ •ยท์ง„๋‹จ ๋„๊ตฌ
PageSpeed Insights(Lab+ํ•„๋“œ)pagespeed.web.dev/Chrome DevTools Performance(Labยท์›์ธ ๋ถ„์„)developer.chrome.com/docs/devtools/performanceChrome UX Report / CrUX(ํ•„๋“œ ๋ฐ์ดํ„ฐ)developer.chrome.com/docs/cruxweb-vitals ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(ํ•„๋“œ CWVยท์–ดํŠธ๋ฆฌ๋ทฐ์…˜ ์ˆ˜์ง‘, Google Chrome)github.com/GoogleChrome/web-vitalsWebPageTest(Lab ์ธก์ •, ์„œ๋“œํŒŒํ‹ฐ ๊ณต๊ฐœ ๋„๊ตฌ)www.webpagetest.org/

๋„๊ตฌ์˜ UIยทAPIยท๋ธŒ๋ผ์šฐ์ € ์ง€์› ๋ฒ”์œ„๋Š” ์‹œ์ ์— ๋”ฐ๋ผ ๋ฐ”๋€Œ๋ฏ€๋กœ, ์„ธ๋ถ€ ์‚ฌ์šฉ๋ฒ•ยท์ง€์› ํ˜„ํ™ฉ์€ ๊ฐ ์ตœ์‹  ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•œ๋‹ค. ๋ณธ๋ฌธ์—์„œ ์ˆ˜์น˜๋ฅผ ์˜ˆ๋กœ ๋“  ์Šค๋กœํ‹€๋ง ๋ฐฐ์œจ(์˜ˆ: 4ร—/6ร—)ยท๋„คํŠธ์›Œํฌ ํ”„๋กœํŒŒ์ผ ๋“ฑ์€ ํ™˜๊ฒฝ ์˜ˆ์‹œ์ด๋ฉฐ ์ ˆ๋Œ€ ๊ธฐ์ค€์ด ์•„๋‹ˆ๋‹ค.

๊ธ€์“ด์ด

PIVOT CREATIVE AXLAB

PrevFigma MCP ๊ธฐ๋ฐ˜ ๋””์ž์ธ ์—”์ง€๋‹ˆ์–ด๋ง โ€” ์„ค๊ณ„ ๋ฐ์ดํ„ฐ๋กœ ์—ฌ๋Š” ๋””์ž์ธ-ํˆฌ-์ฝ”๋“œNextํ”„๋ก ํŠธ์—”๋“œ AI ๋ฐ”์ด๋ธŒ ์ฝ”๋”ฉ ๊ฐ€์ด๋“œ
๋ชฉ๋ก์œผ๋กœ

Make Project

ํ”„๋กœ์ ํŠธ๊ฐ€์žˆ์œผ์‹ ๊ฐ€์š”?

์œ ์—ฐํ•œ ํฌ๋ฆฌ์—์ดํ‹ฐ๋ธŒ๋กœ ํ•ต์‹ฌ์„ ํ–ฅํ•ด ๋‹ค๊ฐ€๊ฐ‘๋‹ˆ๋‹ค.
๋” ๋‚˜์€ UI/UX, ๋” ๋‚˜์€ ์•„์ด๋ดํ‹ฐํ‹ฐ,
๋” ๋‚˜์€ ๊ฐ€์น˜๋ฅผ ํ–ฅํ•ด ๋‚˜์•„๊ฐ‘๋‹ˆ๋‹ค.

Company Info
  • Location

    ์„œ์šธํŠน๋ณ„์‹œ ๊ฐ•๋‚จ๊ตฌ ๋…ผํ˜„๋กœ75๊ธธ 5-2, HR๋นŒ๋”ฉ 4F

  • Work Inquiries

    welcome@pivot-inc.com
  • Phone

    02-6447-6700

Make Project

ํ”„๋กœ์ ํŠธ๊ฐ€
์žˆ์œผ์‹ ๊ฐ€์š”?

์œ ์—ฐํ•œ ํฌ๋ฆฌ์—์ดํ‹ฐ๋ธŒ๋กœ ํ•ต์‹ฌ์„ ํ–ฅํ•ด ๋‹ค๊ฐ€๊ฐ‘๋‹ˆ๋‹ค.
๋” ๋‚˜์€ UI/UX, ๋” ๋‚˜์€ ์•„์ด๋ดํ‹ฐํ‹ฐ, ๋” ๋‚˜์€ ๊ฐ€์น˜๋ฅผ ํ–ฅํ•ด ๋‚˜์•„๊ฐ‘๋‹ˆ๋‹ค.

Company Info
  • Location

    ์„œ์šธํŠน๋ณ„์‹œ ๊ฐ•๋‚จ๊ตฌ ๋…ผํ˜„๋กœ75๊ธธ 5-2, HR๋นŒ๋”ฉ 4F

  • Work Inquiries

    welcome@pivot-inc.com
  • Phone

    02-6447-6700
About UsยทLabsยทProjectsยทContactPIVOT GEO

Your Creative Partner. AI-Native Digital Agency.

ยฉ 2026 PIVOT CREATIVE. All rights reserved.