ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

๐Ÿชฒ Next.js ๋””๋ฒ„๊น… ๊ฐ€์ด๋“œ

Next.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋””๋ฒ„๊น… ์ „๋žต์„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.
React ํŠน์„ฑ์ƒ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์‚ฌ์ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด์Šˆ๋ฅผ ๋ชจ๋‘ ํฌ๊ด„ํ•˜์—ฌ ๋‹ค๋ฃน๋‹ˆ๋‹ค.


โœ… 1. ๊ธฐ๋ณธ ๋””๋ฒ„๊น… ์„ค์ •

๋กœ๊ทธ๋ฅผ ํ™œ์šฉํ•œ ๋””๋ฒ„๊น…

Next.js์—์„œ๋Š” ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๋กœ๊ทธ๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// ํด๋ผ์ด์–ธํŠธ ๋กœ๊ทธ
console.log("ํด๋ผ์ด์–ธํŠธ ์ธก ๋กœ๊ทธ");

// ์„œ๋ฒ„ ๋กœ๊ทธ
if (typeof window === "undefined") {
  console.log("์„œ๋ฒ„ ์ธก ๋กœ๊ทธ");
}

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

๋””๋ฒ„๊น… ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด .env ํŒŒ์ผ์— ๋‹ค์Œ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

NODE_ENV=development
NEXT_PUBLIC_DEBUG=true

๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ๋””๋ฒ„๊ทธ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€๋กœ ์ถœ๋ ฅํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.


โœ… 2. Next.js ๋””๋ฒ„๊น… ๋„๊ตฌ

Chrome DevTools

  • Console: ํด๋ผ์ด์–ธํŠธ ์ธก ์˜ค๋ฅ˜ ํ™•์ธ
  • Network: API ํ˜ธ์ถœ ์ƒํƒœ ์ ๊ฒ€
  • Performance: ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„ ํ™•์ธ
  • Application: ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€, ์„ธ์…˜ ๊ด€๋ฆฌ ํ™•์ธ

VS Code ๋””๋ฒ„๊ฑฐ

VS Code์˜ Launch Configuration์„ ํ™œ์šฉํ•˜์—ฌ ๋””๋ฒ„๊น… ์„ธ์…˜์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

// .vscode/launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Next.js Debug",
      "type": "node",
      "request": "launch",
      "program": "${workspaceFolder}/node_modules/next/dist/bin/next",
      "args": ["dev"],
      "cwd": "${workspaceFolder}",
      "protocol": "inspector",
      "runtimeArgs": ["--inspect"],
      "port": 9229
    }
  ]
}

VS Code์—์„œ F5๋ฅผ ๋ˆŒ๋Ÿฌ ๋””๋ฒ„๊น…์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… 3. ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋””๋ฒ„๊น…

๋ฐ˜์‘ํ˜•

React Developer Tools

  • Component Tree: ํ˜„์žฌ ๋ Œ๋”๋ง ์ค‘์ธ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ ํ™•์ธ
  • Props/State: ๊ฐ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ์™€ ์†์„ฑ ํ™•์ธ
  • Hooks: useState, useEffect ๋“ฑ ์ƒํƒœ ๋ณ€ํ™” ์ถ”์ 

Error Boundary ํ™œ์šฉ

์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ค‘๋‹จ๋˜์ง€ ์•Š๋„๋ก ์—๋Ÿฌ ๊ฒฝ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

// app/ErrorBoundary.tsx
import React from "react";

class ErrorBoundary extends React.Component {
  state = { hasError: false };

  static getDerivedStateFromError() {
    return { hasError: true };
  }

  componentDidCatch(error: Error, info: React.ErrorInfo) {
    console.error("Error ๋ฐœ์ƒ:", error, info);
  }

  render() {
    if (this.state.hasError) {
      return <h1>์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.</h1>;
    }

    return this.props.children;
  }
}

export default ErrorBoundary;

โœ… 4. ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋””๋ฒ„๊น…

์„œ๋ฒ„ ๋กœ๊ทธ ํ™œ์šฉ

Next.js ์„œ๋ฒ„ ๋กœ๊ทธ๋Š” ํ„ฐ๋ฏธ๋„์— ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

export async function getServerSideProps() {
  console.log("์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๋Š” ์ค‘...");
  return { props: {} };
}

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํ™•์ธ

console.log("ํ™˜๊ฒฝ ๋ณ€์ˆ˜:", process.env.NEXT_PUBLIC_API_URL);

๋””๋ฒ„๊ทธ ๋ชจ๋“œ ํ™œ์„ฑํ™”

๊ฐœ๋ฐœ ๋ชจ๋“œ์—์„œ ์„œ๋ฒ„๋ฅผ ๋””๋ฒ„๊ทธ ๋ชจ๋“œ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

NODE_OPTIONS='--inspect' npm run dev

๋””๋ฒ„๊ฑฐ๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉด VS Code์—์„œ ์—ฐ๊ฒฐํ•˜์—ฌ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… 5. ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง

Web Vitals ํ™œ์šฉ

ํŽ˜์ด์ง€ ์„ฑ๋Šฅ์„ ๋ถ„์„ํ•˜์—ฌ ์„ฑ๋Šฅ ์ €ํ•˜ ์›์ธ์„ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค.

'use client';
import { useReportWebVitals } from 'next/web-vitals';

export default function WebVitalsLogger() {
  useReportWebVitals((metric) => {
    console.log(metric);
  });
  return null;
}

Lighthouse ๋ถ„์„

  • ์„ฑ๋Šฅ ์ง€ํ‘œ: ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„, ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ์„ฑ ํ‰๊ฐ€
  • SEO ์ฒดํฌ: ๋ฉ”ํƒ€ ํƒœ๊ทธ ๋ฐ ์ ‘๊ทผ์„ฑ ํ™•์ธ
  • ์ตœ์ ํ™” ์ œ์•ˆ: ์ด๋ฏธ์ง€ ์••์ถ•, ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… ๋“ฑ

โœ… 6. ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ๋””๋ฒ„๊น…

Sentry๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜ ๋ชจ๋‹ˆํ„ฐ๋ง

Sentry๋Š” Next.js ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๋ณด๊ณ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์น˜

npm install @sentry/nextjs

์„ค์ •

// sentry.client.config.js
import * as Sentry from "@sentry/nextjs";

Sentry.init({
  dsn: process.env.SENTRY_DSN,
  tracesSampleRate: 1.0,
});

์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ Sentry ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… 7. ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฒ€์ฆ

ESLint์™€ Prettier ์„ค์ •

์ฝ”๋”ฉ ํ‘œ์ค€์„ ์ค€์ˆ˜ํ•˜์—ฌ ๋””๋ฒ„๊น… ์‹œ๊ฐ„์„ ์ค„์ž…๋‹ˆ๋‹ค.

npm install eslint prettier eslint-plugin-react

์„ค์ • ํŒŒ์ผ

// .eslintrc.json
{
  "extends": ["next", "prettier"],
  "plugins": ["react"]
}

์Šคํฌ๋ฆฝํŠธ ์ถ”๊ฐ€

"scripts": {
  "lint": "eslint . --ext .js,.jsx,.ts,.tsx"
}

โœ… ์š”์•ฝ

๋””๋ฒ„๊น… ๋„๊ตฌ ์ฃผ์š” ๊ธฐ๋Šฅ ํ™œ์šฉ ์‹œ์ 

VS Code ๋””๋ฒ„๊ฑฐ ์„œ๋ฒ„ ๋””๋ฒ„๊น… ์ฝ”๋“œ ์˜ค๋ฅ˜ ๋ฐ ๋ณ€์ˆ˜ ํ™•์ธ
Chrome DevTools ํด๋ผ์ด์–ธํŠธ ๋””๋ฒ„๊น… ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ์„ฑ๋Šฅ ์ธก์ •
React Developer Tools ์ƒํƒœ, props, hooks ๋ชจ๋‹ˆํ„ฐ๋ง ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ๋””๋ฒ„๊น…
Error Boundary ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐ ์˜ค๋ฅ˜ ๋ณต๊ตฌ ํด๋ผ์ด์–ธํŠธ ์˜ค๋ฅ˜ ๋ฐฉ์ง€
Sentry ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ๋ชจ๋‹ˆํ„ฐ๋ง ์„œ๋ฒ„ ๋ฐ ํด๋ผ์ด์–ธํŠธ ์˜ค๋ฅ˜ ์ถ”์ 
Web Vitals ์„ฑ๋Šฅ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ํŽ˜์ด์ง€ ์„ฑ๋Šฅ ์ตœ์ ํ™”

 

Next.js, ๋””๋ฒ„๊น…, VS Code, Chrome DevTools, React Developer Tools, Sentry, Web Vitals, ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง, ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜, ์ฝ”๋“œ ํ’ˆ์งˆ, SEO ์ตœ์ ํ™”

โ€ป ์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค.
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/05   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•