Published:

Last Updated:

๋ธ”๋กœ๊ทธ CLS ์„ฑ๋Šฅ ์ตœ์ ํ™”: ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋กœ ์˜ค๋ฅ˜ ํ™•์ธ๋ถ€ํ„ฐ ๊ฐ„๋‹จํ•œ ์ˆ˜์ • ๋ฐฉ๋ฒ•๊นŒ์ง€ ์™„๋ฒฝ ๊ฐ€์ด๋“œ

CLS(Cumulative Layout Shift, ๋ˆ„์  ๋ ˆ์ด์•„์›ƒ ์ด๋™)๋Š” ์›น ์„ฑ๋Šฅ ์ง€ํ‘œ ์ค‘ SEO์— ๊ฒฐ์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ํ‹ฐ์Šคํ† ๋ฆฌ ๋ธ”๋กœ๊ทธ๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ์›น์‚ฌ์ดํŠธ ์šด์˜์ž๊ฐ€ ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ(Chrome DevTools)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CLS ์˜ค๋ฅ˜๋ฅผ ์ง์ ‘ ์ธก์ •ํ•˜๊ณ , min-height, CSS contain ์†์„ฑ, ์Šค์ผˆ๋ ˆํ†ค UI ๋“ฑ์˜ ์‹ค์ „ ์ฝ”๋“œ๋ฅผ ์ ์šฉํ•ด ๋ธ”๋กœ๊ทธ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.


์›น์‚ฌ์ดํŠธ์˜ ์„ฑ๋Šฅ, ์†๋„, ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์€ SEO(๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”)์˜ ํ•ต์‹ฌ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ๊ทธ์ค‘์—์„œ๋„ CLS(Cumulative Layout Shift, ๋ˆ„์  ๋ ˆ์ด์•„์›ƒ ์ด๋™)๋Š” ๊ฒ€์ƒ‰์—”์ง„์ด ์ค‘์š”ํ•˜๊ฒŒ ํ‰๊ฐ€ํ•˜๋Š” ์›น ์„ฑ๋Šฅ ์ง€ํ‘œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ํ‹ฐ์Šคํ† ๋ฆฌ ๋ธ”๋กœ๊ทธ๋Š” ๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ ํ”Œ๋žซํผ๊ณผ ๋‹ฌ๋ฆฌ, ์šด์˜์ž๊ฐ€ ์ž์‹ ์˜ ์ทจํ–ฅ์— ๋”ฐ๋ผ ๋ธ”๋กœ๊ทธ ๋””์ž์ธ์„ ์ž์œ ๋กญ๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ ํ‹ฐ์Šคํ† ๋ฆฌ๋งŒ์˜ ๊ฐ€์žฅ ํฐ ์žฅ์  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์•Œ๊ณ  ๊ณ„์…จ๋‚˜์š”?
์ด ์žฅ์ ์ด ์ž˜๋ชป ์‚ฌ์šฉ๋˜๋ฉด ๋‹จ์ ์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„์š”.

๋ฌดํ„ฑ๋Œ€๊ณ  ๋ธ”๋กœ๊ทธ ์Šคํ‚จ์„ ์ˆ˜์ •ํ•˜๋‹ค ๋ณด๋ฉด, ๋ธ”๋กœ๊ทธ ์„ฑ๋Šฅ ์ง€์ˆ˜์— ์•…์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์‹ค์ˆ˜๋ฅผ ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๋””์ž์ธ๊ณผ ์ ‘๊ทผ์„ฑ๋„ ๋ฌผ๋ก  ์ค‘์š”ํ•˜์ง€๋งŒ, ์›น ์„ฑ๋Šฅ ์ง€์ˆ˜(CLS ๋“ฑ)์— ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๋Š” ๋ฒ”์œ„ ๋‚ด์—์„œ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์Šคํ‚จ ์ˆ˜์ •์„ ๊ณ„ํšํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์•„๋ž˜์— ์†Œ๊ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ๋ธ”๋กœ๊ทธ์— ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”์ง€ ๋ฐ˜๋“œ์‹œ ์ ๊ฒ€ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋กœ CLS ์ธก์ •ํ•˜๊ณ  ๋ธ”๋กœ๊ทธ ๋ ˆ์ด์•„์›ƒ ์˜ค๋ฅ˜ ์ง์ ‘ ๊ณ ์น˜๋Š” ๋ฐฉ๋ฒ•

๊ทธ์ค‘์—์„œ๋„ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ ๊ฒ€ ํ•ญ๋ชฉ์ด ๋ฐ”๋กœ CLS์ž…๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์„ฑ๋Šฅ ๋ฌธ์ œ๋Š” ๋ธ”๋กœ๊ทธ ์ž์ฒด์˜ ์„œ๋ฒ„ ํ™˜๊ฒฝ๊ณผ ๊ด€๋ จ์ด ์žˆ์–ด ์ˆ˜์ •์ด ์–ด๋ ต์ง€๋งŒ, CLS๋Š” ์šด์˜์ž์˜ ์Šคํ‚จ ์ˆ˜์ •์—์„œ ๋น„๋กฏ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์ด๊ธฐ ๋•Œ๋ฌธ์— ์Šค์Šค๋กœ ๊ฐœ์„ ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

CLS(Cumulative Layout Shift)๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

CLS๋Š” ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์ค‘ ์‹œ๊ฐ์ ์ธ ์š”์†Œ๊ฐ€ ์˜ˆ๊ณ  ์—†์ด ์ด๋™ํ•˜๋Š” ํ˜„์ƒ์„ ์ˆ˜์น˜ํ™”ํ•œ ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ด‘๊ณ ๋‚˜ ์ด๋ฏธ์ง€๊ฐ€ ๋Šฆ๊ฒŒ ๋กœ๋”ฉ๋˜๋ฉด์„œ ์ฃผ๋ณ€ ํ…์ŠคํŠธ๊ฐ€ ๋ฐ€๋ ค๋‚˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์—ฌ๊ธฐ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. CLS๊ฐ€ ๋†’์„์ˆ˜๋ก ์‚ฌ์šฉ์ž๋Š” ๋ถˆํŽธํ•จ์„ ๋А๋ผ๊ณ , ๊ฒ€์ƒ‰ ์ˆœ์œ„์—๋„ ๋ถ€์ •์  ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CLS์˜ ๊ฐœ๋…๊ณผ ์ธก์ • ๊ธฐ์ค€์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ ์ด ๊ธ€(๋ผ์ดํŠธํ•˜์šฐ์Šค (Lighthouse) ๋ž€ ๋ฌด์—‡์ธ๊ฐ€?)์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•œ ๋ธ”๋กœ๊ทธ CLS ์˜ค๋ฅ˜ ํ™•์ธ ๋‹จ๊ณ„

๋ธ”๋กœ๊ทธ ์‚ฌ์ดํŠธ์˜ ์„ฑ๋Šฅ ๊ฒ€์‚ฌ๋Š” ์ตœ๊ทผ ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €(Chrome)์—์„œ ๊ธฐ๋Šฅ์ด ๋งŽ์ด ๊ฐœ์„ ๋˜์–ด, ๋ˆ„๊ตฌ๋‚˜ ์‰ฝ๊ฒŒ ์ธก์ •ํ•˜๊ณ  ๋ฌธ์ œ์ ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๋ฐฉ๋ฒ•๋„ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํŠน๋ณ„ํ•œ ๊ธฐ์ˆ  ์ง€์‹์ด ์—†์–ด๋„ ์ž์‹ ์˜ ์›น์‚ฌ์ดํŠธ๋‚˜ ๋ธ”๋กœ๊ทธ ์„ฑ๋Šฅ์„ ์ง์ ‘ ์ ๊ฒ€ํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์ธก์ •ํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋ ค๋Š” ๋ธ”๋กœ๊ทธ์™€ ์‚ฌ์ดํŠธ๋ฅผ ํฌ๋กฌ์œผ๋กœ ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.

1. ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ ์—ด๊ธฐ

  • ๋ธ”๋กœ๊ทธ ํŽ˜์ด์ง€์—์„œ F12 ํ‚ค ๋˜๋Š” ์šฐํด๋ฆญ, ๊ฒ€์‚ฌ ์„ ํƒ
  • ๋˜๋Š” Ctrl + Shift + I (Mac์€ Cmd + Option + I)

2. "์„ฑ๋Šฅ(Performance)" ํƒญ ์ด๋™ ๋ฐ ์ธก์ •

  • ์ƒ๋‹จ์˜ Performance ํƒญ ํด๋ฆญ
  • ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜๊ณ  ๋ช‡ ์ดˆ๊ฐ„ ๋กœ๋”ฉ ๊ณผ์ •์„ ๊ธฐ๋ก
  • ์™„๋ฃŒ ํ›„ Experience ์˜์—ญ์—์„œ Layout Shift ๋ฐœ์ƒ ์—ฌ๋ถ€ ํ™•์ธ
๋ธ”๋กœ๊ทธ ์ตœ์ ํ™” CLS๋ฐ ์„ฑ๋Šฅ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•ด ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ ์‚ฌ์šฉ
๋จผ์ €, ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋ ค๋Š” ๋ธ”๋กœ๊ทธ ๋˜๋Š” ์›น์‚ฌ์ดํŠธ์— ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €(Chrome)๋กœ ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.

3. Lighthouse๋กœ ์ž๋™ ๋ถ„์„ ๋ฐ ์ ์ˆ˜ ํ™•์ธ

  • Lighthouse ํƒญ์œผ๋กœ ์ด๋™ํ•˜์—ฌ Generate Report๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • Cumulative Layout Shift ํ•ญ๋ชฉ์˜ ์ ์ˆ˜์™€ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์š”์†Œ๋“ค์„ ์‹œ์Šคํ…œ์ ์œผ๋กœ ํ™•์ธํ•˜์—ฌ ๊ฐœ์„  ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CLS ๋ฐœ์ƒ ์›์ธ ๋ถ„์„ ๋ฐ ๋ฌธ์ œ ์ฝ”๋“œ ํ™•์ธ

์ด ๊ณผ์ •์„ ํ†ตํ•ด CLS(Cumulative Layout Shift)๋ฅผ ๋น„๋กฏํ•œ ๋‹ค์–‘ํ•œ ์›น ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•˜๊ณ , ๋ธ”๋กœ๊ทธ์˜ ๊ตฌ์กฐ์  ๋ฌธ์ œ๋‚˜ ๋กœ๋”ฉ ์ง€์—ฐ ๋“ฑ์˜ ์›์ธ์„ ์ฒด๊ณ„์ ์œผ๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ: ์•„๋ž˜๋Š” CLS ๋ฌธ์ œ ๋ฐœ์ƒ ์ง€์ˆ˜ 0.001๋กœ ํ™•์ธ๋œ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. ํ•˜๋‹จ์˜ Layout ํƒญ์„ ํ™•์ธํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” HTML/CSS ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ธ”๋กœ๊ทธ ์‚ฌ์ดํŠธ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ตœ์ ํ™” ์„ฑ๋Šฅ์˜ ๋ฌธ์ œ์  ํŒŒ์•…
๋ธ”๋กœ๊ทธ ์„ฑ๋Šฅ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํ™•์ธ

์ฃผ์š” CLS ๋ฐœ์ƒ ์›์ธ

  • ๋™์  ์ฝ˜ํ…์ธ ์˜ ๋†’์ด ๋ถˆํ™•์‹ค์„ฑ: ๋Œ“๊ธ€ ์˜์—ญ, ์œ„์ ฏ, ์ถ”์ฒœ ํฌ์ŠคํŠธ ๋“ฑ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‚ฝ์ž…๋˜๋Š” ์˜์—ญ์ด ์ดˆ๊ธฐ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜์ง€ ๋ชปํ•ด ์ฃผ๋ณ€ ์š”์†Œ๋ฅผ ๋ฐ€์–ด๋‚ด๋Š” ๊ฒฝ์šฐ.
  • ์ง€์—ฐ ๋กœ๋”ฉ๋œ ์ด๋ฏธ์ง€, ๊ด‘๊ณ , iframe ๋“ฑ: Lazy loading ๋˜๊ฑฐ๋‚˜ JS๋กœ ์‚ฝ์ž…๋œ ๊ด‘๊ณ ๊ฐ€ ๋‚˜์ค‘์— ๋‚˜ํƒ€๋‚˜๋ฉฐ ๋ ˆ์ด์•„์›ƒ ์ด๋™์„ ์œ ๋ฐœ. Google AdSense ๊ด‘๊ณ ๋‚˜ YouTube iframe ์‚ฝ์ž… ์‹œ ํ”ํ•˜๊ฒŒ ๋ฐœ์ƒ.
  • ๊ณ ์ •๋˜์ง€ ์•Š์€ ๋น„์œจ/aspect-ratio ์„ค์ • ๋ˆ„๋ฝ: ์ด๋ฏธ์ง€๋‚˜ ๋น„๋””์˜ค ์š”์†Œ์— ๋„ˆ๋น„/๋†’์ด ์†์„ฑ์ด ์—†์–ด ๋กœ๋”ฉ ํ›„ ์‹ค์ œ ํฌ๊ธฐ๋กœ ํ™•์žฅ๋˜๋ฉฐ ์ฃผ๋ณ€ ๊ตฌ์กฐ๋ฅผ ๋ฐ€์–ด๋ƒ„.
  • ์›น ํฐํŠธ ์ง€์—ฐ ๋กœ๋”ฉ: FOUT(Flash of Unstyled Text) ํ˜„์ƒ ๋ฐœ์ƒ ์‹œ, ์ดˆ๊ธฐ ๋ Œ๋”๋ง ํ›„ ํฐํŠธ ํฌ๊ธฐ ๋ณ€ํ™”๋กœ ์ธํ•ด ํ…์ŠคํŠธ ์˜์—ญ์˜ ์ด๋™ ๋ฐœ์ƒ.

๋ธ”๋กœ๊ทธ ์ตœ์ ํ™” CLS ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ์‹ค์ „ 4๊ฐ€์ง€ ๋ฐฉ๋ฒ•

์›น ํŽ˜์ด์ง€์—์„œ ๋ฐœ์ƒํ•˜๋Š” CLS(Cumulative Layout Shift, ๋ˆ„์  ๋ ˆ์ด์•„์›ƒ ์ด๋™) ๋ฌธ์ œ๋Š” ๋Œ€๋ถ€๋ถ„ ๋™์  ์ฝ˜ํ…์ธ ์˜ ๋†’์ด ๋ถˆํ™•์‹ค์„ฑ์ด๋‚˜ ์ง€์—ฐ ๋กœ๋”ฉ๋œ ์š”์†Œ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์‹ค์ œ ๋ธ”๋กœ๊ทธ๋‚˜ ์›น์‚ฌ์ดํŠธ์—์„œ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” 4๊ฐ€์ง€ ์‹ค์ „ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋ธ”๋กœ๊ทธ ์„ฑ๋Šฅ ์ง€ํ‘œ๊ฐ€ ์ •์ƒ์  ์ˆ˜์ •๋ฌ๋Š”์ง€ ํ™•์ธ
๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•œ ๋’ค์—๋Š”, ๋ณ€๊ฒฝ๋œ ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ํ•œ ๋ฒˆ ํ…Œ์ŠคํŠธํ•˜์—ฌ CLS๋ฅผ ํฌํ•จํ•œ ์„ฑ๋Šฅ ์ง€ํ‘œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๊ฐœ์„ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ.

1. ์ตœ์†Œ ๋†’์ด ํ™•๋ณด (min-height ์†์„ฑ ์‚ฌ์šฉ)

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ์‹์ด๋ฉฐ, min-height ์†์„ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๋™์  ์ฝ˜ํ…์ธ ๊ฐ€ ๋กœ๋”ฉ๋˜๊ธฐ ์ „์— ์˜ˆ์ƒ ๊ณต๊ฐ„์„ ๋ฏธ๋ฆฌ ํ™•๋ณดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ˜ํ…์ธ ๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ ์ฃผ๋ณ€ ์š”์†Œ๊ฐ€ ๋ฐ€๋ฆฌ๋Š” ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. height: auto์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ˜์‘ํ˜• ๊ตฌ์กฐ์—๋„ ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

.๋™์ -์˜์—ญ {
 height: auto !important;
 min-height: 200px !important; /* ์˜ˆ์ƒ๋˜๋Š” ์ตœ์†Œ ๋†’์ด๋ฅผ ๋ฏธ๋ฆฌ ํ™•๋ณด */
}

2. CSS Containment ์‚ฌ์šฉ (layout paint style)

CSS์˜ contain ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ์˜์—ญ์„ ๋ธŒ๋ผ์šฐ์ €์— ๋…๋ฆฝ์ ์ธ ๋ Œ๋”๋ง ๋‹จ์œ„๋กœ ์ธ์‹์‹œ์ผœ, ๋‚ด๋ถ€ ์ฝ˜ํ…์ธ  ๋ณ€ํ™”๊ฐ€ ์ฃผ๋ณ€ ๋ ˆ์ด์•„์›ƒ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋™์  ๋ฐ์ดํ„ฐ๋‚˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ์˜์—ญ์—์„œ ์œ ์šฉํ•˜๋ฉฐ, ์„ฑ๋Šฅ ํ–ฅ์ƒ์—๋„ ๋„์›€์„ ์ค๋‹ˆ๋‹ค.

.๋™์ -์˜์—ญ {
 contain: layout paint style; /* ๋ ˆ์ด์•„์›ƒ, ํŽ˜์ธํŠธ, ์Šคํƒ€์ผ ๋ณ€ํ™”๋ฅผ ์˜์—ญ ๋‚ด๋กœ ์ œํ•œ */
 height: auto;
 min-height: 0;
}
  • ํšจ๊ณผ: ์ด ์˜์—ญ์€ ๋…๋ฆฝ์ ์ด๋ผ๊ณ  ๋ธŒ๋ผ์šฐ์ €์— ์•Œ๋ ค์คŒ์œผ๋กœ์จ ๋‚ด๋ถ€ ๋ณ€ํ™”๊ฐ€ ์ฃผ๋ณ€ ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ๋œ ๋ฏธ์น˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

3. ์Šค์ผˆ๋ ˆํ†ค UI ์ ์šฉ (UX ๊ฐœ์„  ๋ฐ ๊ณต๊ฐ„ ํ™•๋ณด)

๋กœ๋”ฉ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ฝ˜ํ…์ธ ๊ฐ€ ์žˆ๋‹ค๋ฉด, ์Šค์ผˆ๋ ˆํ†ค(Skeleton) UI๋ฅผ ๋จผ์ € ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ์ž์˜ ์‹œ๊ฐ์  ํ˜ผ๋ž€์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ๊ณต๊ฐ„ ํ™•๋ณด์™€ ํ•จ๊ป˜ ์˜ˆ์ƒ ๋ ˆ์ด์•„์›ƒ์„ ๋ฏธ๋ฆฌ ๋ณด์—ฌ์คŒ์œผ๋กœ์จ ์ฒด๊ฐ CLS๋ฅผ ์ค„์ด๋Š” ํšจ๊ณผ๋„ ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค.

div class="๋™์ -์˜์—ญ"
 !-- ๋กœ๋”ฉ ์ค‘ --
 div class="skeleton" style="height: 200px; background: #eee;"/div
 !-- ์‹ค์ œ ์ฝ˜ํ…์ธ  --
/div
  • ์žฅ์ : ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ˆ์ƒ ๊ณต๊ฐ„์„ ๋จผ์ € ๋ณด์—ฌ์ฃผ์–ด ์‹œ๊ฐ์  ์•ˆ์ •๊ฐ์„ ์ œ๊ณตํ•˜๋ฉฐ ์ฒด๊ฐ๋˜๋Š” CLS ํ˜„์ƒ์„ ํฌ๊ฒŒ ์ค„์—ฌ์ค๋‹ˆ๋‹ค.

4. JavaScript๋กœ ๋†’์ด ๋ฏธ๋ฆฌ ์„ค์ • (์ •๊ตํ•œ ์ปจํŠธ๋กค)

JS๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ˜ํ…์ธ  ๋กœ๋“œ ์ด์ „์— ์ž„์‹œ ๋†’์ด(minHeight)๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋ ˆ์ด์•„์›ƒ ์ด๋™์„ ๋ฐฉ์ง€ํ•˜๊ณ , ์ฝ˜ํ…์ธ  ๋กœ๋”ฉ ํ›„์—๋Š” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ minHeight๋ฅผ ํ•ด์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์  ์ฝ˜ํ…์ธ ๊ฐ€ ์–ธ์ œ ๋กœ๋“œ๋˜๋Š”์ง€ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ์„ ๋•Œ ์œ ์šฉํ•œ ๊ณ ๊ธ‰ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.

const dynamicElement = document.querySelector('.๋™์ -์˜์—ญ');
dynamicElement.style.minHeight = '200px';

setTimeout(() = {
 dynamicElement.style.minHeight = 'auto'; // ๋กœ๋”ฉ ์™„๋ฃŒ ํ›„ ๋†’์ด ์ œ์•ฝ ํ•ด์ œ
}, 10);

CLS ์ตœ์ ํ™” ์ตœ์ข… ์ •๋ฆฌ ๋ฐ ๊ถŒ์žฅ ์ „๋žต ํ…Œ์ด๋ธ”

CLS๋Š” "์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๊ณต๊ฐ„ ํ™•๋ณด"๊ฐ€ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. ์•„๋ฌด๋ฆฌ ํ™”๋ คํ•œ ๋ธ”๋กœ๊ทธ ๋””์ž์ธ์ด๋ผ๋„, ์ฝ˜ํ…์ธ ๊ฐ€ ๋ฐ€๋ฆฌ๋Š” ํ˜„์ƒ์ด ์žˆ๋‹ค๋ฉด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์€ ๋ง๊ฐ€์ง‘๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์‹œ์ž‘์€ .๋™์ -์˜์—ญ์— min-height๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ์ด๋ฉฐ, !important๋Š” ๊ฐ€๋Šฅํ•œ ๋งˆ์ง€๋ง‰ ์ˆ˜๋‹จ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

CLS ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ถŒ์žฅ ์ „๋žต
์ „๋žต ์„ค๋ช…
min-height ์„ค์ • ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๊ณต๊ฐ„ ํ™•๋ณด (๊ฐ€์žฅ ์‰ฌ์šด ํ•ด๊ฒฐ์ฑ…)
contain ์†์„ฑ ์‚ฌ์šฉ ๋ ˆ์ด์•„์›ƒ ๊ฐ„์„ญ ์ฐจ๋‹จ ๋ฐ ๋ Œ๋”๋ง ์ตœ์ ํ™”
aspect-ratio ํ™œ์šฉ ์ด๋ฏธ์ง€/๊ด‘๊ณ ์˜ ๋น„์œจ์„ CSS๋กœ ๊ณ ์ •
์Šค์ผˆ๋ ˆํ†ค UI ๋„์ž… ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์•ˆ์ •๊ฐ ์ฆ๊ฐ€ ๋ฐ ๋กœ๋”ฉ ์‹œ ๊ณต๊ฐ„ ํ™•๋ณด
JS ์‚ฌ์ „ ๋†’์ด ๊ณ„์‚ฐ ์ •๊ตํ•œ ๋™์  ๋ ˆ์ด์•„์›ƒ ์ปจํŠธ๋กค ๊ฐ€๋Šฅ (๊ณ ๊ธ‰)

Q1. CLS๋ž€ ๋ฌด์—‡์ด๋ฉฐ ์™œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜๊ณผ SEO์— ์ค‘์š”ํ•œ๊ฐ€์š”?

A1. CLS๋Š” ํŽ˜์ด์ง€ ๋‚ด ์‹œ๊ฐ์  ์š”์†Œ๊ฐ€ ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ์›€์ง์ด๋Š” ํ˜„์ƒ(์˜ˆ: ๊ด‘๊ณ ๊ฐ€ ๋Šฆ๊ฒŒ ๋กœ๋”ฉ๋˜์–ด ํ…์ŠคํŠธ๊ฐ€ ๋ฐ€๋ฆฌ๋Š” ๊ฒƒ)์„ ์ธก์ •ํ•˜๋Š” ์›น ์„ฑ๋Šฅ ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค. CLS ์ ์ˆ˜๊ฐ€ ๋†’์œผ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์›์น˜ ์•Š๋Š” ํด๋ฆญ์„ ํ•˜๊ฑฐ๋‚˜ ์ •๋ณด๋ฅผ ์žƒ๊ฒŒ ๋˜์–ด ๋ถˆํŽธํ•จ์„ ๋А๋ผ๊ณ , ์ด๋Š” ์ดํƒˆ๋ฅ  ์ฆ๊ฐ€๋กœ ์ด์–ด์ ธ ๊ตฌ๊ธ€ SEO(Core Web Vitals) ์ ์ˆ˜์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

Q2. ํ‹ฐ์Šคํ† ๋ฆฌ ๋ธ”๋กœ๊ทธ์—์„œ CLS ๋ฌธ์ œ๊ฐ€ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๊ทผ๋ณธ์ ์ธ ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

A2. ํ‹ฐ์Šคํ† ๋ฆฌ๋Š” ์Šคํ‚จ HTML/CSS ์ˆ˜์ •์ด ์ž์œ ๋กญ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— ์šด์˜์ž๊ฐ€ ์ด๋ฏธ์ง€๋‚˜ ๊ด‘๊ณ , ์™ธ๋ถ€ ์œ„์ ฏ(๋Œ“๊ธ€, ์ถ”์ฒœ ํฌ์ŠคํŠธ) ๋“ฑ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ํ•ด๋‹น ์š”์†Œ์˜ ๋†’์ด(height)๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด, ์ง€์—ฐ ๋กœ๋”ฉ๋˜๋ฉด์„œ ์ฃผ๋ณ€ ๋ ˆ์ด์•„์›ƒ์„ ๋ฐ€์–ด๋‚ด CLS๊ฐ€ ๋†’์•„์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

Q3. CLS ๋ฌธ์ œ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด CSS์—์„œ ์–ด๋–ค ์†์„ฑ์„ ์šฐ์„ ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋‚˜์š”?

A3. CLS ํ•ด๊ฒฐ์˜ ํ•ต์‹ฌ์€ '๊ณต๊ฐ„ ํ™•๋ณด'์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ์†์„ฑ์€ ๋กœ๋”ฉ ์ „ ์˜ˆ์ƒ ๋†’์ด๋ฅผ ์ง€์ •ํ•˜๋Š” min-height์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ, ํ•ด๋‹น ์š”์†Œ์˜ ๋‚ด๋ถ€ ๋ณ€ํ™”๊ฐ€ ์™ธ๋ถ€ ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก ๊ฒฉ๋ฆฌํ•˜๋Š” CSS contain: layout ์†์„ฑ์ด๋‚˜, ์ด๋ฏธ์ง€/๋น„๋””์˜ค์˜ ๋น„์œจ์„ ๊ณ ์ •ํ•˜๋Š” aspect-ratio ์†์„ฑ์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.


์ถ”๊ฐ€ ์ฐธ๊ณ  ์ž๋ฃŒ ๋ฐ ํŒ