๐ Next.js App Router ์น ์ ๋๋ฆฌํฑ์ค ์ค์ ์๋ฒฝ ๊ฐ์ด๋
๐ Next.js App Router ์น ์ ๋๋ฆฌํฑ์ค ์ค์ ์๋ฒฝ ๊ฐ์ด๋
Next.js App Router๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ ํธ์์ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง, ์ฌ์ฉ์ ๋ถ์, ์คํํ
๋ ๋ฉํธ๋ฆฌ ๊ด์ธก๊น์ง ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํฉ๋๋ค.
์ค์ ์ด์ ํ๊ฒฝ์ ๊ณ ๋ คํด ์ค์ฉ์ ์ธ ๊ตฌ์ฑ๋ง ๋ค๋ฃน๋๋ค.
โ 1. Web Vitals ์ฑ๋ฅ ๋ฐ์ดํฐ ์์ง
Next.js๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์น ํผํฌ๋จผ์ค ์งํ(Core Web Vitals)๋ฅผ ์์งํ ์ ์๋ useReportWebVitals ํ ์ ์ ๊ณตํฉ๋๋ค.
์ฌ์ฉ๋ฒ
// app/_components/WebVitals.tsx
'use client';
import { useReportWebVitals } from 'next/web-vitals';
export function WebVitals() {
useReportWebVitals((metric) => {
console.log(metric);
// ์: ์ธ๋ถ ๋ถ์ ์๋น์ค๋ก ์ ์ก ๊ฐ๋ฅ
});
}
๋ฃจํธ ๋ ์ด์์์ ์ถ๊ฐํ๋ฉด ์ ์ญ ์ธก์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
// app/layout.tsx
import { WebVitals } from './_components/WebVitals';
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="ko">
<body>
<WebVitals />
{children}
</body>
</html>
);
}
์ฃผ์: ๋ฐ๋์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ฌ์ผ ํ๋ฉฐ, 'use client' ์ ์ธ์ด ํ์ํฉ๋๋ค.
โ 2. ํด๋ผ์ด์ธํธ ์ด๊ธฐํ ์ฝ๋ ์คํํ๊ธฐ
์ฑ์ด ์์ํ ๋ ์ ๋๋ฆฌํฑ์ค ์ด๊ธฐํ ์ฝ๋๋ ์๋ฌ ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋กํ๊ณ ์ถ๋ค๋ฉด instrumentation-client.ts ํ์ผ์ ํ์ฉํฉ๋๋ค.
์์
// instrumentation-client.ts
console.log('์ ๋๋ฆฌํฑ์ค ์์');
window.addEventListener('error', (event) => {
console.error('์ค๋ฅ ๋ฐ์', event.error);
// ์ค๋ฅ๋ฅผ ์ธ๋ถ ์๋ฒ๋ก ์ ์ก ๊ฐ๋ฅ
});
์ด ํ์ผ์ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ ์์ฑํ๊ณ , ์๋์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ด๊ธฐํ ๊ณผ์ ์ ํฌํจ๋ฉ๋๋ค.
โ 3. Google Analytics ์ฝ๊ฒ ์ฐ๊ฒฐํ๊ธฐ
Next.js๋ GA4๋ฅผ ์ฝ๊ฒ ์ฐ๋ํ ์ ์๋๋ก @next/third-parties ํจํค์ง๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ค์น
npm install @next/third-parties
์ฌ์ฉ๋ฒ
// app/layout.tsx
import { GoogleAnalytics } from '@next/third-parties/google';
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="ko">
<body>
{children}
<GoogleAnalytics gaId="G-XXXXXXX" />
</body>
</html>
);
}
- G-XXXXXXX๋ ๋ณธ์ธ์ Google Analytics ์ธก์ ID๋ก ๊ต์ฒดํฉ๋๋ค.
- ํ์ด์ง ์ด๋ ์ ์๋ ์ถ์ ๋ฉ๋๋ค.
์ฐธ๊ณ : Google Tag Manager๋ฅผ ์ฐ๋ ๊ฒฝ์ฐ, GA ์ง์ ์ฝ์ ๋์ GTM์ ํตํด ๊ด๋ฆฌํ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค.
โ 4. OpenTelemetry๋ฅผ ์ด์ฉํ ๊ณ ๊ธ ๊ด์ธก ์ค์
์ฑ ์ ์ฒด ํธ๋ํฝ, API ์๋ต ์๊ฐ, ์๋ฒ ์ฑ๋ฅ ๋ฑ์ ๋ชจ๋ํฐ๋งํ๊ณ ์ถ๋ค๋ฉด OpenTelemetry๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ค์ ์ ์ฐจ
- ํจํค์ง ์ค์น
npm install @vercel/otel @opentelemetry/sdk-logs @opentelemetry/api-logs @opentelemetry/instrumentation
- instrumentation.ts ํ์ผ ์์ฑ
// instrumentation.ts
import { registerOTel } from '@vercel/otel';
registerOTel();
- ์๋์ผ๋ก ํธ๋ ์ด์ค(trace), ๋ก๊ทธ, ๋ฉํธ๋ฆญ(metrics)์ ์์ง ๊ฐ๋ฅ
- Datadog, NewRelic, Jaeger ๋ฑ ๋ค์ํ ๋ฐฑ์๋์ ์ฐ๋ ๊ฐ๋ฅ
โ ์์ฝ ์ ๋ฆฌ
๊ธฐ๋ฅ ๊ตฌํ ๋ฐฉ๋ฒ ์์น/ํ์ผ
Web Vitals ์ธก์ | useReportWebVitals ํ | ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ |
ํด๋ผ์ด์ธํธ ์ด๊ธฐํ ์ฝ๋ | instrumentation-client.ts ์์ฑ | ๋ฃจํธ ๋๋ ํ ๋ฆฌ |
Google Analytics ์ฐ๋ | @next/third-parties ์ค์น ๋ฐ ์ฌ์ฉ | ๋ฃจํธ ๋ ์ด์์ |
OpenTelemetry ์ค์ | instrumentation.ts ์์ฑ ๋ฐ ๋ฑ๋ก | ๋ฃจํธ ๋๋ ํ ๋ฆฌ |
https://nextjs.org/docs/app/guides/analytics
Next.js, App Router, ์น ๋ถ์, Web Vitals, Google Analytics, OpenTelemetry, ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง, ํด๋ผ์ด์ธํธ ์ด๊ธฐํ, ๋ฐ์ดํฐ ์์ง, SEO ์ต์ ํ, ์๋ฒ ๊ด์ธก