์น ์ฑ๋ฅ์ ๊ฐ์ ํ๊ณ ๋คํธ์ํฌ ์ฌ์ฉ๋์ ์ค์ด๋ ๊ฐ์ฅ ํ์คํ ๋ฐฉ๋ฒ์ โ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ(DevTools)โ๋ฅผ ์ ๋๋ก ์ดํดํ๋ ๊ฒ์ ๋๋ค.
์ด๋ฒ ๊ธ์์๋ ์ ๊ฐ ์ง์ ์ด์ ์ค์ธ ์คํฐ๋๋ฃธ ์์ฝ ์๋น์ค โDdingsroomโ์ ์์๋ก, ํฌ๋กฌ ๊ฐ๋ฐ์ ๋๊ตฌ์ Network / Performance / Lighthouse ํจ๋์ ์ค์ฌ์ผ๋ก ์ค์ ๋ก๋ฉ ๊ณผ์ ์์์ ๋ณ๋ชฉ ์ง์ ์ ์ฐพ๊ณ , ํฐํธ ๋ฐ ์ด๋ฏธ์ง ์ต์ ํ๋ก ๋์ญํญ์ ์ค์ด๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
Network ํจ๋์ ์น ํ์ด์ง๊ฐ ์์ฒญํ๋ ๋ชจ๋ ๋ฆฌ์์ค์ ๋คํธ์ํฌ ํ๋ฆ์ ์๊ฐ์ ์ผ๋ก ๋ณด์ฌ์ฃผ๋ ๋๊ตฌ์
๋๋ค.
HTML, JS, CSS, ์ด๋ฏธ์ง, ํฐํธ ๋ฑ ์ด๋ค ๋ฆฌ์์ค๊ฐ ์ผ๋ง๋งํผ์ ์๊ฐ๊ณผ ๋์ญํญ์ ์ฌ์ฉํ๋์ง๋ฅผ ๋ถ์ํ ์ ์์ต๋๋ค.
Ddingsroom์ Next.js ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ด,์ด๊ธฐ ๋ ๋๋ง ์ HTML โ CSS โ JS โ API โ ์ด๋ฏธ์ง ์์ผ๋ก ๋ฆฌ์์ค๊ฐ ์์ฐจ์ ์ผ๋ก ์์ฒญ๋ฉ๋๋ค.
1. ๋ถํ์ํ ์์ฒญ ์ฐพ๊ธฐ
์์ฝ ์ ๋ณด์ ์ฌ์ฉ์ ์ ๋ณด API๊ฐ ์ค๋ณต ํธ์ถ๋๋์ง ์ ๊ฒ
2. 304 Not Modified ํ์ธ
์ ์ ๋ฆฌ์์ค(layout.css, main-app.js)๊ฐ ์บ์ฑ์ ํตํด ํจ์จ์ ์ผ๋ก ์ฌ์ฌ์ฉ๋๋์ง ํ์ธ
3. Bundling ์ ๊ฒ
webpack.js ํ์ผ์ ํฌ๊ธฐ๊ฐ ํฐ ๊ฒฝ์ฐ, ์ฝ๋ ์คํ๋ฆฌํ
ํ์์ฑ ๊ฒํ
4. Lazy Loading ๊ฒ์ฆ
์์ฝ ์ด๋ฏธ์ง(์คํฐ๋๋ฃธ ์ฌ์ง ๋ฑ)๊ฐ ์ด๊ธฐ ๋ก๋ฉ ์ ๋ถํ์ํ๊ฒ ์ ๋ถ ๋ถ๋ ค์ค์ง ์๋์ง ์ฒดํฌ

์ค์ Ddingsroom ํ๋ก์ ํธ์ ๋คํธ์ํฌ ํญ ํ๋ฉด ์บก์ณ๋ณธ์ ๋๋ค.
์๋จ์Throttling: 3G์Disable cache๋ฅผ ์ค์ ํ์ฌ ๋ชจ๋ฐ์ผ ๋คํธ์ํฌ ํ๊ฒฝ์ ์ฌํํ์ต๋๋ค.
layout.css,webpack.js,main-app.js๋ฑ ์ฃผ์ ๋ฆฌ์์ค์ ์์ฒญ ์์๋ฅผ ํ์ธํ ์ ์๊ณ , DOMContentLoaded(5.38s)์ Load(38.86s) ์์ ์ ๊ธฐ์ค์ผ๋ก ๋ณ๋ชฉ ๊ตฌ๊ฐ์ ๋ถ์ํ์ต๋๋ค.
Performance ํจ๋์ ํ์ด์ง ๋ก๋ฉ๊ณผ ๋ ๋๋ง ๊ณผ์ ์ ์ฒด๋ฅผ ํ์๋ผ์ธ์ผ๋ก ์๊ฐํํฉ๋๋ค. Network๊ฐ โ์ ์ก ์๋โ๋ฅผ ๋ณธ๋ค๋ฉด, Performance๋ โCPU/๋ ๋๋ง ์๋โ๋ฅผ ๋ถ์ํ๋ ํจ๋์ ๋๋ค.
Ddingsroom์์๋ ๋ก๊ทธ์ธ ํ AfterLoginBanner๋ ์์ฝ ๋ชจ๋ฌ ๋ ๋๋ง ์ JS ์ฐ์ฐ๋์ด ๊ธ์ฆํด ๋ฉ์ธ ์ค๋ ๋์ Task๊ฐ ๊ธธ์ด์ง๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
1. ์คํฌ๋กค ์ ๋ฒ๋ฒ
์
JS Event Listener๊ฐ ๋๋ฌด ๋ง๊ฑฐ๋ ๋ฌด๊ฑฐ์ด ์ฐ์ฐ ํ์ธ
2. ๋ฆฌํ๋ก์ฐ ๋ฐ์
CSS ์์ฑ ๋ณ๊ฒฝ ์ Layout Trashing ์ฌ๋ถ ํ์
3. LCP(Largest Contentful Paint)๊ฐ์
์ด๋ฏธ์ง ๋ก๋ ํ์ด๋ฐ ๋ฐ lazy loading ํ์ธ

์๋ ๊ฒฐ๊ณผ๋ 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 ์์๊ฐ ํฌํจ๋ ๋ฉ์ธ ํค๋ ์์ญ์ด ๋ ๋๋ง ์ง์ฐ ๋ฐ์CLS 0.00 (Good)
aspect-ratio, ๊ณ ์ height, width ์ง์ ๋๋ถ์ผ๋ก ๋ณด์INP 48ms (Good)
์ด๋ฒ ์ธก์ ์์ LCP(42.24s) ์งํ๊ฐ ์ฑ๋ฅ ๋ณ๋ชฉ์ผ๋ก ๋๋ฌ๋ฌ์ต๋๋ค.
๋ฐ๋ผ์ ์๋์ ๊ฐ์ ๋จ๊ณ๋ณ ์ต์ ํ๋ฅผ ์งํํ ์์ ์ ๋๋ค.
1. ์ด๋ฏธ์ง ๋ก๋ฉ ์ต์ ํ
next/image ์ปดํฌ๋ํธ๋ก ๋ชจ๋ ์ ์ ์ด๋ฏธ์ง ๊ต์ฒด priority ์์ฑ ๋ถ์ฌ, ํ๋จ ์ฝํ
์ธ ์๋ loading="lazy" ์ ์ฉ 2. ํฐํธ ๋ก๋ฉ ๊ฐ์
GmarketSans๋ฅผ Self-hosted WOFF2 ํฐํธ๋ก ์ ํ font-display: swap ์ ์ฉํ์ฌ ํฐํธ ๋ก๋ฉ ์ค์๋ ํ
์คํธ๋ฅผ ์ฆ์ ํ์ <link rel="preload" as="font"> ๋ก ์ฃผ์ ํฐํธ ์ฌ์ ๋ก๋ 3. JS ๋ฒ๋ค ์ต์ ํ
dynamic import()๋ฅผ ํ์ฉํด ๋นํ์ ์คํฌ๋ฆฝํธ ์ง์ฐ ๋ก๋ฉ React.memo ๋ฐ useMemo๋ก ๋ ๋๋ง ๋น์ฉ ์ต์ํ 4. ์บ์ฑ ์ ์ฑ ๊ณ ๋ํ
/static/*, /fonts/*, /images/*)์Cache-Control: public, max-age=31536000, immutable ํค๋ ์ ์ฉ Lighthouse๋ ํ์ด์ง ํ์ง์ ์ข ํฉ์ ์ผ๋ก ๋ถ์ํด์ฃผ๋ ์๋ํ ํด์ ๋๋ค.
Performance, Accessibility, Best Practices, SEO, PWA ๋ฑ 5๊ฐ์ง ํญ๋ชฉ์ ์ ์ํํด์ค๋๋ค.
font-display: swap ์ฌ์ฉCache-Control, ETag ์ ๊ทน ํ์ฉ
์ด ํ๋ฉด์ Chrome DevTools์ Lighthouse ํญ์์ ์ฑ๋ฅ ์ง๋จ์ ์์ํ๊ธฐ ์ , ์ธก์ ์กฐ๊ฑด์ ์ค์ ํ๋ ๋จ๊ณ์ ๋๋ค.
๋ถ์ํ ํ์ด์ง ์ ํ, ๋๋ฐ์ด์ค ํ๊ฒฝ, ๊ทธ๋ฆฌ๊ณ ํ๊ฐ ํญ๋ชฉ(Category)์ ์ง์ ํ ๋ค
โAnalyze page loadโ ๋ฒํผ์ ๋๋ฌ ๋ฆฌํฌํธ๋ฅผ ์์ฑํฉ๋๋ค.

| ํญ๋ชฉ | ์ ์ | ์ํ | ํด์ |
|---|---|---|---|
| Performance | 42 | ๐ป ๋ฎ์ | ์ด๊ธฐ ๋ ๋๋ง(LCP, TTI) ์ง์ฐ / ์ด๋ฏธ์ง ๋น์ต์ ํ / JS ๋ฒ๋ค ํผ |
| Accessibility | 95 | โ ์ฐ์ | label, alt, ๋๋น๋ ๋๋ถ๋ถ ์ถฉ์กฑ |
| Best Practices | 71 | โ ๏ธ ๋ณดํต | ์ด๋ฏธ์ง ํฌ๊ธฐ, HTTPS ๋ฆฌ์์ค ๊ฒฝ๊ณ ๋ฑ ์ผ๋ถ ๊ฐ์ ํ์ |
| SEO | 100 | ๐ข ์๋ฒฝ | title / meta / robots ์ค์ ์ํธ |
Lighthouse ๋ถ์ ๊ฒฐ๊ณผ, Ddingsroom์ SEO์ ์ ๊ทผ์ฑ ์ธก๋ฉด์์ ๋งค์ฐ ์ฐ์ํ ๊ตฌ์กฐ๋ฅผ ๋ณด์์ง๋ง ์ด๊ธฐ ๋ ๋๋ง ์๋์ JS ๋ฒ๋ค ํฌ๊ธฐ๋ก ์ธํด Performance ์ ์๊ฐ ๋ฎ๊ฒ ์ธก์ ๋์์ต๋๋ค.
ํฅํ์๋ ์ด๋ฏธ์ง WebP ๋ณํ, ์ฝ๋ ์คํ๋ฆฌํ , ํฐํธ ์ต์ ํ ๋ฑ์ ํตํด
์ฑ๋ฅ ์งํ๋ฅผ 42 โ 80 ์ด์์ผ๋ก ํฅ์์ํค๋ ๊ฒ์ ๋ชฉํ๋ก ํ๊ณ ์์ต๋๋ค.
ํฐํธ๋ ๋์ ๋ณด์ด์ง ์์ง๋ง, ์น ํ์ด์ง ๋ก๋ฉ์ ๋๋ฆฌ๊ฒ ๋ง๋๋ ์ฃผ์ ์์ธ ์ค ํ๋์ ๋๋ค.
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์ ํฐํธ ๋ก๋ฉ์ด ํ์ด์ง ํ์ ์๋์ ์ด๋ค ์ํฅ์ ๋ฏธ์น๋์ง๋ฅผ ๋ณด์ฌ์ค๋๋ค.
GET html)ํ๊ณ ์๋ต์ ๋ฐ์ DOM ํธ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค. GET css)์ ์ํํฉ๋๋ค. @font-face ์ ์ธ์ด ์์ผ๋ฉด ํฐํธ๋ฅผ ์๋ก ์์ฒญ(GET font)ํ๊ฒ ๋ฉ๋๋ค. blocked text painting์ผ๋ก ํ์๋ ์ด์ ์
๋๋ค.ํต์ฌ ์์ฝ
CSS์ ํฐํธ๋ ๋ ๋๋ง์ ์ง์ฐ์ํค๋ ์ฃผ์ ์์ธ์ด๋ฏ๋ก,
font-display: swap์์ฑ ์ ์ฉ์ด๋preload๋ก ํฐํธ๋ฅผ ๋ฏธ๋ฆฌ ๋ถ๋ฌ์ค๋ฉด
First Paint ์์ ์ ํ ์คํธ๊ฐ ๋น ๋ฅด๊ฒ ํ์๋์ด ๋ ๋ ๋ธ๋กํน ์๊ฐ์ ๋จ์ถํ ์ ์์ต๋๋ค.
ํ์ฌ Ddingsroom์
GmarketSans์์คํ ํฐํธ๋ฅผ ๋ก์ปฌ ํฐํธ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์ด ๋ฐฉ์์ ์ฌ์ฉ์ OS(macOS, Windows ๋ฑ)์ ํด๋น ํฐํธ๊ฐ ์ค์น๋์ด ์์ ๊ฒฝ์ฐ
๋คํธ์ํฌ ์์ฒญ ์์ด ๋ฐ๋ก ๋ ๋๋ง๋๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
ํ์ง๋ง, ๋ก์ปฌ์ ํฐํธ๊ฐ ์๋ ํ๊ฒฝ์์๋ ๋์ฒด ํฐํธ๊ฐ ์ ์ฉ๋๋ฉฐ ์๊ฐ์ ์ผ๊ด์ฑ์ด ๊นจ์ง ์ ์์ต๋๋ค.
ํฅํ์๋ Self-hosting + ์ต์ ํ๋ ํฐํธ ์๋น ์ ๋ต์ ๋์ ํ์ฌ
๋ ๋๋ง ์์ ์ฑ๊ณผ ์ฑ๋ฅ ์ ์๋ฅผ ๋์์ ๊ฐ์ ํ ๊ณํ์ ๋๋ค.
์ด๋ฏธ์ง๋ ์ ์ฒด ํ์ด์ง ์ฉ๋์ 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)
2. CDN ์บ์(Cache) ํ์ธ
3. ์๋ณธ ์๋ฒ(Origin Server) ์์ฒญ
4. ์๋ฒ ์ฅ์ ์์ ์ด์
ํ์ฌ 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 ์ ์ฉ
์ด๋ฏธ์ง ํฌ๋งท๋ณ๋ก ๋ชฉ์ ์ ๋ฐ๋ผ ๊ตฌ์ฒด์ ์ผ๋ก ์ ๋ฆฌํด์ฃผ์ ์ ์ ๋ง ๋์ ๋์ด์! ํนํ WebP๋ AVIF์ฒ๋ผ ์ต๊ทผ ๋ง์ด ์ฌ์ฉ๋๋ ํฌ๋งท์ด ์ค์ ๋ก ์ผ๋ง๋ ์ฉ๋ ์ ๊ฐ ํจ๊ณผ๊ฐ ์๋์ง ์์น๋ก ์ ์ํด์ค์ ์ดํด๊ฐ ํ์คํ ๋์ต๋๋ค~
AVIF๋ ํ์ง์ด ์ข๋ค๊ณ ๋ค์๋๋ฐ ๋ธ๋ผ์ฐ์ ์ง์์ ์์ง WebP๋ณด๋ค ๋ถ์กฑํ ๊ฑธ๋ก ์๊ณ ์์ด์ ์ค์ ์ ์ฉํ ๋๋ ์ด๋ค ๊ธฐ์ค์ผ๋ก ์ ํํด์ผ ํ ์ง ๊ณ ๋ฏผ์ด ๋๋ ๊ฒ ๊ฐ์์...
ํน์ picture ํ๊ทธ๋ก ๋ ํฌ๋งท์ ํจ๊ป ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์ ์ฉํด๋ณด์ ์ ์ด ์์ผ์ ์ง ๊ถ๊ธํฉ๋๋ค!
์ค์ ์๋น์ค๋ฅผ ์์๋ก ๋ค์ด ํจ๊ป ์ค๋ช ํด์ฃผ์ ์ ์ดํด๋ ์ฝ๊ณ ๋ ํฅ๋ฏธ๋กญ๊ฒ ์ฝ์๋ ๊ฒ ๊ฐ์์. ํนํ ๊ฐ๋ฐ์๋๊ตฌ๋ฅผ ํตํด ๊ฐ์ ์ด ํ์ํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์ด๋ ์ ํํ ์์ธ๊ณผ ๊ฐ์ ์ ๋ต์ ๋์ถํด๋ด๋ ๊ฑด ์ฝ์ง ์๋ค๊ณ ์๊ฐํ๋๋ฐ, ๊ทธ ๋ถ๋ถ๊น์ง ๋ง์ด ๊ณ ๋ฏผํ์ ํ์ ์ด ๋๋ฌ๋๋ ๊ฒ ๊ฐ์์. ์ ์ง๋๊ป์ ๊ณํํ๊ณ ๊ณ์ ๊ฐ์ ์ ๋ต๋ค๋ก ์ด๋ ์ ๋์ ๊ฐ์ ์ด ์ด๋ฃจ์ด์ง์ง ๊ธฐ๋๋ฉ๋๋ค๐ฅ
๊ทธ๋ฆฌ๊ณ ์ ๋ ์ ์ง๋๊ณผ ๊ฐ์ด LCP๋ฅผ ๊ฐ์ ํด์ผ ํ๋ ๊ฒฝํ์ด ์๋๋ฐ ์ ๋ Lighthouse์์ ๊ฒฝ๊ณ ํ ๋ด์ฉ๋ค์ ๋ฐ์ํด๋ ๋์ ๋๋ ๊ฐ์ ์ด ์ด๋ฃจ์ด์ง์ง๋ ์๋๋ผ๊ตฌ์๐ฅฒ ์ ์ง๋์ ๋ค์์ 3๊ฐ์ง๋ฅผ ๋ฎ์ LCP์ ์์ธ์ผ๋ก ๋ฝ์ผ์ จ๋๋ฐ, ๊ทธ ์ด์ ์ ๊ณผ์ ์ด ๊ถ๊ธํฉ๋๋ค!
์ด๊ธฐ ๋ก๋ฉ ์ div.text-4xl.md:text-5xl.font-bold ์์๊ฐ ํฌํจ๋ ๋ฉ์ธ ํค๋ ์์ญ์ด ๋ ๋๋ง ์ง์ฐ ๋ฐ์
์ด๋ฏธ์ง, JS ๋ฒ๋ค, ๋๋ ํฐํธ ๋ก๋ฉ์ด ๋ ๋ ๋ธ๋กํน(Render Blocking) ์ผ๋ก ์์ฉํ์ ๊ฐ๋ฅ์ฑ ๋์
ํนํ, ํฐํธ ์์ฒญ์ด ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌ๋์ง ์๊ฑฐ๋ ์บ์๋์ง ์์ ๊ฒฝ์ฐ LCP๊ฐ ์ ํ๋ ์ ์์
์ ์ ์ด๋ฏธ์ง๋ public์ ์์น์์ผ๋ณด๋๊ฑด ์ด๋จ๊น์??
๋ฆฌ์ํธ ์ปดํ์ผ๋ฌ๊ฐ ๋ฆด๋ฆฌ์ฆ๋๋ฉด์ ์ปดํ์ผ๋ฌ๊ฐ React's rules๋ฅผ ์ด์ฉํ์ฌ, ์ปดํฌ๋ํธ์ Hooks ๋ด ๊ฐ๋ค๊ณผ ๊ทธ๋ฃน์ ๋ฉ๋ชจ์ ์ด์ ํ๋๋ฐ ๊ฐ๋ฐ์๊ฐ memo/useCallback์ ์ง์ ์ ์ฉํ ์ด์ ๊ฐ ๋ฐ๋ก ์์๊น์?? ์ง์ ์ ์ฉ์ ํด์ผํ๋ค๋ฉด ์ด๋ค ๊ฒฝ์ฐ์ผ๊น์!?
ํจ๋ ๊ด๋ จ ๋ด์ฉ์ ๊ณต๋ถํ ๋๋ ๊ธ๋ก๋ง ๋์ด ์์ด์ ๋ค์ ์ดํด๊ฐ ์ด๋ ค์ ๋๋ฐ, ์ ์ง๋์ ์ค์ ํ๋ก์ ํธ ์์๋ฅผ ๋ค์ด์ฃผ์
์ ํจ์ฌ ์ฝ๊ฒ ์ดํดํ ์ ์์์ต๋๋ค!
ํนํ T0~T3๋ก ๊ตฌ๋ถ๋ ์๊ฐ ํ๋ฆ์ ๋ฐ๋ฅธ ๋ ๋๋ง ๊ณผ์ ์ ๋ช
ํํ ์ ์ ์์ด์ ํฐ ๋์์ด ๋์ด์.
์ ์ง๋ ์ํฐํด ๋๋ถ์ ๊ทธ๋์ ๋ง์ฐํ๋ ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ํ๋ฆ์ด ์ ๋ฆฌ๋ ๊ฒ ๊ฐ์ต๋๋ค :)
ํจ๋์ ๋ํด ๊ณต๋ถํ ๋ ์์ ๋ก ์ ์ฉํด ๋ณผ๋งํ ์๋ฃ๊ฐ ์ ์ด์ ์ค์ ๋ก ์ด๋ป๊ฒ ํด๊ฒฐํ๋ ์ง์ ๊ด์ฌ์ด ์์๋๋ฐ, ๋ณธ์ธ์ด ์งํํ ํ๋ก์ ํธ์ ์ฎ์ด์ ์ค๋ช ํด์ฃผ์ ์ ๋ ์ฝ๊ฒ ์ดํดํ ์ ์์๋ค์ฉ
๋ธ๋ผ์ฐ์ ๋ ๋๋ง ๊ณผ์ ์ T2~T3์์ ํฐํธ ๋ก๋ฉ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๋ ์ ๋ ์๋กญ๊ฒ ์์๊ฐ๋๋ค!
์ด๋ฏธ์ง ์ต์ ํ ๊ธฐ๋ฒ์์ WebP, AVIF์ ๊ฐ์ ์ฐจ์ธ๋ ํฌ๋งท์ ์ ์ฉํ ๋,
<picture>์<source>ํ๊ทธ์srcset์์ฑ์ผ๋ก ์ง์ ๊ฐ๋ฅํ ์ด๋ฏธ์ง ํฌ๋งท๋ถํฐ ์ ์ฉ๋๊ฒ ํ ์๋ ์๋ค๊ณ ํด์