๋ ๋น ๋ฅด๊ณ ์ ๊ทผ์ฑ์ด ๋ฐ์ด๋ ์น ๊ฒฝํ์ ์ํด Next.js์์ Core Web Vitals๋ฅผ ์ดํดํ๊ณ ์ต์ ํํ๋ ํฌ๊ด์ ์ธ ๊ฐ์ด๋.
Next.js ์ฑ๋ฅ: ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ํต์ฌ ์น ๋ฐ์ดํ ์ต์ ํ
์ค๋๋ ์ ๋์งํธ ํ๊ฒฝ์์ ์น์ฌ์ดํธ ์ฑ๋ฅ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ก๋ฉ ์๋๊ฐ ๋๋ฆฌ๊ฑฐ๋ ์๋ต์ฑ์ด ์๋ ์น์ฌ์ดํธ๋ ์ฌ์ฉ์ ๋ถ๋ง์ ์ด๋ํ๊ณ , ์ดํ๋ฅ ์ ๋์ด๋ฉฐ, ๊ถ๊ทน์ ์ผ๋ก ๋น์ฆ๋์ค ์์ค๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๊ธ๋ก๋ฒ ๊ท๋ชจ๋ก ์ด์๋๋ ๊ธฐ์ ์ ๊ฒฝ์ฐ, ๋ค์ํ ์ง๋ฆฌ์ ์์น์ ๋คํธ์ํฌ ํ๊ฒฝ์์ ์ฌ์ฉ์๋ฅผ ์ํด ์ต์ ์ ์ฑ๋ฅ์ ๋ณด์ฅํ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ค์ํฉ๋๋ค. ๋ฐ๋ก ์ฌ๊ธฐ์ Core Web Vitals(CWV)๊ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
Core Web Vitals๋ ์น์์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ธก์ ํ๊ธฐ ์ํด Google์์ ๋์ ํ ํ์คํ๋ ์งํ ์งํฉ์ ๋๋ค. ๋ก๋ฉ ์ฑ๋ฅ, ์ํธ ์์ฉ, ์๊ฐ์ ์์ ์ฑ์ ์ธ ๊ฐ์ง ์ฃผ์ ์ธก๋ฉด์ ์ค์ ์ ๋ก๋๋ค. ์ด๋ฌํ ์งํ๋ SEO ๋ฐ ์ ๋ฐ์ ์ธ ์ฌ์ฉ์ ๋ง์กฑ๋์ ์ ์ ๋ ์ค์ํด์ง๊ณ ์์ผ๋ฉฐ, Next.js ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ์ด๋ฅผ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๊ฒ์ ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ์ฑ๋ฅ ์ข๊ณ ์ ๊ทผ์ฑ์ด ๋ฐ์ด๋ ์น์ฌ์ดํธ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
Core Web Vitals ์ดํด
๊ฐ Core Web Vitals๋ฅผ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Largest Contentful Paint (LCP)
LCP๋ ๊ฐ์ฅ ํฐ ์ฝํ ์ธ ์์(์: ์ด๋ฏธ์ง, ๋น๋์ค ๋๋ ํ ์คํธ ๋ธ๋ก)๊ฐ ๋ทฐํฌํธ ๋ด์์ ํ์๋๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ธก์ ํฉ๋๋ค. ์ด๋ ์ฌ์ฉ์์๊ฒ ํ์ด์ง์ ์ฃผ์ ์ฝํ ์ธ ๊ฐ ์ผ๋ง๋ ๋นจ๋ฆฌ ๋ก๋ฉ๋๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ข์ LCP ์ ์๋ 2.5์ด ์ดํ์ ๋๋ค.
๊ธ๋ก๋ฒ ์ํฅ: LCP๋ ์ ์ธ๊ณ ์ฌ๋ฌ ์ง์ญ์์ ํํ ๋ฐ์ํ๋ ๋๋ฆฐ ์ธํฐ๋ท ์ฐ๊ฒฐ์ ์ฌ์ฉํ๋ ์ฌ์ฉ์์๊ฒ ํนํ ์ค์ํฉ๋๋ค. LCP๋ฅผ ์ต์ ํํ๋ฉด ๋คํธ์ํฌ ์๋์ ๊ด๊ณ์์ด ๋ณด๋ค ์ผ๊ด๋ ๊ฒฝํ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
LCP๋ฅผ ์ํ Next.js ์ต์ ํ ๊ธฐ์ :
- ์ด๋ฏธ์ง ์ต์ ํ: Next.js
<Image>๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด ๊ตฌ์ฑ ์์๋ ํฌ๊ธฐ ์กฐ์ , ํ์ ๋ณํ(WebP ์ง์ ์) ๋ฐ ์ง์ฐ ๋ก๋ฉ์ ํฌํจํ ์๋ ์ด๋ฏธ์ง ์ต์ ํ๋ฅผ ์ ๊ณตํฉ๋๋ค.priority={true}๋ฅผ ์ค์ ํ์ฌ ์ฒซ ํ๋ฉด์ ํ์๋๋ ์ด๋ฏธ์ง๋ฅผ ์ฐ์ ์ํฉ๋๋ค. - ์ฝ๋ ๋ถํ : JavaScript ์ฝ๋๋ฅผ ํ์์ ๋ฐ๋ผ ๋ก๋๋๋ ๋ ์์ ์ฒญํฌ๋ก ๋๋๋๋ค. Next.js๋ ๋ผ์ฐํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฝ๋๋ฅผ ์๋์ผ๋ก ๋ถํ ํ์ง๋ง, ์ฆ์ ํ์ํ์ง ์์ ๊ตฌ์ฑ ์์์ ๋์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๊ฐ๋ก ์ต์ ํํ ์ ์์ต๋๋ค.
- ์๋ฒ ์๋ต ์๊ฐ ์ต์ ํ: ์๋ฒ๊ฐ ์์ฒญ์ ์ ์ํ๊ฒ ์๋ตํ ์ ์๋๋ก ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ์ต์ ํ, ์์ฃผ ์ก์ธ์คํ๋ ๋ฐ์ดํฐ ์บ์ฑ, ์ง๋ฆฌ์ ์ผ๋ก ๋ถ์ฐ๋ ์๋ฒ์์ ์ ์ ์์ฐ์ ์ ๊ณตํ๊ธฐ ์ํ CDN(Content Delivery Network) ์ฌ์ฉ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
- ์ค์ํ ๋ฆฌ์์ค ๋ฏธ๋ฆฌ ๋ก๋:
<link rel="preload">๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์ ํ์ด์ง ๋ก๋ฉ ํ๋ก์ธ์ค ์ด๊ธฐ์ ์ค์ํ ๋ฆฌ์์ค(CSS, ๊ธ๊ผด ๋ฐ ์ด๋ฏธ์ง ๋ฑ)๋ฅผ ๋ค์ด๋ก๋ํ๋๋ก ์ง์ํฉ๋๋ค. - CSS ์ ๋ฌ ์ต์ ํ: CSS๋ฅผ ์ต์ํํ๊ณ ์ค์ํ์ง ์์ CSS๋ฅผ ์ง์ฐํ์ฌ ๋ ๋๋ง ์ฐจ๋จ์ ๋ฐฉ์งํฉ๋๋ค. PurgeCSS์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉํ์ง ์๋ CSS๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
์์ (Next.js๋ฅผ ์ฌ์ฉํ ์ด๋ฏธ์ง ์ต์ ํ):
import Image from 'next/image';
function MyComponent() {
return (
<Image
src="/images/hero-image.jpg"
alt="A beautiful landscape"
width={1920}
height={1080}
priority={true}
/>
);
}
First Input Delay (FID)
FID๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ฌ์ฉ์์ ์ฒซ ๋ฒ์งธ ์ํธ ์์ฉ(์: ๋งํฌ ํด๋ฆญ ๋๋ ๋ฒํผ ๋๋ฅด๊ธฐ)์ ์๋ตํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ธก์ ํฉ๋๋ค. ์ข์ FID ์ ์๋ 100๋ฐ๋ฆฌ์ด ์ดํ์ฌ์ผ ํฉ๋๋ค. FID๋ ์ธ์ง๋ ์๋ต์ฑ๊ณผ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
๊ธ๋ก๋ฒ ์ํฅ: FID๋ JavaScript ์คํ ์๊ฐ์ ํนํ ๋ฏผ๊ฐํฉ๋๋ค. ๊ฐ๋ฐ ๋์๊ตญ์์ ํํ ์ฌ์ฉ๋๋ ์ ์ ๋ ฅ ์ฅ์น์ ์ฌ์ฉ์๋ JavaScript๊ฐ ์ต์ ํ๋์ง ์์ ๊ฒฝ์ฐ ๋ ๊ธด ์ง์ฐ์ ๊ฒฝํํ๊ฒ ๋ฉ๋๋ค.
FID๋ฅผ ์ํ Next.js ์ต์ ํ ๊ธฐ์ :
- JavaScript ์คํ ์๊ฐ ์ต์ํ: ๋ธ๋ผ์ฐ์ ์์ ๊ตฌ๋ฌธ ๋ถ์, ์ปดํ์ผ ๋ฐ ์คํํด์ผ ํ๋ JavaScript์ ์์ ์ค์ ๋๋ค. ์ด๋ ์ฝ๋ ๋ถํ , ํธ๋ฆฌ ์์ดํน(์ฌ์ฉํ์ง ์๋ ์ฝ๋ ์ ๊ฑฐ) ๋ฐ ์ฑ๋ฅ์ ์ํด JavaScript ์ฝ๋ ์ต์ ํ๋ฅผ ํตํด ๋ฌ์ฑํ ์ ์์ต๋๋ค.
- ๊ธด ์์
๋ถํ : ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ๋ ๊ธด ์์
์ ํผํฉ๋๋ค.
setTimeout๋๋requestAnimationFrame์ ์ฌ์ฉํ์ฌ ๊ธด ์์ ์ ๋ ์๊ณ ๋น๋๊ธฐ์ ์ธ ์์ ์ผ๋ก ๋๋๋๋ค. - Web Workers: Web Workers๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์ ๋ฉ์ธ ์ค๋ ๋์์ ์ด๋ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฉ์ธ ์ค๋ ๋๊ฐ ์ฐจ๋จ๋์ง ์์ผ๋ฉฐ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๊ฐ ์๋ต์ฑ์ ์ ์งํฉ๋๋ค.
- ํ์ฌ ์คํฌ๋ฆฝํธ: FID์ ๋ํ ํ์ฌ ์คํฌ๋ฆฝํธ(์: ๋ถ์, ๊ด๊ณ , ์์ ๋ฏธ๋์ด ์์ ฏ)์ ์ํฅ์ ์ ์คํ๊ฒ ํ๊ฐํฉ๋๋ค. ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํ๊ฑฐ๋ ๊ธฐ๋ณธ ์ฝํ ์ธ ๊ฐ ๋ก๋๋ ํ์ ๋ก๋ฉ์ ์ง์ฐํฉ๋๋ค.
์์ (setTimeout์ ์ฌ์ฉํ์ฌ ๊ธด ์์
๋ถํ ):
function processData(data) {
const chunkSize = 100;
let i = 0;
function processChunk() {
for (let j = 0; j < chunkSize; j++) {
if (i >= data.length) {
return;
}
// Perform some processing on data[i]
console.log(`Processing item ${i}`);
i++;
}
setTimeout(processChunk, 0);
}
processChunk();
}
์ฐธ๊ณ : ์ด ์ฐจ๋จ ์๊ฐ(TBT)์ FID์ ์ค์ ์ฌ์ฉ์ ์ํธ ์์ฉ ๋ฐ์ดํฐ๊ฐ ํ์ํ๋ฏ๋ก ๊ฐ๋ฐ ์ค์ FID์ ํ๋ก์๋ก ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
Cumulative Layout Shift (CLS)
CLS๋ ํ์ด์ง ๋ก๋ฉ ์ค์ ๋ฐ์ํ๋ ์์์น ๋ชปํ ๋ ์ด์์ ์ด๋์ ์์ ์ธก์ ํฉ๋๋ค. ์์์น ๋ชปํ ๋ ์ด์์ ์ด๋์ ์ฌ์ฉ์๊ฐ ํ์ด์ง์์ ์์น๋ฅผ ์๊ฑฐ๋ ์ค์๋ก ์๋ชป๋ ์์๋ฅผ ํด๋ฆญํ๊ฒ ํ ์ ์์ผ๋ฏ๋ก ์ฌ์ฉ์์๊ฒ ๋ต๋ตํจ์ ์ ๋ฐํ ์ ์์ต๋๋ค. ์ข์ CLS ์ ์๋ 0.1 ์ดํ์ ๋๋ค.
๊ธ๋ก๋ฒ ์ํฅ: CLS ๋ฌธ์ ๋ ์ธํฐ๋ท ์ฐ๊ฒฐ ์๋๊ฐ ๋๋ฆด ๊ฒฝ์ฐ, ์์๊ฐ ์์๋๋ก ๋ก๋๋์ง ์์ ๋ ํฐ ์ด๋์ ์ ๋ฐํ ์ ์์ผ๋ฏ๋ก ์ ํ๋ ์ ์์ต๋๋ค. ๋ํ ๋ค์ํ ์ด์ ์ฒด์ ์์ ๋ค๋ฅธ ๊ธ๊ผด ๋ ๋๋ง์ CLS์ ์ํฅ์ ๋ฏธ์น ์ ์์ผ๋ฉฐ, ์ด๋ ๋ค์ํ ์ด์ ์ฒด์ ์ฌ์ฉ์ด ์๋ ๊ตญ๊ฐ์์ ๋ ์ค์ํฉ๋๋ค.
CLS๋ฅผ ์ํ Next.js ์ต์ ํ ๊ธฐ์ :
- ์ด๋ฏธ์ง ๋ฐ ๊ด๊ณ ์ ๋ํ ๊ณต๊ฐ ํ๋ณด: ํญ์ ์ด๋ฏธ์ง ๋ฐ ๋น๋์ค์
width๋ฐheight์์ฑ์ ์ง์ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ฌํ ์์๊ฐ ๋ก๋๋๊ธฐ ์ ์ ์ ์ ํ ์์ ๊ณต๊ฐ์ ํ๋ณดํ์ฌ ๋ ์ด์์ ์ด๋์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ๊ด๊ณ ์ ๊ฒฝ์ฐ ์์ ๊ด๊ณ ํฌ๊ธฐ์ ๋ฐ๋ผ ์ถฉ๋ถํ ๊ณต๊ฐ์ ํ๋ณดํฉ๋๋ค. - ๊ธฐ์กด ์ฝํ ์ธ ์์ ์ฝํ ์ธ ์ฝ์ ๋ฐฉ์ง: ํ์ด์ง๊ฐ ์ด๋ฏธ ๋ก๋๋ ํ ํนํ ๊ธฐ์กด ์ฝํ ์ธ ์์ ์ ์ฝํ ์ธ ์ฝ์ ์ ์ต์ํํฉ๋๋ค. ์ฝํ ์ธ ๋ฅผ ๋์ ์ผ๋ก ์ฝ์ ํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ฏธ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํฉ๋๋ค.
- CSS
transform์ฌ์ฉ ๋์top,right,bottom๋ฐleft์ฌ์ฉ:transform์์ฑ ๋ณ๊ฒฝ์ ๋ ์ด์์ ์ด๋์ ํธ๋ฆฌ๊ฑฐํ์ง ์์ต๋๋ค. - ๊ธ๊ผด ์ต์ ํ: ๊ธ๊ผด์ด ํ
์คํธ ๋ ๋๋ง ์ ์ ๋ก๋๋์ด ๊ธ๊ผด์ผ๋ก ์ธํ ๋ ์ด์์ ์ด๋(FOIT ๋๋ FOUT)์ ๋ฐฉ์งํฉ๋๋ค. CSS์์
font-display: swap;๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ง์ ๊ธ๊ผด์ด ๋ก๋๋๋ ๋์ ๋์ฒด ๊ธ๊ผด๋ก ํ ์คํธ๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
์์ (์ด๋ฏธ์ง ๊ณต๊ฐ ํ๋ณด):
<Image
src="/images/example.jpg"
alt="Example Image"
width={640}
height={480}
/>
Core Web Vitals ์ธก์ ๋ฐ ๊ฐ์ ๋๊ตฌ
Next.js์์ Core Web Vitals๋ฅผ ์ธก์ ํ๊ณ ๊ฐ์ ํ๋ ๋ฐ ๋์์ด ๋๋ ๋ช ๊ฐ์ง ๋๊ตฌ๊ฐ ์์ต๋๋ค.
- Lighthouse: Chrome DevTools์ ๋ด์ฅ๋ ๋๊ตฌ๋ก, ํฌ๊ด์ ์ธ ์ฑ๋ฅ ๊ฐ์ฌ ๋ฐ ๊ถ์ฅ ์ฌํญ์ ์ ๊ณตํฉ๋๋ค. ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ํด๊ฒฐํ๋ ค๋ฉด Lighthouse ๊ฐ์ฌ๋ฅผ ์ ๊ธฐ์ ์ผ๋ก ์คํํ์ญ์์ค.
- PageSpeed Insights: Lighthouse์ ์ ์ฌํ ์ฑ๋ฅ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ๋ ์น ๊ธฐ๋ฐ ๋๊ตฌ์ ๋๋ค. ๋ํ ๋ชจ๋ฐ์ผ ์ฅ์น ๊ด๋ จ ๊ถ์ฅ ์ฌํญ๋ ์ ๊ณตํฉ๋๋ค.
- Web Vitals Chrome Extension: ์น์ ํ์ํ ๋ ์ค์๊ฐ์ผ๋ก Core Web Vitals ์งํ๋ฅผ ํ์ํ๋ Chrome ํ์ฅ ํ๋ก๊ทธ๋จ์ ๋๋ค.
- Google Search Console: ์ค์ ์ฌ์ฉ์๊ฐ ๊ฒฝํํ ์น์ฌ์ดํธ์ Core Web Vitals ์ฑ๋ฅ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ฌ์ดํธ๊ฐ ์ค์ ํ๊ฒฝ์์ ์ฑ๋ฅ์ด ์ ์กฐํ ์์ญ์ ์๋ณํ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค.
- WebPageTest: ์ฌ๋ฌ ์์น ๋ฐ ๋ธ๋ผ์ฐ์ ์์ ์น์ฌ์ดํธ ์ฑ๋ฅ์ ํ ์คํธํ๊ธฐ ์ํ ๊ณ ๊ธ ์จ๋ผ์ธ ๋๊ตฌ์ ๋๋ค.
- Next.js Analyzer: `@next/bundle-analyzer`์ ๊ฐ์ ํ๋ฌ๊ทธ์ธ์ Next.js ์ ํ๋ฆฌ์ผ์ด์ ์์ ํฐ ๋ฒ๋ค์ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
Next.js ๊ด๋ จ ์ต์ ํ
Next.js๋ Core Web Vitals๋ฅผ ํฌ๊ฒ ๊ฐ์ ํ ์ ์๋ ๋ช ๊ฐ์ง ๋ด์ฅ ๊ธฐ๋ฅ๊ณผ ์ต์ ํ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์๋ ์ฝ๋ ๋ถํ : Next.js๋ JavaScript ์ฝ๋๋ฅผ ๋ผ์ฐํธ์ ๋ฐ๋ผ ์์ ์ฒญํฌ๋ก ์๋์ผ๋ก ๋ถํ ํ์ฌ ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ ์ค์ ๋๋ค.
- ์ด๋ฏธ์ง ์ต์ ํ (
next/image):<Image>๊ตฌ์ฑ ์์๋ ํฌ๊ธฐ ์กฐ์ , ํ์ ๋ณํ ๋ฐ ์ง์ฐ ๋ก๋ฉ์ ํฌํจํ ์๋ ์ด๋ฏธ์ง ์ต์ ํ๋ฅผ ์ ๊ณตํฉ๋๋ค. - ์ ์ ์ฌ์ดํธ ์์ฑ (SSG): ์์ฃผ ๋ณ๊ฒฝ๋์ง ์๋ ์ฝํ ์ธ ์ ๋ํด ๋น๋ ์ ์ ์ HTML ํ์ด์ง๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ LCP ๋ฐ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ์๋ฒ ์ธก ๋ ๋๋ง (SSR): ๋์ ๋ฐ์ดํฐ ๋๋ ์ฌ์ฉ์ ์ธ์ฆ์ด ํ์ํ ์ฝํ ์ธ ์ ๋ํด ์๋ฒ์์ ํ์ด์ง๋ฅผ ๋ ๋๋งํฉ๋๋ค. SSR์ ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ ๊ฐ์ ํ ์ ์์ง๋ง TTFB(Time to First Byte)๋ฅผ ์ฆ๊ฐ์ํฌ ์๋ ์์ต๋๋ค. TTFB๋ฅผ ์ต์ํํ๋ ค๋ฉด ์๋ฒ ์ธก ์ฝ๋๋ฅผ ์ต์ ํํ์ญ์์ค.
- ์ ์ง์ ์ ์ ์ฌ์์ฑ (ISR): ๋น๋ ์ ์ ์ ํ์ด์ง๋ฅผ ์์ฑํ ๋ค์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ค์ ์์ฑํ์ฌ SSG ๋ฐ SSR์ ์ด์ ์ ๊ฒฐํฉํฉ๋๋ค. ์ด๋ฅผ ํตํด ์บ์๋ ์ ์ ์ฝํ ์ธ ๋ฅผ ์ ๊ณตํ๋ ๋์์ ์ฝํ ์ธ ๋ฅผ ์ต์ ์ํ๋ก ์ ์งํ ์ ์์ต๋๋ค.
- ๊ธ๊ผด ์ต์ ํ (
next/font): Next.js 13์ ๋์ ๋ ์ด ๋ชจ๋์ ๊ธ๊ผด์ ๋ก์ปฌ๋ก ์๋ ํธ์คํ ํ๊ณ CSS๋ฅผ ์ธ๋ผ์ธํ์ฌ ๋ ์ด์์ ์ด๋์ ์ค์์ผ๋ก์จ ์ต์ ํ๋ ๊ธ๊ผด ๋ก๋ฉ์ ํ์ฉํฉ๋๋ค.
CDN(Content Delivery Network) ๋ฐ ๊ธ๋ก๋ฒ ์ฑ๋ฅ
CDN(Content Delivery Network)์ ์ง๋ฆฌ์ ์ผ๋ก ๋ถ์ฐ๋ ์๋ฒ ๋คํธ์ํฌ๋ก, ์ ์ ์์ฐ(์: ์ด๋ฏธ์ง, CSS, JavaScript)์ ์บ์ํ๊ณ ์ฌ์ฉ์์๊ฒ ๊ฐ์ฅ ๊ฐ๊น์ด ์๋ฒ์์ ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค. CDN์ ์ฌ์ฉํ๋ฉด ์ ์ธ๊ณ ์ฌ์ฉ์์ LCP ๋ฐ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ CDN ์ ํ ์ ์ฃผ์ ๊ณ ๋ ค ์ฌํญ:
- ๊ธ๋ก๋ฒ ๋ฒ์: ์ฌ์ฉ์๊ฐ ์๋ ์ง์ญ์ CDN์ด ๋ง์ ์๋ฒ ๋คํธ์ํฌ๋ฅผ ๊ฐ๋๋ก ํฉ๋๋ค.
- ์ฑ๋ฅ: ๋น ๋ฅธ ์ ์ก ์๋์ ๋ฎ์ ๋๊ธฐ ์๊ฐ์ ์ ๊ณตํ๋ CDN์ ์ ํํฉ๋๋ค.
- ๋ณด์: DDoS ๋ฐฉ์ง ๋ฐ SSL/TLS ์ํธํ์ ๊ฐ์ ๊ฐ๋ ฅํ ๋ณด์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ CDN์ ์ ํํฉ๋๋ค.
- ๋น์ฉ: ๋ค์ํ CDN์ ๊ฐ๊ฒฉ ๋ชจ๋ธ์ ๋น๊ตํ๊ณ ์์ฐ์ ๋ง๋ ๊ฒ์ ์ ํํฉ๋๋ค.
์ธ๊ธฐ ์๋ CDN ์ ๊ณต์ ์ฒด:
- Cloudflare
- Akamai
- Amazon CloudFront
- Fastly
์ ๊ทผ์ฑ ๊ณ ๋ ค ์ฌํญ
Core Web Vitals๋ฅผ ์ต์ ํํ๋ ๋์ ์ ๊ทผ์ฑ๋ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ฑ๋ฅ์ด ์ข์ ์น์ฌ์ดํธ๊ฐ ๋ฐ๋์ ์ ๊ทผ ๊ฐ๋ฅํ ์น์ฌ์ดํธ๋ ์๋๋๋ค. WCAG(Web Content Accessibility Guidelines)๋ฅผ ๋ฐ๋ผ ์น์ฌ์ดํธ๋ฅผ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์๊ฐ ์ ๊ทผํ ์ ์๋๋ก ํฉ๋๋ค.
์ฃผ์ ์ ๊ทผ์ฑ ๊ณ ๋ ค ์ฌํญ:
- ์๋งจํฑ HTML: ์๋งจํฑ HTML ์์(์:
<article>,<nav>,<aside>)๋ฅผ ์ฌ์ฉํ์ฌ ์ฝํ ์ธ ๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. - ์ด๋ฏธ์ง ๋์ฒด ํ ์คํธ: ๋ชจ๋ ์ด๋ฏธ์ง์ ๋ํ ์ค๋ช ๋์ฒด ํ ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ํค๋ณด๋ ํ์: ํค๋ณด๋๋ฅผ ์ฌ์ฉํ์ฌ ์น์ฌ์ดํธ๋ฅผ ์์ ํ ํ์ํ ์ ์๋๋ก ํฉ๋๋ค.
- ์์ ๋๋น: ํ ์คํธ์ ๋ฐฐ๊ฒฝ์ ๊ฐ์ ์ถฉ๋ถํ ์์ ๋๋น๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ARIA ์์ฑ: ARIA ์์ฑ์ ์ฌ์ฉํ์ฌ ๋ณด์กฐ ๊ธฐ์ ์ ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ชจ๋ํฐ๋ง ๋ฐ ์ง์์ ์ธ ๊ฐ์
Core Web Vitals๋ฅผ ์ต์ ํํ๋ ๊ฒ์ ์ผํ์ฑ ์์ ์ด ์๋๋๋ค. ์ง์์ ์ธ ๋ชจ๋ํฐ๋ง๊ณผ ๊ฐ์ ์ด ํ์ํ ์ง์์ ์ธ ํ๋ก์ธ์ค์ ๋๋ค. ์์ ์ธ๊ธ๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์น์ฌ์ดํธ์ ์ฑ๋ฅ์ ์ ๊ธฐ์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ํ์์ ๋ฐ๋ผ ์กฐ์ ํฉ๋๋ค.
์ฃผ์ ๋ชจ๋ํฐ๋ง ๋ฐ ๊ฐ์ ์ค์ต:
- ์ฑ๋ฅ ์์ฐ ์ค์ : ์ฃผ์ ์งํ(์: LCP, FID, CLS)์ ๋ํ ์ฑ๋ฅ ์์ฐ์ ์ ์ํ๊ณ ์ด๋ฌํ ์์ฐ์ ๋ํ ์งํ ์ํฉ์ ์ถ์ ํฉ๋๋ค.
- A/B ํ ์คํธ: A/B ํ ์คํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ์ต์ ํ ๊ธฐ์ ์ ์ํฅ์ ํ๊ฐํฉ๋๋ค.
- ์ฌ์ฉ์ ํผ๋๋ฐฑ: ์ฌ์ฉ์ ํผ๋๋ฐฑ์ ์์งํ์ฌ ์น์ฌ์ดํธ๋ฅผ ๊ฐ์ ํ ์ ์๋ ์์ญ์ ์๋ณํฉ๋๋ค.
- ์ต์ ์ ๋ณด ์ ์ง: ์ต์ ์น ์ฑ๋ฅ ๋ชจ๋ฒ ์ฌ๋ก ๋ฐ Next.js ์ ๋ฐ์ดํธ๋ฅผ ์ต์ ์ํ๋ก ์ ์งํฉ๋๋ค.
์ฌ๋ก ์ฐ๊ตฌ: ๊ธ๋ก๋ฒ ๊ธฐ์ ๋ฐ Next.js ์ฑ๋ฅ ์ต์ ํ
๊ธ๋ก๋ฒ ๊ธฐ์ ์ด Next.js ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ๋ง๊ฒ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ๊ฒํ ํ๋ฉด ๊ท์คํ ํต์ฐฐ๋ ฅ์ ์ป์ ์ ์์ต๋๋ค.
์์ 1: ๊ตญ์ ์ ์ ์๊ฑฐ๋ ํ๋ซํผ
์ฌ๋ฌ ๊ตญ๊ฐ์ ๊ณ ๊ฐ์๊ฒ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ๋๊ท๋ชจ ์ ์ ์๊ฑฐ๋ ํ์ฌ๋ ์ ํ ์ธ๋ถ ์ ๋ณด ํ์ด์ง์ Next.js๋ฅผ ์ฌ์ฉํ์ต๋๋ค. <Image> ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง ์ต์ ํ, ์ฒซ ํ๋ฉด ์๋ ์ด๋ฏธ์ง ์ง์ฐ ๋ก๋ฉ, ์ฃผ์ ์ง์ญ์ ์๋ฒ๊ฐ ์๋ CDN ์ฌ์ฉ์ ์ค์ ์ ๋์์ต๋๋ค. ๋ํ ์ด๊ธฐ JavaScript ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ด๊ธฐ ์ํด ์ฝ๋ ๋ถํ ์ ๊ตฌํํ์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ LCP๊ฐ 40% ํฅ์๋์์ผ๋ฉฐ, ํนํ ์ธํฐ๋ท ์ฐ๊ฒฐ์ด ๋๋ฆฐ ์ง์ญ์์ ์ดํ๋ฅ ์ด ํฌ๊ฒ ๊ฐ์ํ์ต๋๋ค.
์์ 2: ๊ธ๋ก๋ฒ ๋ด์ค ๊ธฐ๊ด
๊ธ๋ก๋ฒ ๋ด์ค ๊ธฐ๊ด์ ์น์ฌ์ดํธ์ Next.js๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ๋ด์ค ๊ธฐ์ฌ๋ฅผ ๋น ๋ฅด๊ฒ ์ ๊ณตํ๋ ๋ฐ ์ค์ ์ ๋์์ต๋๋ค. ๊ธฐ์ฌ์ SSG(์ ์ ์ฌ์ดํธ ์์ฑ)๋ฅผ ํ์ฉํ๊ณ ์ฝํ ์ธ ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์ ๋ฐ์ดํธํ๊ธฐ ์ํด ISR(์ ์ง์ ์ ์ ์ฌ์์ฑ)์ ๊ฒฐํฉํ์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์๋ฒ ๋ก๋๋ฅผ ์ต์ํํ๊ณ ์์น์ ๊ด๊ณ์์ด ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ๋น ๋ฅธ ๋ก๋ฉ ์๊ฐ์ ๋ณด์ฅํ์ต๋๋ค. ๋ํ CLS๋ฅผ ์ค์ด๊ธฐ ์ํด ๊ธ๊ผด ๋ก๋ฉ์ ์ต์ ํํ์ต๋๋ค.
ํผํด์ผ ํ ์ผ๋ฐ์ ์ธ ํจ์
Next.js์ ๋ด์ฅ๋ ์ต์ ํ ๊ธฐ๋ฅ์ด ์๋๋ผ๋ ๊ฐ๋ฐ์๋ ์ฌ์ ํ ์ฑ๋ฅ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น๋ ์ค์๋ฅผ ํ ์ ์์ต๋๋ค. ํผํด์ผ ํ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ํจ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํด๋ผ์ด์ธํธ ์ธก ๋ ๋๋ง(CSR)์ ๋ํ ๊ณผ๋ํ ์์กด: Next.js๋ SSR ๋ฐ SSG๋ฅผ ์ ๊ณตํ์ง๋ง CSR์ ํฌ๊ฒ ์์กดํ๋ฉด ์ฑ๋ฅ ์ด์ ์ ๋ง์ ๋ถ๋ถ์ ๋ฌดํจํํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก SSR ๋๋ SSG๊ฐ ์ฝํ ์ธ ๊ฐ ๋ง์ ํ์ด์ง์ ๋ ์ ํฉํฉ๋๋ค.
- ์ต์ ํ๋์ง ์์ ์ด๋ฏธ์ง:
<Image>๊ตฌ์ฑ ์์๊ฐ ์๋๋ผ๋ ์ด๋ฏธ์ง ์ต์ ํ๋ฅผ ์ํํ ํ๋ฉด ์ฌ๊ฐํ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ํญ์ ์ด๋ฏธ์ง๊ฐ ์ ์ ํ ํฌ๊ธฐ๋ก ์กฐ์ ๋๊ณ , ์์ถ๋๋ฉฐ, WebP์ ๊ฐ์ ์ต์ ํ์์ผ๋ก ์ ๊ณต๋๋์ง ํ์ธํ์ญ์์ค. - ํฐ JavaScript ๋ฒ๋ค: ์ฝ๋ ๋ถํ ๋ฐ ํธ๋ฆฌ ์์ดํน์ ์ํํ์ง ๋ชปํ๋ฉด ์ด๊ธฐ ๋ก๋ฉ ์๋๋ฅผ ๋ฆ์ถ๋ ํฐ JavaScript ๋ฒ๋ค์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ฒ๋ค์ ์ ๊ธฐ์ ์ผ๋ก ๋ถ์ํ๊ณ ์ต์ ํ ์์ญ์ ์๋ณํ์ญ์์ค.
- ํ์ฌ ์คํฌ๋ฆฝํธ ๋ฌด์: ํ์ฌ ์คํฌ๋ฆฝํธ๋ ์ฑ๋ฅ์ ์๋นํ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ๊ฐ๋ฅํ๋ฉด ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํ๊ฑฐ๋ ์ง์ฐํ๊ณ ์ํฅ์ ์ ์คํ๊ฒ ํ๊ฐํ์ญ์์ค.
- ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ์คํจ: ์ฑ๋ฅ์ ์ ๊ธฐ์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ๊ฐ์ ์์ญ์ ์๋ณํ์ง ๋ชปํ๋ฉด ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ์ ์ฐจ์ ์ผ๋ก ์ ํ๋ ์ ์์ต๋๋ค. ๊ฐ๋ ฅํ ๋ชจ๋ํฐ๋ง ์ ๋ต์ ๊ตฌํํ๊ณ ์น์ฌ์ดํธ์ ์ฑ๋ฅ์ ์ ๊ธฐ์ ์ผ๋ก ๊ฐ์ฌํ์ญ์์ค.
๊ฒฐ๋ก
Next.js์์ Core Web Vitals๋ฅผ ์ต์ ํํ๋ ๊ฒ์ ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ์ฑ๋ฅ์ด ์ข๊ณ , ์ ๊ทผ ๊ฐ๋ฅํ๋ฉฐ, ์ฌ์ฉ์ ์นํ์ ์ธ ์น์ฌ์ดํธ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ ๋๋ค. Core Web Vitals ์งํ๋ฅผ ์ดํดํ๊ณ , ์ด ๊ฐ์ด๋์์ ์ค๋ช ํ ์ต์ ํ ๊ธฐ์ ์ ๊ตฌํํ๊ณ , ์น์ฌ์ดํธ์ ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๋ฉด ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํด ๊ธ์ ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํ ์ ์์ต๋๋ค. ์ ๊ทผ์ฑ์ ์ฑ๋ฅ๊ณผ ํจ๊ป ๊ณ ๋ คํ์ฌ ํฌ๊ด์ ์ธ ์น ๊ฒฝํ์ ๋ง๋ค ์ ์์ต๋๋ค. Core Web Vitals๋ฅผ ์ฐ์ ์ํจ์ผ๋ก์จ ๊ฒ์ ์์ง ์์๋ฅผ ๊ฐ์ ํ๊ณ , ์ฌ์ฉ์ ์ฐธ์ฌ๋ฅผ ๋๋ฆฌ๊ณ , ๊ถ๊ทน์ ์ผ๋ก ๋น์ฆ๋์ค ์ฑ๊ณต์ ์ด๋ ์ ์์ต๋๋ค.