nextjs,tailwindcss,vercel

Address the Layout Shift Issues ν•΄κ²°, νŽ˜μ΄μ§€ μ„±λŠ₯κ³Ό SEO κ°œμ„ 

주영 🐱 2025. 2. 20. 16:28
728x90
λ°˜μ‘ν˜•

λ ˆμ΄μ•„μ›ƒ μ‹œν”„νŠΈ 문제 ν•΄κ²°ν•˜κΈ°: μ‚¬μš©μž κ²½ν—˜κ³Ό SEO κ°œμ„ 

λ ˆμ΄μ•„μ›ƒ μ‹œν”„νŠΈλŠ” μ‚¬μš©μž κ²½ν—˜κ³Ό SEO μ„±λŠ₯에 큰 영ν–₯을 λ―ΈμΉ©λ‹ˆλ‹€. μ΄λŸ¬ν•œ λ¬Έμ œκ°€ λ°œμƒν•˜λŠ” 원인과 효과적인 ν•΄κ²° 방법을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

λ ˆμ΄μ•„μ›ƒ μ‹œν”„νŠΈ μ΄ν•΄ν•˜κΈ°

λ ˆμ΄μ•„μ›ƒ μ‹œν”„νŠΈλŠ” νŽ˜μ΄μ§€ λ‘œλ”© κ³Όμ •μ—μ„œ μš”μ†Œλ“€μ΄ 예기치 μ•Šκ²Œ μ΄λ™ν•˜λŠ” ν˜„μƒμž…λ‹ˆλ‹€. λˆ„μ  λ ˆμ΄μ•„μ›ƒ μ‹œν”„νŠΈ(CLS) μ§€ν‘œλŠ” μ΄λŸ¬ν•œ μ‹œκ°μ  λΆˆμ•ˆμ •μ„±μ„ μΈ‘μ •ν•˜λ©°, Google은 졜적의 μ‚¬μš©μž κ²½ν—˜μ„ μœ„ν•΄ 0.1 미만의 점수λ₯Ό ꢌμž₯ν•©λ‹ˆλ‹€.

λ ˆμ΄μ•„μ›ƒ μ‹œν”„νŠΈκ°€ λ°œμƒν•˜λŠ” 일반적인 상황:

  • 크기가 μ •μ˜λ˜μ§€ μ•Šμ€ 이미지 λ‘œλ”©
  • 늦게 λ‘œλ“œλ˜λŠ” μ›Ή 폰트둜 μΈν•œ ν…μŠ€νŠΈ 재배치
  • 동적 μ½˜ν…μΈ  μ‚½μž… (κ΄‘κ³ , νŒμ—… λ“±)
  • μ„œλ“œνŒŒν‹° λ¦¬μ†ŒμŠ€κ°€ νŽ˜μ΄μ§€ λ ˆμ΄μ•„μ›ƒμ— 영ν–₯을 λ―ΈμΉ˜λŠ” 경우

μ£Όμš” ν•΄κ²° 방법

1. 이미지 μ΅œμ ν™”

 
<!-- μž˜λͺ»λœ μ˜ˆμ‹œ -->
<img src="hero.jpg" alt="νžˆμ–΄λ‘œ μ΄λ―Έμ§€">

<!-- μ˜¬λ°”λ₯Έ μ˜ˆμ‹œ -->
<img src="hero.jpg" width="800" height="400" alt="νžˆμ–΄λ‘œ μ΄λ―Έμ§€">
 
 

이미지가 λ‘œλ“œλ˜κΈ° 전에 곡간을 ν™•λ³΄ν•˜κΈ° μœ„ν•΄ 항상 이미지 크기λ₯Ό μ§€μ •ν•˜μ„Έμš”. μ΅œμ‹  λΈŒλΌμš°μ €λŠ” μ’…νš‘λΉ„λ₯Ό μ‘΄μ€‘ν•˜λ―€λ‘œ, CSSλ₯Ό μ‚¬μš©ν•˜μ—¬ 곡간을 μœ μ§€ν•˜λ©΄μ„œ 이미지λ₯Ό λ°˜μ‘ν˜•μœΌλ‘œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€:

 
img { max-width: 100%; height: auto; aspect-ratio: attr(width) / attr(height); }

2. 폰트 λ‘œλ”© μ „λž΅

 
<link rel="preload" href="fonts/custom-font.woff2" as="font" type="font/woff2" crossorigin>

폰트 λ‘œλ”© μ΅œμ ν™” 방법:

  • λΆ€λ“œλŸ¬μš΄ ν…μŠ€νŠΈ λ Œλ”λ§μ„ μœ„ν•΄ font-display: swap μ‚¬μš©
  • μ€‘μš” 폰트 미리 λ‘œλ“œ
  • 초기 λ Œλ”λ§μ— μ‹œμŠ€ν…œ 폰트 μ‚¬μš© κ³ λ €
  • μ„œλΉ„μŠ€ μ›Œμ»€λ₯Ό μ‚¬μš©ν•œ 효과적인 폰트 캐싱

3. μ½˜ν…μΈ  곡간 관리

 
 
.ad-container {
  min-height: 250px;
  width: 100%;
}

동적 μ½˜ν…μΈ λ₯Ό μœ„ν•œ 팁:

  • μ΅œμ†Œ 크기둜 곡간 확보
  • μŠ€μΌˆλ ˆν†€ λ‘œλ”© μƒνƒœ κ΅¬ν˜„
  • λ ˆμ΄μ•„μ›ƒ 변경을 λ°œμƒμ‹œν‚€λŠ” 속성 λŒ€μ‹  CSS λ³€ν™˜ μ‚¬μš©

4. placeholder(ν”Œλ ˆμ΄μŠ€ν™€λ”) κ΅¬ν˜„

 
 
function ArticleCard({ loading }) {
  if (loading) {
    return (
      <div className="article-skeleton">
        <div className="title-placeholder"></div>
        <div className="content-placeholder"></div>
      </div>
    );
  }
  
  return <Article />;
}

μ„±λŠ₯ μΈ‘μ •

CLS 점수 λͺ¨λ‹ˆν„°λ§ 도ꡬ:

  • Chrome DevTools μ„±λŠ₯ νŒ¨λ„
  • Lighthouse 감사
  • Chrome μ‚¬μš©μž κ²½ν—˜ λ³΄κ³ μ„œμ˜ μ‹€μ œ 데이터
  • Web Vitals JavaScript 라이브러리

μ˜ˆμ‹œ

  1. 예츑 λ‘œλ”©
 
// μ€‘μš” λ¦¬μ†ŒμŠ€ λ―Έλ¦¬ λ‘œλ“œ
document.head.innerHTML += `
  <link rel="preload" href="critical-image.jpg" as="image">
  <link rel="preload" href="main-font.woff2" as="font" type="font/woff2" crossorigin>
`;
  1. μ½˜ν…μΈ  μš°μ„ μˆœμœ„ν™”
 
 
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
  /* μ€‘μš” CSS μΈλΌμΈ */
  .hero { min-height: 500px; }
</style>
 
  1. λ°˜μ‘ν˜• 곡간 관리
.dynamic-content {
  contain: layout size;
  content-visibility: auto;
}

SEO에 λ―ΈμΉ˜λŠ” 영ν–₯

λ ˆμ΄μ•„μ›ƒ μ•ˆμ •μ„± κ°œμ„ μ€ λ‹€μŒκ³Ό 같은 이점을 μ œκ³΅ν•©λ‹ˆλ‹€:

  • Core Web Vitals 점수 ν–₯상
  • νŽ˜μ΄μ§€ λž­ν‚Ή μƒμŠΉ
  • μ‚¬μš©μž 참여도 증가
  • μ΄νƒˆλ₯  κ°μ†Œ
  • μ „ν™˜μœ¨ κ°œμ„ 

λ ˆμ΄μ•„μ›ƒ μ‹œν”„νŠΈλŠ” λ‹¨μˆœν•œ μ§€ν‘œκ°€ μ•„λ‹Œ μ‚¬μš©μžκ°€ μ½˜ν…μΈ μ™€ μƒν˜Έμž‘μš©ν•˜λŠ” 방식에 직접적인 영ν–₯을 λ―ΈμΉ©λ‹ˆλ‹€. μ•ˆμ •μ μΈ λ ˆμ΄μ•„μ›ƒμ€ μ‹ λ’°λ₯Ό κ΅¬μΆ•ν•˜κ³  μ‚¬μš©μžκ°€ μ½˜ν…μΈ μ— λΆˆνŽΈν•¨ 없이 μ°Έμ—¬ν•  수 μžˆλ„λ‘ 보μž₯ν•©λ‹ˆλ‹€.

μ΄λŸ¬ν•œ μ†”λ£¨μ…˜μ„ κ΅¬ν˜„ν•œ 후에도 CLS 점수λ₯Ό μ§€μ†μ μœΌλ‘œ λͺ¨λ‹ˆν„°λ§ν•˜μ„Έμš”. μƒˆλ‘œμš΄ μ½˜ν…μΈ λ‚˜ κΈ°λŠ₯이 예기치 μ•Šμ€ μ‹œν”„νŠΈλ₯Ό λ°œμƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μ–‘ν•œ λ””λ°”μ΄μŠ€μ™€ μ—°κ²° μ†λ„μ—μ„œμ˜ 정기적인 감사와 ν…ŒμŠ€νŠΈλŠ” 졜적의 μ„±λŠ₯을 μœ μ§€ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€.

λ ˆμ΄μ•„μ›ƒ μ‹œν”„νŠΈλ₯Ό μ²΄κ³„μ μœΌλ‘œ ν•΄κ²°ν•¨μœΌλ‘œμ¨ 기술적 μ§€ν‘œλ₯Ό κ°œμ„ ν•  뿐만 μ•„λ‹ˆλΌ, 더 전문적이고 μ‹ λ’°ν•  수 있으며 μ‚¬μš©μž μΉœν™”μ μΈ μ›Ή κ²½ν—˜μ„ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ 관행은 μΌνšŒμ„± μˆ˜μ •μ΄ μ•„λ‹Œ 정기적인 개발 μ›Œν¬ν”Œλ‘œμš°μ˜ 일뢀가 λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. μ›Ή 기술이 λ°œμ „ν•¨μ— 따라 λ ˆμ΄μ•„μ›ƒ μ•ˆμ •μ„±μ— λŒ€ν•œ λͺ¨λ²” 사둀λ₯Ό μ§€μ†μ μœΌλ‘œ μ—…λ°μ΄νŠΈν•˜λŠ” 것이 κ³ ν’ˆμ§ˆ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μœ μ§€ν•˜λŠ” 데 μ€‘μš”ν•©λ‹ˆλ‹€.

 
 
λ°˜μ‘ν˜•