μš”μ•½

  • SSR?
    • 각 νŽ˜μ΄μ§€ μš”μ²­λ§ˆλ‹€ μ„œλ²„μ—μ„œ HTML을 μƒμ„±ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ— μ „μ†‘ν•˜λŠ” λ Œλ”λ§ 방식
  • μž₯점
    • SEO μ΅œμ ν™”
    • λΉ λ₯Έ 초기 λ‘œλ”© 속도
  • 단점
    • μ„œλ²„ λΆ€ν•˜ 증가
    • ν˜ΈμŠ€νŒ… λΉ„μš© μƒμŠΉ
    • 개발 λ³΅μž‘μ„± 증가
    • μˆ˜ν™”(Hydration) κ³Όμ •μ—μ„œ β€œμ£½μ€ μ‹œκ°„β€ 1 λ°œμƒ κ°€λŠ₯
  • SEOκ°€ μ€‘μš”ν•œ 퍼블릭 μ›Ήμ‚¬μ΄νŠΈμ— μ ν•©ν•œ 방식

μ„œλ²„ μΈ‘ λ Œλ”λ§(SSR)μ΄λž€?

Server-Side Rendering
각 νŽ˜μ΄μ§€ μš”μ²­λ§ˆλ‹€ μ„œλ²„μ—μ„œ HTML을 생성, ν΄λΌμ΄μ–ΈνŠΈμ— μ „μ†‘ν•˜λŠ” λ Œλ”λ§ 방식

SSR 단계

  1. μ‚¬μš©μžκ°€ μ›ΉνŽ˜μ΄μ§€μ— μ ‘κ·Ό
  2. μ„œλ²„λŠ” μ™„μ „νžˆ λ Œλ”λ§λœ HTML νŽ˜μ΄μ§€λ₯Ό 생성, ν΄λΌμ΄μ–ΈνŠΈμ— 전솑
  3. ν΄λΌμ΄μ–ΈνŠΈμ˜ JavaScriptκ°€ ν•΄λ‹Ή νŽ˜μ΄μ§€λ₯Ό μΈν„°λž™ν‹°λΈŒν•˜κ²Œ λ§Œλ“œλŠ” μˆ˜ν™”(Hydration) κ³Όμ •

μˆ˜ν™”(Hydration) κ³Όμ •

μ„œλ²„μ—μ„œ λ Œλ”λ§λœ 정적 HTML에 JavaScript 이벀트 ν•Έλ“€λŸ¬μ™€ μƒνƒœ 관리λ₯Ό μ—°κ²°ν•˜μ—¬ Interactiveν•˜κ²Œ λ§Œλ“œλŠ” κ³Όμ •

Hydration κ³Όμ •μ˜ 단계

  1. μ„œλ²„ λ Œλ”λ§
    • μ„œλ²„μ—μ„œ μ™„μ „νžˆ λ Œλ”λ§λœ HTML을 ν΄λΌμ΄μ–ΈνŠΈμ— 전솑
  2. JavaScript λ‘œλ”©
    • ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ JavaScript λ²ˆλ“€μ„ λ‹€μš΄λ‘œλ“œν•˜κ³  μ‹€ν–‰
  3. DOM μ—°κ²°
    • κΈ°μ‘΄ DOM μš”μ†Œμ— 이벀트 ν•Έλ“€λŸ¬μ™€ μƒνƒœλ₯Ό μ—°κ²°
  4. μƒνƒœ 볡원
    • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μƒνƒœλ₯Ό ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ 볡원
  5. Interactive μ™„λ£Œ
    • μ‚¬μš©μžκ°€ νŽ˜μ΄μ§€μ™€ μ™„μ „νžˆ μƒν˜Έμž‘μš©ν•  수 μžˆλŠ” μƒνƒœ 도달

TTI (Time-to-Interactive)

μ‚¬μš©μžκ°€ νŽ˜μ΄μ§€λ₯Ό 보기 μ‹œμž‘ν•˜λŠ” μ‹œμ κ³Ό μ‹€μ œλ‘œ μƒν˜Έμž‘μš©ν•  수 μžˆλŠ” μ‹œμ  μ‚¬μ΄μ˜ μ‹œκ°„

  • SSRμ—μ„œλŠ” μˆ˜ν™” κ³Όμ •μœΌλ‘œ μΈν•˜μ—¬ 이 μ‹œκ°„μ΄ κΈΈμ–΄μ§ˆ 수 있음
  • 3.8초 μ΄ν•˜λ‘œ μœ μ§€ν•˜λŠ” 것이 ꢌμž₯됨 2

SSR의 μž₯점

1. SEO μ΅œμ ν™”

검색 엔진이 μ™„μ „νžˆ λ Œλ”λ§λœ νŽ˜μ΄μ§€λ₯Ό μˆ˜μ‹ , μ½˜ν…μΈ λ₯Ό μ‰½κ²Œ 색인화할 수 있음

  • Google
    • JavaScript μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 효과적으둜 λ Œλ”λ§ν•˜κ³  인덱싱할 수 μžˆμ§€λ§Œ, λ Œλ”λ§ 큐 λŒ€κΈ° μ‹œκ°„ 쑴재
    • 15MB 크둀링 μ œν•œ 적용, λŒ€μš©λŸ‰ JavaScript λ²ˆλ“€μ€ μ™„μ „νžˆ μ²˜λ¦¬λ˜μ§€ μ•Šμ„ 수 있음
  • Bing
    • 뢀뢄적 JavaScript 지원
  • Yandex
    • μ œν•œμ  지원

SSR의 SEO 이점 :

  • μ¦‰μ‹œ 크둀링 κ°€λŠ₯ν•œ HTML 제곡
  • 메타 νƒœκ·Έμ™€ κ΅¬μ‘°ν™”λœ λ°μ΄ν„°μ˜ ν™•μ‹€ν•œ 전달
  • μ†Œμ…œ λ―Έλ””μ–΄ 곡유 μ‹œ, μ •ν™•ν•œ 프리뷰 제곡

2. μ„±λŠ₯

SSR은 초기 μ½˜ν…μΈ λ₯Ό μ„œλ²„μ—μ„œ μ „μ†‘ν•˜λ―€λ‘œ, μ›Ή μ‚¬μ΄νŠΈμ˜ λ‘œλ”© 속도가 빨라짐

2.1. 초기 λ‘œλ”© μ„±λŠ₯

  • λΉ λ₯Έ 첫 ν™”λ©΄ ν‘œμ‹œ
    • μ„œλ²„μ—μ„œ μ™„μ „ν•œ HTML을 전솑, μ¦‰μ‹œ μ½˜ν…μΈ  확인 κ°€λŠ₯
    • μ΄λŠ” 더 쒋은 μ‚¬μš©μž κ²½ν—˜μ„ 제곡 β†’ μ΄νƒˆλ₯  κ°μ†Œ
  • λ„€νŠΈμ›Œν¬ μ΅œμ ν™”
    • 초기 JavaScript λ‹€μš΄λ‘œλ“œ 없이도 μ½˜ν…μΈ  ν‘œμ‹œ
  • 저사양 λ””λ°”μ΄μŠ€ 지원
    • ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ λ Œλ”λ§ λΆ€λ‹΄ κ°μ†Œ

2.2. Core Web Vitals

SSR은 Google의 Core Web Vitals μ§€ν‘œμ—μ„œ μš°μˆ˜ν•œ μ„±λŠ₯을 λ³΄μž„

  • LCP (Largest Contentful Paint): 2.5초 μ΄ν•˜ 달성 용이
  • INP (Interaction to Next Paint): 200ms μ΄ν•˜ λͺ©ν‘œ 달성
  • CLS (Cumulative Layout Shift): 0.1 μ΄ν•˜ μœ μ§€ κ°€λŠ₯

3. κ΄‘κ³  μ„œλΉ„μŠ€ ν˜Έν™˜μ„±

  • Google AdSense
    • AdSenseλŠ” 크둀러λ₯Ό μ‚¬μš©, μ‚¬μ΄νŠΈμ˜ μ½˜ν…μΈ λ₯Ό 읽고 κ΄€λ ¨ κ΄‘κ³ λ₯Ό μ œκ³΅ν•˜λŠ” μ‹œμŠ€ν…œ
    • SSR을 μ‚¬μš©ν•˜λ©΄, ν¬λ‘€λŸ¬κ°€ μ‚¬μ΄νŠΈμ˜ λͺ¨λ“  컨텐츠λ₯Ό 읽고 μ‚¬μš©μžμ—κ²Œ 더 κ΄€λ ¨μ„± 높은 κ΄‘κ³  제곡 κ°€λŠ₯ β†’ 클릭λ₯ κ³Ό κ΄‘κ³  수읡의 μ¦κ°€λ‘œ μ΄μ–΄μ§ˆ 수 있음

SSR의 단점

1. μ„œλ²„ λΆ€ν•˜ 및 λΉ„μš©

  • 높은 CPU/λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰
    • λ§€ μš”μ²­λ§ˆλ‹€ μ„œλ²„μ—μ„œ λ Œλ”λ§ μˆ˜ν–‰
  • ν˜ΈμŠ€νŒ… λΉ„μš© 증가
    • μ„œλ²„ λ¦¬μ†ŒμŠ€ μš”κ΅¬λŸ‰ μ¦κ°€λ‘œ μΈν•œ μš΄μ˜λΉ„ μƒμŠΉ
  • ν™•μž₯μ„± μ œμ•½
    • 높은 νŠΈλž˜ν”½ μƒν™©μ—μ„œ μ„œλ²„ ν™•μž₯의 어렀움

2. 개발 λ³΅μž‘μ„±

  • μ„œλ²„/ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œ 동기화
    • μ–‘μͺ½ ν™˜κ²½μ—μ„œ λ™μž‘ν•˜λŠ” μ½”λ“œ μž‘μ„± ν•„μš”
  • μƒνƒœ 관리 λ³΅μž‘μ„±
    • μ„œλ²„ μƒνƒœμ™€ ν΄λΌμ΄μ–ΈνŠΈ μƒνƒœμ˜ μΌμΉ˜μ„± μœ μ§€
  • 디버깅 어렀움
    • μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ ν™˜κ²½μ˜ 차이둜 μΈν•œ 문제 ν•΄κ²° 볡작

3. UX 이슈

  • μΈν„°λž™μ…˜ μ§€μ—°
  • β€œμ£½μ€ μ‹œκ°„β€
    • νŽ˜μ΄μ§€κ°€ λ³΄μ΄μ§€λ§Œ ν΄λ¦­μ΄λ‚˜ μž…λ ₯이 λ°˜μ‘ν•˜μ§€ μ•ŠλŠ” ꡬ간 쑴재
  • 뢈일치 였λ₯˜
    • μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ λ Œλ”λ§ κ²°κ³Όκ°€ λ‹€λ₯Ό 경우 λ°œμƒν•˜λŠ” hydration mismatch

SSR이 μ ν•©ν•œ 경우

  • SEOκ°€ μ€‘μš”ν•œ μ‚¬μ΄νŠΈ
    • λΈ”λ‘œκ·Έ, λ‰΄μŠ€ μ‚¬μ΄νŠΈ, μ œν’ˆ νŽ˜μ΄μ§€, λ§ˆμΌ€νŒ… λžœλ”©νŽ˜μ΄μ§€
  • 초기 λ‘œλ”© 속도 μš°μ„ 
    • μ‚¬μš©μž μœ μž…μ΄ μ€‘μš”ν•œ 퍼블릭 μ›Ήμ‚¬μ΄νŠΈ
  • λ‹€μ–‘ν•œ λ””λ°”μ΄μŠ€ 지원
    • 저사양 λ””λ°”μ΄μŠ€λ‚˜ 느린 λ„€νŠΈμ›Œν¬ ν™˜κ²½ κ³ λ € ν•„μš”
  • μ†Œμ…œ λ―Έλ””μ–΄ 곡유
    • μ •ν™•ν•œ 메타데이터와 프리뷰가 μ€‘μš”ν•œ μ½˜ν…μΈ 

μ΅œμ ν™” μ „λž΅

1. μ„±λŠ₯ μ΅œμ ν™”

  • μ½”λ“œ μŠ€ν”Œλ¦¬νŒ…
    • ν•„μš”ν•œ μ½”λ“œλ§Œ λ‘œλ“œν•˜μ—¬ λ²ˆλ“€ 크기 μ΅œμ†Œν™”
  • 캐싱 μ „λž΅
    • μ„œλ²„ λ Œλ”λ§ κ²°κ³Όλ₯Ό 적절히 μΊμ‹œν•˜μ—¬ λΆ€ν•˜ κ°μ†Œ
  • CDN ν™œμš©
    • 정적 μžμ‚°μ„ CDN으둜 λΆ„μ‚° 처리

2. 개발 μ΅œμ ν™”

  • λ™ν˜•(Isomorphic) μ½”λ“œ
    • μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ λ™μΌν•˜κ²Œ μž‘λ™ν•˜λŠ” μ½”λ“œ μž‘μ„±
  • ν™˜κ²½ 뢄리
    • μ„œλ²„ μ „μš© μ½”λ“œμ™€ ν΄λΌμ΄μ–ΈνŠΈ μ „μš© μ½”λ“œμ˜ λͺ…ν™•ν•œ ꡬ뢄
  • ν…ŒμŠ€νŠΈ μ „λž΅
    • μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ ν™˜κ²½ λͺ¨λ‘μ—μ„œμ˜ ν…ŒμŠ€νŠΈ μˆ˜ν–‰

Footnotes

  1. μ‚¬μš©μžκ°€ νŽ˜μ΄μ§€λ₯Ό λ³Ό μˆ˜λŠ” μžˆμ§€λ§Œ μƒν˜Έμž‘μš©ν•  수 μ—†λŠ” μ‹œκ°„ ↩

  2. Lighthouseμ—μ„œ TTI 점수λ₯Ό κ²°μ •ν•˜λŠ” 방법 ↩