๐Ÿ’ป ๊ฐœ๋ฐœ์ž ๋„๊ตฌ ์ดํ•ด์™€ ๋Œ€์—ญํญ ์ตœ์ ํ™” - Ddingsroom ํ”„๋กœ์ ํŠธ์—์„œ์˜ ๋ถ„์„

Yujin Jungยท2025๋…„ 11์›” 5์ผ

์›น ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ณ  ๋„คํŠธ์›Œํฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๋Š” ๊ฐ€์žฅ ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•์€ โ€˜๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ(DevTools)โ€™๋ฅผ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ œ๊ฐ€ ์ง์ ‘ ์šด์˜ ์ค‘์ธ ์Šคํ„ฐ๋””๋ฃธ ์˜ˆ์•ฝ ์„œ๋น„์Šค โ€˜Ddingsroomโ€™์„ ์˜ˆ์‹œ๋กœ, ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ Network / Performance / Lighthouse ํŒจ๋„์„ ์ค‘์‹ฌ์œผ๋กœ ์‹ค์ œ ๋กœ๋”ฉ ๊ณผ์ •์—์„œ์˜ ๋ณ‘๋ชฉ ์ง€์ ์„ ์ฐพ๊ณ , ํฐํŠธ ๋ฐ ์ด๋ฏธ์ง€ ์ตœ์ ํ™”๋กœ ๋Œ€์—ญํญ์„ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


1๏ธโƒฃ Network ํŒจ๋„ ์ดํ•ดํ•˜๊ธฐ (Ddingsroom ๋กœ๋”ฉ ๊ตฌ์กฐ ๋ถ„์„)

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

Ddingsroom์€ Next.js ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด,์ดˆ๊ธฐ ๋ Œ๋”๋ง ์‹œ HTML โ†’ CSS โ†’ JS โ†’ API โ†’ ์ด๋ฏธ์ง€ ์ˆœ์œผ๋กœ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์š”์ฒญ๋ฉ๋‹ˆ๋‹ค.


์ฃผ์š” ํ•ญ๋ชฉ

  • Name: ์š”์ฒญ๋œ ํŒŒ์ผ ์ด๋ฆ„ (์˜ˆ: index.html, main.js)
  • Status: HTTP ์‘๋‹ต ์ฝ”๋“œ (200, 404, 304 ๋“ฑ)
  • Type: ๋ฆฌ์†Œ์Šค ํƒ€์ž… (document, script, stylesheet, image ๋“ฑ)
  • Initiator: ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ํ•ด๋‹น ์š”์ฒญ์„ ์œ ๋ฐœํ–ˆ๋Š”์ง€ (์˜ˆ: JS, CSS import)
  • Size: ๋‹ค์šด๋กœ๋“œ๋œ ์‹ค์ œ ๋ฐ”์ดํŠธ ํฌ๊ธฐ (์••์ถ• ์ „/ํ›„)
  • Time: ์š”์ฒญ~์‘๋‹ต๊นŒ์ง€ ๊ฑธ๋ฆฐ ์ด ์‹œ๊ฐ„
  • Waterfall: ๊ฐ ์š”์ฒญ์˜ ํƒ€์ด๋ฐ ์‹œ๊ฐํ™” (๋ณ‘๋ ฌ ์š”์ฒญ ๊ตฌ์กฐ ํ™•์ธ ๊ฐ€๋Šฅ)

Ddingsroom์—์„œ์˜ ํ™œ์šฉ ํฌ์ธํŠธ

1. ๋ถˆํ•„์š”ํ•œ ์š”์ฒญ ์ฐพ๊ธฐ
์˜ˆ์•ฝ ์ •๋ณด์™€ ์‚ฌ์šฉ์ž ์ •๋ณด API๊ฐ€ ์ค‘๋ณต ํ˜ธ์ถœ๋˜๋Š”์ง€ ์ ๊ฒ€
2. 304 Not Modified ํ™•์ธ
์ •์  ๋ฆฌ์†Œ์Šค(layout.css, main-app.js)๊ฐ€ ์บ์‹ฑ์„ ํ†ตํ•ด ํšจ์œจ์ ์œผ๋กœ ์žฌ์‚ฌ์šฉ๋˜๋Š”์ง€ ํ™•์ธ
3. Bundling ์ ๊ฒ€
webpack.js ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ํฐ ๊ฒฝ์šฐ, ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… ํ•„์š”์„ฑ ๊ฒ€ํ† 
4. Lazy Loading ๊ฒ€์ฆ
์˜ˆ์•ฝ ์ด๋ฏธ์ง€(์Šคํ„ฐ๋””๋ฃธ ์‚ฌ์ง„ ๋“ฑ)๊ฐ€ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ „๋ถ€ ๋ถˆ๋ ค์˜ค์ง€ ์•Š๋Š”์ง€ ์ฒดํฌ


โš™๏ธ Ddingsroom ํ”„๋กœ์ ํŠธ Network ํŒจ๋„

์‹ค์ œ Ddingsroom ํ”„๋กœ์ ํŠธ์˜ ๋„คํŠธ์›Œํฌ ํƒญ ํ™”๋ฉด ์บก์ณ๋ณธ์ž…๋‹ˆ๋‹ค.
์ƒ๋‹จ์˜ Throttling: 3G์™€ Disable cache๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋ชจ๋ฐ”์ผ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์„ ์žฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
layout.css, webpack.js, main-app.js ๋“ฑ ์ฃผ์š” ๋ฆฌ์†Œ์Šค์˜ ์š”์ฒญ ์ˆœ์„œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , DOMContentLoaded(5.38s)์™€ Load(38.86s) ์‹œ์ ์„ ๊ธฐ์ค€์œผ๋กœ ๋ณ‘๋ชฉ ๊ตฌ๊ฐ„์„ ๋ถ„์„ํ–ˆ์Šต๋‹ˆ๋‹ค.


2๏ธโƒฃ Performance ํŒจ๋„ - ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ๋ถ„์„

Performance ํŒจ๋„์€ ํŽ˜์ด์ง€ ๋กœ๋”ฉ๊ณผ ๋ Œ๋”๋ง ๊ณผ์ • ์ „์ฒด๋ฅผ ํƒ€์ž„๋ผ์ธ์œผ๋กœ ์‹œ๊ฐํ™”ํ•ฉ๋‹ˆ๋‹ค. Network๊ฐ€ โ€œ์ „์†ก ์†๋„โ€๋ฅผ ๋ณธ๋‹ค๋ฉด, Performance๋Š” โ€œCPU/๋ Œ๋”๋ง ์†๋„โ€๋ฅผ ๋ถ„์„ํ•˜๋Š” ํŒจ๋„์ž…๋‹ˆ๋‹ค.

Ddingsroom์—์„œ๋Š” ๋กœ๊ทธ์ธ ํ›„ AfterLoginBanner๋‚˜ ์˜ˆ์•ฝ ๋ชจ๋‹ฌ ๋ Œ๋”๋ง ์‹œ JS ์—ฐ์‚ฐ๋Ÿ‰์ด ๊ธ‰์ฆํ•ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์˜ Task๊ฐ€ ๊ธธ์–ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.


์ฃผ์š” ํ•ญ๋ชฉ

  • Main Thread Activity: JS ์‹คํ–‰, ๋ Œ๋”๋ง, ๋ฆฌํ”Œ๋กœ์šฐ, ํŽ˜์ธํŠธ ๋“ฑ ๋ธŒ๋ผ์šฐ์ € ๋‚ด๋ถ€ ์ž‘์—…
  • FPS (Frame Per Second): ์ดˆ๋‹น ํ”„๋ ˆ์ž„ โ€” 60fps ์œ ์ง€๊ฐ€ ์ด์ƒ์ 
  • Screenshots: ๊ฐ ์‹œ์ ์˜ ํŽ˜์ด์ง€ ๋ Œ๋”๋ง ๋ฏธ๋ฆฌ๋ณด๊ธฐ
  • CPU Usage: JavaScript ์‹คํ–‰, ๋ ˆ์ด์•„์›ƒ, ์Šคํƒ€์ผ ๊ณ„์‚ฐ ๋“ฑ์˜ CPU ๋ถ€ํ•˜์œจ
  • Bottom-up View: ํ•จ์ˆ˜๋ณ„๋กœ CPU ์‚ฌ์šฉ ์‹œ๊ฐ„ ๋ถ„์„ ๊ฐ€๋Šฅ

์‹ค์ œ ์ ์šฉ ์˜ˆ์‹œ

1. ์Šคํฌ๋กค ์‹œ ๋ฒ„๋ฒ…์ž„
JS Event Listener๊ฐ€ ๋„ˆ๋ฌด ๋งŽ๊ฑฐ๋‚˜ ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ ํ™•์ธ
2. ๋ฆฌํ”Œ๋กœ์šฐ ๋ฐœ์ƒ
CSS ์†์„ฑ ๋ณ€๊ฒฝ ์‹œ Layout Trashing ์—ฌ๋ถ€ ํŒŒ์•…
3. LCP(Largest Contentful Paint)๊ฐœ์„ 
์ด๋ฏธ์ง€ ๋กœ๋“œ ํƒ€์ด๋ฐ ๋ฐ lazy loading ํ™•์ธ


โš™๏ธ Ddingsroom ํ”„๋กœ์ ํŠธ Performance ์ธก์ • ๊ฒฐ๊ณผ

์•„๋ž˜ ๊ฒฐ๊ณผ๋Š” Ddingsroom ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์˜ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์„ฑ๋Šฅ์„ Chrome DevTools Performance ํŒจ๋„์—์„œ 3G ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์œผ๋กœ ์ธก์ •ํ•œ ์ˆ˜์น˜์ž…๋‹ˆ๋‹ค.


ํ•ญ๋ชฉ์ธก์ •๊ฐ’์ƒํƒœํ•ด์„
LCP (Largest Contentful Paint)42.24์ดˆ๐Ÿ”ด ๋А๋ฆผ (Poor)๋ฉ”์ธ ์ฝ˜ํ…์ธ  ํ‘œ์‹œ๊นŒ์ง€ ์ง€๋‚˜์น˜๊ฒŒ ๊ธด ์ง€์—ฐ ๋ฐœ์ƒ
CLS (Cumulative Layout Shift)0.00๐ŸŸข ๋งค์šฐ ์šฐ์ˆ˜ (Good)์‹œ๊ฐ์  ํ”๋“ค๋ฆผ ์—†์ด ์•ˆ์ •์ ์œผ๋กœ ๋ Œ๋”๋ง๋จ
INP (Interaction to Next Paint)48ms๐ŸŸข ์šฐ์ˆ˜ (Good)๋ฒ„ํŠผ ํด๋ฆญ ๋“ฑ ์ธํ„ฐ๋ž™์…˜ ํ›„ ๋ฐ˜์‘์ด ์ฆ‰์‹œ ์ด๋ฃจ์–ด์ง

๋ถ„์„

  • LCP ์ง€์—ฐ ์›์ธ

    • ์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ div.text-4xl.md:text-5xl.font-bold ์š”์†Œ๊ฐ€ ํฌํ•จ๋œ ๋ฉ”์ธ ํ—ค๋” ์˜์—ญ์ด ๋ Œ๋”๋ง ์ง€์—ฐ ๋ฐœ์ƒ
    • ์ด๋ฏธ์ง€, JS ๋ฒˆ๋“ค, ๋˜๋Š” ํฐํŠธ ๋กœ๋”ฉ์ด ๋ Œ๋” ๋ธ”๋กœํ‚น(Render Blocking) ์œผ๋กœ ์ž‘์šฉํ–ˆ์„ ๊ฐ€๋Šฅ์„ฑ ๋†’์Œ
    • ํŠนํžˆ, ํฐํŠธ ์š”์ฒญ์ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์บ์‹œ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ LCP๊ฐ€ ์•…ํ™”๋  ์ˆ˜ ์žˆ์Œ
  • CLS 0.00 (Good)

    • ๋ชจ๋“  ์š”์†Œ์— ๊ณ ์ •๋œ ๋†’์ดยท๋น„์œจ์ด ์ ์šฉ๋˜์–ด ๋ ˆ์ด์•„์›ƒ ์‹œํ”„ํŠธ ์—†์ด ์•ˆ์ •์ ์ธ ๋ Œ๋”๋ง์ด ์ด๋ฃจ์–ด์ง
    • ์ด๋Š” Tailwind์˜ aspect-ratio, ๊ณ ์ • height, width ์ง€์ • ๋•๋ถ„์œผ๋กœ ๋ณด์ž„
  • INP 48ms (Good)

    • ๋ฒ„ํŠผ ๋ฐ ์ž…๋ ฅ ์š”์†Œ์˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋ฃจํ”„๊ฐ€ ๊ฐ€๋ณ๊ณ ,
      JS ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์˜ ๋ธ”๋กœํ‚น ๊ตฌ๊ฐ„์ด ๊ฑฐ์˜ ์—†์Œ โ†’ ์‚ฌ์šฉ์ž ๋ฐ˜์‘ ์ฆ‰์‹œ ๋ฐ˜์˜ ๊ฐ€๋Šฅ

ํ–ฅํ›„ ๊ฐœ์„  ๊ณ„ํš

์ด๋ฒˆ ์ธก์ •์—์„œ LCP(42.24s) ์ง€ํ‘œ๊ฐ€ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์œผ๋กœ ๋“œ๋Ÿฌ๋‚ฌ์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ๋‹จ๊ณ„๋ณ„ ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

1. ์ด๋ฏธ์ง€ ๋กœ๋”ฉ ์ตœ์ ํ™”

  • next/image ์ปดํฌ๋„ŒํŠธ๋กœ ๋ชจ๋“  ์ •์  ์ด๋ฏธ์ง€ ๊ต์ฒด
  • heroยท๋ฐฐ๋„ˆ ์ด๋ฏธ์ง€์— priority ์†์„ฑ ๋ถ€์—ฌ, ํ•˜๋‹จ ์ฝ˜ํ…์ธ ์—๋Š” loading="lazy" ์ ์šฉ
  • JPEG โ†’ WebP / AVIF ๋ณ€ํ™˜ ๋ฐ CDN ์บ์‹ฑ ๋„์ž…์œผ๋กœ ์‘๋‹ต ์†๋„ ๋‹จ์ถ•

2. ํฐํŠธ ๋กœ๋”ฉ ๊ฐœ์„ 

  • GmarketSans๋ฅผ Self-hosted WOFF2 ํฐํŠธ๋กœ ์ „ํ™˜
  • font-display: swap ์ ์šฉํ•˜์—ฌ ํฐํŠธ ๋กœ๋”ฉ ์ค‘์—๋„ ํ…์ŠคํŠธ๋ฅผ ์ฆ‰์‹œ ํ‘œ์‹œ
  • <link rel="preload" as="font"> ๋กœ ์ฃผ์š” ํฐํŠธ ์‚ฌ์ „ ๋กœ๋“œ

3. JS ๋ฒˆ๋“ค ์ตœ์ ํ™”

  • Next.js์˜ dynamic import()๋ฅผ ํ™œ์šฉํ•ด ๋น„ํ•„์ˆ˜ ์Šคํฌ๋ฆฝํŠธ ์ง€์—ฐ ๋กœ๋”ฉ
  • React.memo ๋ฐ useMemo๋กœ ๋ Œ๋”๋ง ๋น„์šฉ ์ตœ์†Œํ™”
  • ๋ถˆํ•„์š”ํ•œ ์ฝ˜์†” ๋กœ๊ทธ ๋ฐ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ ์ •๋ฆฌ

4. ์บ์‹ฑ ์ •์ฑ… ๊ณ ๋„ํ™”

  • ์ •์  ๋ฆฌ์†Œ์Šค(/static/*, /fonts/*, /images/*)์—
    Cache-Control: public, max-age=31536000, immutable ํ—ค๋” ์ ์šฉ
  • ์ดํ›„ Cloudflare / Vercel CDN ์—ฐ๋™์„ ํ†ตํ•ด ์ „์—ญ ์—ฃ์ง€ ์บ์‹œ ํ™œ์„ฑํ™”

3๏ธโƒฃ Lighthouse ํŒจ๋„ - ์›น ์„ฑ๋Šฅ ์ž๋™ ์ง„๋‹จ

Lighthouse๋Š” ํŽ˜์ด์ง€ ํ’ˆ์งˆ์„ ์ข…ํ•ฉ์ ์œผ๋กœ ๋ถ„์„ํ•ด์ฃผ๋Š” ์ž๋™ํ™” ํˆด์ž…๋‹ˆ๋‹ค.

Performance, Accessibility, Best Practices, SEO, PWA ๋“ฑ 5๊ฐ€์ง€ ํ•ญ๋ชฉ์„ ์ ์ˆ˜ํ™”ํ•ด์ค๋‹ˆ๋‹ค.


Lighthouse ์ฃผ์š” ์นดํ…Œ๊ณ ๋ฆฌ

  • Performance: ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„, LCP, CLS, TBT ๋“ฑ ์ฃผ์š” ์›น ์„ฑ๋Šฅ ์ง€ํ‘œ
  • Accessibility: ๋Œ€์ฒด ํ…์ŠคํŠธ, ARIA ์†์„ฑ, ์ƒ‰ ๋Œ€๋น„ ๋“ฑ ์ ‘๊ทผ์„ฑ ๊ฒ€์ฆ
  • Best Practices: HTTPS, JS ์˜ค๋ฅ˜, ์ฝ˜์†” ๊ฒฝ๊ณ  ๋“ฑ ์ ๊ฒ€
  • SEO: ๊ฒ€์ƒ‰์—”์ง„ ์ตœ์ ํ™” ๊ด€๋ จ ๋ฉ”ํƒ€ํƒœ๊ทธ, robots.txt ์—ฌ๋ถ€
  • PWA: Progressive Web App ์ง€์› ์—ฌ๋ถ€

Lighthouse ์ ์ˆ˜ ๊ฐœ์„  ๋ฐฉ์•ˆ

  • ์ด๋ฏธ์ง€ โ†’ WebP ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜
  • ํฐํŠธ โ†’ font-display: swap ์‚ฌ์šฉ
  • JS ๋ฒˆ๋“ค โ†’ Tree Shaking ์ ์šฉ
  • CSS โ†’ Critical CSS ์ธ๋ผ์ธ ์‚ฝ์ž…
  • ์บ์‹œ ์ •์ฑ… โ†’ Cache-Control, ETag ์ ๊ทน ํ™œ์šฉ

์ด ํ™”๋ฉด์€ Chrome DevTools์˜ Lighthouse ํƒญ์—์„œ ์„ฑ๋Šฅ ์ง„๋‹จ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „, ์ธก์ • ์กฐ๊ฑด์„ ์„ค์ •ํ•˜๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.
๋ถ„์„ํ•  ํŽ˜์ด์ง€ ์œ ํ˜•, ๋””๋ฐ”์ด์Šค ํ™˜๊ฒฝ, ๊ทธ๋ฆฌ๊ณ  ํ‰๊ฐ€ ํ•ญ๋ชฉ(Category)์„ ์ง€์ •ํ•œ ๋’ค
โ€œAnalyze page loadโ€ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ๋ฆฌํฌํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.


โš™๏ธ Ddingsroom ํ”„๋กœ์ ํŠธ Lighthouse ํƒญ ์„ฑ๋Šฅ ์ง„๋‹จ ๊ฒฐ๊ณผ

ํ•ญ๋ชฉ์ ์ˆ˜์ƒํƒœํ•ด์„
Performance42๐Ÿ”ป ๋‚ฎ์Œ์ดˆ๊ธฐ ๋ Œ๋”๋ง(LCP, TTI) ์ง€์—ฐ / ์ด๋ฏธ์ง€ ๋น„์ตœ์ ํ™” / JS ๋ฒˆ๋“ค ํผ
Accessibility95โœ… ์šฐ์ˆ˜label, alt, ๋Œ€๋น„๋„ ๋Œ€๋ถ€๋ถ„ ์ถฉ์กฑ
Best Practices71โš ๏ธ ๋ณดํ†ต์ด๋ฏธ์ง€ ํฌ๊ธฐ, HTTPS ๋ฆฌ์†Œ์Šค ๊ฒฝ๊ณ  ๋“ฑ ์ผ๋ถ€ ๊ฐœ์„  ํ•„์š”
SEO100๐ŸŸข ์™„๋ฒฝtitle / meta / robots ์„ค์ • ์–‘ํ˜ธ

Lighthouse ๋ถ„์„ ๊ฒฐ๊ณผ, Ddingsroom์€ SEO์™€ ์ ‘๊ทผ์„ฑ ์ธก๋ฉด์—์„œ ๋งค์šฐ ์šฐ์ˆ˜ํ•œ ๊ตฌ์กฐ๋ฅผ ๋ณด์˜€์ง€๋งŒ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์†๋„์™€ JS ๋ฒˆ๋“ค ํฌ๊ธฐ๋กœ ์ธํ•ด Performance ์ ์ˆ˜๊ฐ€ ๋‚ฎ๊ฒŒ ์ธก์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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


4๏ธโƒฃ ํฐํŠธ ์ตœ์ ํ™”(Font Optimization)

ํฐํŠธ๋Š” ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š์ง€๋งŒ, ์›น ํŽ˜์ด์ง€ ๋กœ๋”ฉ์„ ๋А๋ฆฌ๊ฒŒ ๋งŒ๋“œ๋Š” ์ฃผ์š” ์š”์ธ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.


์ตœ์ ํ™” ๋ฐฉ๋ฒ• 5๋‹จ๊ณ„

1. WOFF2 ํ˜•์‹ ์‚ฌ์šฉ
TTF/OTF๋ณด๋‹ค 30~50% ์šฉ๋Ÿ‰ ์ ˆ๊ฐ
2. ์„œ๋ธŒ์…‹(Subsetting)
์‹ค์ œ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ž๋งŒ ํฌํ•จ (์˜ˆ: ์˜๋ฌธ ์ „์šฉ, ํ•œ๊ธ€ ์ผ๋ถ€)
3. font-display: swap ์ ์šฉ
ํฐํŠธ ๋กœ๋”ฉ ์ค‘ FOUT(Flash of Unstyled Text) ๋ฐฉ์ง€

@font-face {
  font-family: 'Pretendard';
  src: url('/fonts/pretendard.woff2') format('woff2');
  font-display: swap;
}

4. Preload / Preconnect ์‚ฌ์šฉ

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

5. CDN ๋Œ€์‹  Self-hosting ๊ณ ๋ ค
Google Fonts๋ณด๋‹ค ์ง์ ‘ ํ˜ธ์ŠคํŒ…์ด ๋น ๋ฅผ ์ˆ˜ ์žˆ์Œ


์œ„ ์ด๋ฏธ์ง€๋Š” ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๊ณผ์ •์—์„œ CSS์™€ ํฐํŠธ ๋กœ๋”ฉ์ด ํŽ˜์ด์ง€ ํ‘œ์‹œ ์†๋„์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

  1. Tโ‚€ ~ Tโ‚ (Request โ†’ Build DOM)
  • ๋ธŒ๋ผ์šฐ์ €๋Š” HTML ๋ฌธ์„œ๋ฅผ ์š”์ฒญ(GET html)ํ•˜๊ณ  ์‘๋‹ต์„ ๋ฐ›์•„ DOM ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๋‹จ๊ณ„์—์„œ CSS ํŒŒ์ผ์„ ๋ฐœ๊ฒฌํ•˜๋ฉด ์ถ”๊ฐ€ ๋„คํŠธ์›Œํฌ ์š”์ฒญ(GET css)์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • CSS๋Š” ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š” Render Blocking ๋ฆฌ์†Œ์Šค๋กœ, ์‘๋‹ต์ด ์˜ค๊ธฐ ์ „๊นŒ์ง€ ํ™”๋ฉด์ด ๊ทธ๋ ค์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  1. Tโ‚ ~ Tโ‚‚ (Build CSSOM โ†’ Font ์š”์ฒญ)
  • CSS ์‘๋‹ต์ด ์˜ค๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” CSSOM(CSS Object Model)์„ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.
  • CSS ๋‚ด @font-face ์„ ์–ธ์ด ์žˆ์œผ๋ฉด ํฐํŠธ๋ฅผ ์ƒˆ๋กœ ์š”์ฒญ(GET font)ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ํฐํŠธ ์‘๋‹ต์ด ๋Šฆ์„ ๊ฒฝ์šฐ ํ…์ŠคํŠธ๋Š” ๋ณด์ด์ง€ ์•Š๊ณ  FOUT(Flash of Unstyled Text) ๋˜๋Š” FOIT(Flash of Invisible Text) ํ˜„์ƒ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๊ณผ์ •์ด blocked text painting์œผ๋กœ ํ‘œ์‹œ๋œ ์ด์œ ์ž…๋‹ˆ๋‹ค.
  1. Tโ‚‚ ~ Tโ‚ƒ (First Paint โ†’ Paint Text)
  • CSSOM๊ณผ DOM์ด ๊ฒฐํ•ฉ๋˜์–ด ๋ Œ๋” ํŠธ๋ฆฌ(Render Tree)๊ฐ€ ์™„์„ฑ๋˜๋ฉด
    ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ตœ์ดˆ๋กœ ํ™”๋ฉด์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค(First Paint).
  • ๊ทธ๋Ÿฌ๋‚˜ ํฐํŠธ๊ฐ€ ์•„์ง ๋กœ๋“œ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ํ…์ŠคํŠธ๋Š” ๊ทธ๋ ค์ง€์ง€ ์•Š๊ณ ,
    ํฐํŠธ ์‘๋‹ต ํ›„์—์•ผ ์‹ค์ œ ํ…์ŠคํŠธ๊ฐ€ ํ‘œ์‹œ(Paint Text)๋ฉ๋‹ˆ๋‹ค.
  • ์ฆ‰, ํฐํŠธ ๋กœ๋”ฉ์ด ๋Šฆ์„์ˆ˜๋ก LCP(Largest Contentful Paint) ์ง€ํ‘œ๊ฐ€ ๋‚˜๋น ์ง€๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๋กœ๋”ฉ์ด ๋А๋ฆฌ๊ฒŒ ๋А๊ปด์ง‘๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์š”์•ฝ

CSS์™€ ํฐํŠธ๋Š” ๋ Œ๋”๋ง์„ ์ง€์—ฐ์‹œํ‚ค๋Š” ์ฃผ์š” ์›์ธ์ด๋ฏ€๋กœ,
font-display: swap ์†์„ฑ ์ ์šฉ์ด๋‚˜ preload๋กœ ํฐํŠธ๋ฅผ ๋ฏธ๋ฆฌ ๋ถˆ๋Ÿฌ์˜ค๋ฉด
First Paint ์‹œ์ ์— ํ…์ŠคํŠธ๊ฐ€ ๋น ๋ฅด๊ฒŒ ํ‘œ์‹œ๋˜์–ด ๋ Œ๋” ๋ธ”๋กœํ‚น ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โš™๏ธ Ddingsroom ํ”„๋กœ์ ํŠธ์—์˜ ์ ์šฉ ์˜ˆ์‹œ

ํ˜„์žฌ Ddingsroom์€ GmarketSans ์‹œ์Šคํ…œ ํฐํŠธ๋ฅผ ๋กœ์ปฌ ํฐํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ๋ฐฉ์‹์€ ์‚ฌ์šฉ์ž OS(macOS, Windows ๋“ฑ)์— ํ•ด๋‹น ํฐํŠธ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ
๋„คํŠธ์›Œํฌ ์š”์ฒญ ์—†์ด ๋ฐ”๋กœ ๋ Œ๋”๋ง๋œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ, ๋กœ์ปฌ์— ํฐํŠธ๊ฐ€ ์—†๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” ๋Œ€์ฒด ํฐํŠธ๊ฐ€ ์ ์šฉ๋˜๋ฉฐ ์‹œ๊ฐ์  ์ผ๊ด€์„ฑ์ด ๊นจ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ–ฅํ›„์—๋Š” Self-hosting + ์ตœ์ ํ™”๋œ ํฐํŠธ ์„œ๋น™ ์ „๋žต์„ ๋„์ž…ํ•˜์—ฌ
๋ Œ๋”๋ง ์•ˆ์ •์„ฑ๊ณผ ์„ฑ๋Šฅ ์ ์ˆ˜๋ฅผ ๋™์‹œ์— ๊ฐœ์„ ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

5๏ธโƒฃ ์ด๋ฏธ์ง€ ์ตœ์ ํ™”(Image Optimization)

์ด๋ฏธ์ง€๋Š” ์ „์ฒด ํŽ˜์ด์ง€ ์šฉ๋Ÿ‰์˜ 60~80%๋ฅผ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์ ์ ˆํ•œ ํฌ๋งท, ํฌ๊ธฐ, ๋กœ๋”ฉ ์ „๋žต์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.


์ด๋ฏธ์ง€ ํฌ๋งท ์„ ํƒ ๊ฐ€์ด๋“œ

๋ชฉ์ ์ถ”์ฒœ ํฌ๋งท์ด์œ 
์ผ๋ฐ˜ ์‚ฌ์ง„WebP / AVIF์šฉ๋Ÿ‰ ์ตœ๋Œ€ 70% ์ ˆ๊ฐ
ํˆฌ๋ช… ๋ฐฐ๊ฒฝPNG-8 / WebPํˆฌ๋ช…๋„ ์œ ์ง€
์•„์ด์ฝ˜ / ๋กœ๊ณ SVG๋ฒกํ„ฐ ๊ธฐ๋ฐ˜, ๋ฐ˜์‘ํ˜•์— ์ ํ•ฉ
์ธ๋„ค์ผ / ํ”„๋ฆฌ๋ทฐJPEG / WebP๋น ๋ฅธ ๋กœ๋“œ

์‹ค์ œ ์ตœ์ ํ™” ๊ธฐ๋ฒ•

1. Responsive Images

<img src="hero-640.webp"
     srcset="hero-1280.webp 1280w, hero-640.webp 640w"
     sizes="(max-width: 768px) 640px, 1280px"
     alt="๋ฉ”์ธ ๋ฐฐ๋„ˆ ์ด๋ฏธ์ง€">

2. Lazy Loading

<img src="banner.webp" loading="lazy" alt="๋ฐฐ๋„ˆ ์ด๋ฏธ์ง€">

3. Next-gen Formats (WebP, AVIF)
Lighthouse์—์„œ๋„ ์ง์ ‘ ์ถ”์ฒœ๋จ

4. CDN ์ด๋ฏธ์ง€ ์••์ถ• ์„œ๋น„์Šค ์‚ฌ์šฉ (Cloudflare, Imgix ๋“ฑ)


์œ„ ์ด๋ฏธ์ง€๋Š” CDN(Content Delivery Network) ์ด ์›๋ณธ ์„œ๋ฒ„(Origin Server)์™€ ์‚ฌ์šฉ์ž(User) ์‚ฌ์ด์—์„œ ์–ด๋–ป๊ฒŒ ์ด๋ฏธ์ง€๋‚˜ ์ •์  ๋ฆฌ์†Œ์Šค๋ฅผ ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์œผ๋กœ ์ „๋‹ฌํ•˜๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.


์ž‘๋™ ์›๋ฆฌ ์š”์•ฝ

1. ์‚ฌ์šฉ์ž ์š”์ฒญ(Request)

  • ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ์ง€๋ฅผ ์š”์ฒญํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ๋จผ์ € CDN ์„œ๋ฒ„(์—ฃ์ง€ ์„œ๋ฒ„) ๋กœ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • CDN์€ ์ „ ์„ธ๊ณ„ ์—ฌ๋Ÿฌ ์ง€์—ญ์— ๋ถ„์‚ฐ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž์˜ ๋ฌผ๋ฆฌ์  ์œ„์น˜์™€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

2. CDN ์บ์‹œ(Cache) ํ™•์ธ

  • CDN์€ ๋™์ผํ•œ ์ด๋ฏธ์ง€ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ์ž์‹ ์˜ ์บ์‹œ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๋จผ์ € ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์บ์‹œ์— ํŒŒ์ผ์ด ์žˆ๋‹ค๋ฉด ์›๋ณธ ์„œ๋ฒ„์— ์žฌ์š”์ฒญํ•˜์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ์‘๋‹ต(Response) ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋„คํŠธ์›Œํฌ ์ง€์—ฐ(latency)์ด ์ค„๊ณ , ํŠธ๋ž˜ํ”ฝ ๋น„์šฉ๋„ ์ ˆ๊ฐ๋ฉ๋‹ˆ๋‹ค.

3. ์›๋ณธ ์„œ๋ฒ„(Origin Server) ์š”์ฒญ

  • ๋งŒ์•ฝ CDN ์บ์‹œ์— ์ด๋ฏธ์ง€๊ฐ€ ์—†๊ฑฐ๋‚˜ ๋งŒ๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด,
    CDN์€ ์›๋ณธ ์„œ๋ฒ„์— ์ง์ ‘ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • ์ดํ›„ ๋ฐ›์€ ์‘๋‹ต์„ ์บ์‹œ์— ์ €์žฅํ•ด, ๋‹ค์Œ ์š”์ฒญ ์‹œ ๋น ๋ฅด๊ฒŒ ์„œ๋น™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

4. ์„œ๋ฒ„ ์žฅ์•  ์‹œ์˜ ์ด์ 

  • ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ๋ณ€๊ฒฝ์ด ๋“œ๋ฌธ ๋ฆฌ์†Œ์Šค๋Š” CDN ์บ์‹œ ๋‚ด์— ์œ ์ง€๋˜๊ธฐ ๋•Œ๋ฌธ์—,
    ์›๋ณธ ์„œ๋ฒ„๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ๋‹ค์šด๋˜๋”๋ผ๋„ CDN์ด ์บ์‹œ๋œ ํŒŒ์ผ์„ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฆ‰, ์‚ฌ์šฉ์ž๋Š” ์„œ๋น„์Šค ์žฅ์• ๋ฅผ ๊ฑฐ์˜ ๋А๋ผ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

โš™๏ธ Ddingsroom ํ”„๋กœ์ ํŠธ์—์˜ ์ ์šฉ ์˜ˆ์‹œ

ํ˜„์žฌ Ddingsroom์˜ ์ •์  ์ด๋ฏธ์ง€(/public/static/images/*)๋Š” ๋กœ์ปฌ์—์„œ ์ง์ ‘ ์„œ๋น™๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
ํ–ฅํ›„์—๋Š” Cloudflare Images / AWS CloudFront / Vercel Image Optimization ๊ฐ™์€ CDN์„ ํ™œ์šฉํ•˜์—ฌ ๊ฐœ์„ ์„ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ‘€ ๋งˆ์น˜๋ฉฐ

์†”์งํžˆ, ์ง€๊ธˆ๊นŒ์ง€๋Š” โ€œ๊ธฐ๋Šฅ์ด ๋Œ์•„๊ฐ€๋ฉด ๋๋‹คโ€๊ณ  ์ƒ๊ฐํ•œ ์ ์ด ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Ddingsroom์€ ์‹ค์ œ๋กœ ํ•™์ƒ๋“ค์ด ๋งค์ผ ์ ‘์†ํ•˜๋Š” ์šด์˜ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. 1์ดˆ์˜ ์ง€์—ฐ, ํ•œ ๋ฒˆ์˜ ๊นœ๋นก์ž„๋„ ์‚ฌ์šฉ์„ฑ์˜ ํ”ผ๋กœ๋กœ ๋Œ์•„์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ์ž ๋„๊ตฌ์™€ Lighthouse๋กœ ์ง์ ‘ ๋ถ„์„ํ•ด๋ณด๋‹ˆ, ์ด๋ฏธ์ง€ยทํฐํŠธยทJS ๋ฒˆ๋“ค์ด ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๊ตฌ์ฒด์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ์ ๊ฒ€์„ ํ†ตํ•ด ๋ฐฐ์šด ๊ฑด, ์„ฑ๋Šฅ ์ตœ์ ํ™”๋Š” โ€˜์ถ”๊ฐ€ ์ž‘์—…โ€™์ด ์•„๋‹ˆ๋ผ โ€˜์‚ฌ์šฉ์ž ๊ฒฝํ—˜์˜ ๊ธฐ๋ณธโ€™์ด๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค.
์•ž์œผ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐœ์„ ์„ ์ด์–ด๊ฐˆ ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

  • ์ด๋ฏธ์ง€ โ†’ WebP ๋ณ€ํ™˜, lazy ๋กœ๋”ฉ, CDN ์บ์‹ฑ

  • ํฐํŠธ โ†’ woff2 self-hosting, preload, font-display: swap

  • ์ฝ”๋“œ โ†’ dynamic import, Tree Shaking ์ ์šฉ

profile
๋งค์ผ๋งค์ผ ์กฐ๊ธˆ์”ฉ ์„ฑ์žฅํ•˜๋ ค ๋…ธ๋ ฅํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค!

5๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2025๋…„ 11์›” 5์ผ

ํŒจ๋„์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•  ๋•Œ ์˜ˆ์ œ๋กœ ์ ์šฉํ•ด ๋ณผ๋งŒํ•œ ์ž๋ฃŒ๊ฐ€ ์ ์–ด์„œ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š” ์ง€์— ๊ด€์‹ฌ์ด ์žˆ์—ˆ๋Š”๋ฐ, ๋ณธ์ธ์ด ์ง„ํ–‰ํ•œ ํ”„๋กœ์ ํŠธ์™€ ์—ฎ์–ด์„œ ์„ค๋ช…ํ•ด์ฃผ์…”์„œ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ๋„ค์šฉ
๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๊ณผ์ •์˜ T2~T3์—์„œ ํฐํŠธ ๋กœ๋”ฉ์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ์ ๋„ ์ƒˆ๋กญ๊ฒŒ ์•Œ์•„๊ฐ‘๋‹ˆ๋‹ค!

์ด๋ฏธ์ง€ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์—์„œ WebP, AVIF์™€ ๊ฐ™์€ ์ฐจ์„ธ๋Œ€ ํฌ๋งท์„ ์ ์šฉํ•  ๋•Œ, <picture>์™€ <source>ํƒœ๊ทธ์˜ srcset์†์„ฑ์œผ๋กœ ์ง€์› ๊ฐ€๋Šฅํ•œ ์ด๋ฏธ์ง€ ํฌ๋งท๋ถ€ํ„ฐ ์ ์šฉ๋˜๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ํ•ด์š”

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2025๋…„ 11์›” 5์ผ

์ด๋ฏธ์ง€ ํฌ๋งท๋ณ„๋กœ ๋ชฉ์ ์— ๋”ฐ๋ผ ๊ตฌ์ฒด์ ์œผ๋กœ ์ •๋ฆฌํ•ด์ฃผ์…”์„œ ์ •๋ง ๋„์›€ ๋์–ด์š”! ํŠนํžˆ WebP๋‚˜ AVIF์ฒ˜๋Ÿผ ์ตœ๊ทผ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ํฌ๋งท์ด ์‹ค์ œ๋กœ ์–ผ๋งˆ๋‚˜ ์šฉ๋Ÿ‰ ์ ˆ๊ฐ ํšจ๊ณผ๊ฐ€ ์žˆ๋Š”์ง€ ์ˆ˜์น˜๋กœ ์ œ์‹œํ•ด์ค˜์„œ ์ดํ•ด๊ฐ€ ํ™•์‹คํžˆ ๋์Šต๋‹ˆ๋‹ค~

AVIF๋Š” ํ™”์งˆ์ด ์ข‹๋‹ค๊ณ  ๋“ค์—ˆ๋Š”๋ฐ ๋ธŒ๋ผ์šฐ์ € ์ง€์›์€ ์•„์ง WebP๋ณด๋‹ค ๋ถ€์กฑํ•œ ๊ฑธ๋กœ ์•Œ๊ณ  ์žˆ์–ด์„œ ์‹ค์ œ ์ ์šฉํ•  ๋•Œ๋Š” ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ์„ ํƒํ•ด์•ผ ํ• ์ง€ ๊ณ ๋ฏผ์ด ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„์š”...
ํ˜น์‹œ picture ํƒœ๊ทธ๋กœ ๋‘ ํฌ๋งท์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์ ์šฉํ•ด๋ณด์‹  ์ ์ด ์žˆ์œผ์‹ ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2025๋…„ 11์›” 6์ผ

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

๊ทธ๋ฆฌ๊ณ  ์ €๋„ ์œ ์ง„๋‹˜๊ณผ ๊ฐ™์ด LCP๋ฅผ ๊ฐœ์„ ํ•ด์•ผ ํ–ˆ๋˜ ๊ฒฝํ—˜์ด ์žˆ๋Š”๋ฐ ์ €๋Š” Lighthouse์—์„œ ๊ฒฝ๊ณ ํ•œ ๋‚ด์šฉ๋“ค์„ ๋ฐ˜์˜ํ•ด๋„ ๋ˆˆ์— ๋„๋Š” ๊ฐœ์„ ์ด ์ด๋ฃจ์–ด์ง€์ง€๋Š” ์•Š๋”๋ผ๊ตฌ์š”๐Ÿฅฒ ์œ ์ง„๋‹˜์€ ๋‹ค์Œ์˜ 3๊ฐ€์ง€๋ฅผ ๋‚ฎ์€ LCP์˜ ์›์ธ์œผ๋กœ ๋ฝ‘์œผ์…จ๋Š”๋ฐ, ๊ทธ ์ด์œ ์™€ ๊ณผ์ •์ด ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!

์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ div.text-4xl.md:text-5xl.font-bold ์š”์†Œ๊ฐ€ ํฌํ•จ๋œ ๋ฉ”์ธ ํ—ค๋” ์˜์—ญ์ด ๋ Œ๋”๋ง ์ง€์—ฐ ๋ฐœ์ƒ
์ด๋ฏธ์ง€, JS ๋ฒˆ๋“ค, ๋˜๋Š” ํฐํŠธ ๋กœ๋”ฉ์ด ๋ Œ๋” ๋ธ”๋กœํ‚น(Render Blocking) ์œผ๋กœ ์ž‘์šฉํ–ˆ์„ ๊ฐ€๋Šฅ์„ฑ ๋†’์Œ
ํŠนํžˆ, ํฐํŠธ ์š”์ฒญ์ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์บ์‹œ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ LCP๊ฐ€ ์•…ํ™”๋  ์ˆ˜ ์žˆ์Œ

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2025๋…„ 11์›” 6์ผ

์ •์  ์ด๋ฏธ์ง€๋Š” public์— ์œ„์น˜์‹œ์ผœ๋ณด๋Š”๊ฑด ์–ด๋–จ๊นŒ์š”??

  • ์ฝ”๋“œ์—์„œ ์ง์ ‘ import ํ•˜์ง€์•Š๊ณ , HTML ๋˜๋Š” URL ๋กœ ์ ‘๊ทผํ•  ์ด๋ฏธ์ง€
  • ๋ฒˆ๋“ค์— ํฌํ•จ๋˜์ง€ ์•Š๊ฒŒ ํ•˜๊ธธ ์›ํ•˜๋Š” ๊ฒฝ์šฐ
  • ์บ์‹ฑ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ

๋ฆฌ์—‘ํŠธ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฆด๋ฆฌ์ฆˆ๋˜๋ฉด์„œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ React's rules๋ฅผ ์ด์šฉํ•˜์—ฌ, ์ปดํฌ๋„ŒํŠธ์™€ Hooks ๋‚ด ๊ฐ’๋“ค๊ณผ ๊ทธ๋ฃน์„ ๋ฉ”๋ชจ์ œ์ด์…˜ํ•˜๋Š”๋ฐ ๊ฐœ๋ฐœ์ž๊ฐ€ memo/useCallback์„ ์ง์ ‘ ์ ์šฉํ•  ์ด์œ ๊ฐ€ ๋”ฐ๋กœ ์žˆ์„๊นŒ์š”?? ์ง์ ‘ ์ ์šฉ์„ ํ•ด์•ผํ•œ๋‹ค๋ฉด ์–ด๋–ค ๊ฒฝ์šฐ์ผ๊นŒ์š”!?

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2025๋…„ 11์›” 6์ผ

ํŒจ๋„ ๊ด€๋ จ ๋‚ด์šฉ์„ ๊ณต๋ถ€ํ•  ๋•Œ๋Š” ๊ธ€๋กœ๋งŒ ๋˜์–ด ์žˆ์–ด์„œ ๋‹ค์†Œ ์ดํ•ด๊ฐ€ ์–ด๋ ค์› ๋Š”๋ฐ, ์œ ์ง„๋‹˜์€ ์‹ค์ œ ํ”„๋กœ์ ํŠธ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด์ฃผ์…”์„œ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค!
ํŠนํžˆ T0~T3๋กœ ๊ตฌ๋ถ„๋œ ์‹œ๊ฐ„ ํ๋ฆ„์— ๋”ฐ๋ฅธ ๋ Œ๋”๋ง ๊ณผ์ •์„ ๋ช…ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ์–ด์„œ ํฐ ๋„์›€์ด ๋์–ด์š”.
์œ ์ง„๋‹˜ ์•„ํ‹ฐํด ๋•๋ถ„์— ๊ทธ๋™์•ˆ ๋ง‰์—ฐํ–ˆ๋˜ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ํ๋ฆ„์ด ์ •๋ฆฌ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค :)

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ