TypeScript

next.config.js 커스터마이징

코샵 2025. 1. 8. 10:02
반응형

소개

Next.js 애플리케이션의 동작을 세부적으로 제어하고 싶으신가요? next.config.js 파일을 통해 애플리케이션을 원하는 대로 커스터마이징하는 방법을 알아보겠습니다.

next.config.js 기본 구조

// next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
  // 기본 설정
  reactStrictMode: true,
  // 여기에 추가 설정
}

module.exports = nextConfig

런타임 구성 설정하기

런타임 구성에는 두 가지 유형이 있습니다:

서버 런타임 구성

const nextConfig = {
  serverRuntimeConfig: {
    userEndpoint: 'https://api.example.com/users',
    secretKey: process.env.SECRET_KEY,
  }
}

공개 런타임 구성

const nextConfig = {
  publicRuntimeConfig: {
    apiUrl: 'https://api.example.com',
    appName: 'My Next.js App',
  }
}

런타임 구성 사용하기

import getConfig from 'next/config'

function MyComponent() {
  const { serverRuntimeConfig, publicRuntimeConfig } = getConfig()

  // publicRuntimeConfig는 클라이언트와 서버 모두에서 접근 가능
  console.log(publicRuntimeConfig.apiUrl)

  // serverRuntimeConfig는 서버에서만 접근 가능
  if (typeof window === 'undefined') {
    console.log(serverRuntimeConfig.secretKey)
  }

  return <div>설정 테스트</div>
}

리다이렉트 설정하기

module.exports = {
  async redirects() {
    return [
      {
        source: '/old-page',
        destination: '/new-page',
        permanent: true, // 308 상태 코드
      },
      {
        source: '/blog/:slug',
        destination: '/articles/:slug', // 동적 경로도 지원
        permanent: false, // 307 상태 코드
      },
      {
        // 와일드카드 패턴 사용
        source: '/docs/:path*',
        destination: '/documentation/:path*',
        permanent: false,
      }
    ]
  }
}

커스텀 헤더 추가하기

module.exports = {
  async headers() {
    return [
      {
        source: '/:path*', // 모든 경로에 적용
        headers: [
          {
            key: 'X-Frame-Options',
            value: 'DENY'
          },
          {
            key: 'X-Content-Type-Options',
            value: 'nosniff'
          }
        ]
      },
      {
        source: '/api/:path*',
        headers: [
          {
            key: 'Access-Control-Allow-Origin',
            value: '*'
          }
        ]
      }
    ]
  }
}

환경별 설정 관리하기

module.exports = (phase, { defaultConfig }) => {
  // 개발 환경과 프로덕션 환경 구분
  const isDev = phase === PHASE_DEVELOPMENT_SERVER
  const isProd = phase === PHASE_PRODUCTION_BUILD

  return {
    // 환경별 설정
    env: {
      API_URL: isDev 
        ? 'http://localhost:3000/api' 
        : 'https://api.production.com',
    },
    // 이미지 도메인 설정
    images: {
      domains: isDev 
        ? ['localhost'] 
        : ['production-cdn.com'],
    },
    // 기타 환경별 설정...
  }
}

주의사항

설정 유형 주의사항
런타임 구성 정적 최적화가 비활성화됨
리다이렉트 설정 변경 시 서버 재시작 필요
커스텀 헤더 보안 관련 헤더 신중히 설정
환경 변수 클라이언트에 노출되지 않도록 주의

실전 활용 예시

API 프록시 설정

module.exports = {
  async rewrites() {
    return [
      {
        source: '/api/:path*',
        destination: `${process.env.API_URL}/:path*`
      }
    ]
  }
}

웹팩 설정 커스터마이징

module.exports = {
  webpack: (config, { buildId, dev, isServer, defaultLoaders, webpack }) => {
    // 웹팩 설정 수정
    config.module.rules.push({
      test: /\.svg$/,
      use: ['@svgr/webpack']
    })

    return config
  }
}

마치며

next.config.js는 Next.js 애플리케이션의 동작을 세밀하게 제어할 수 있는 강력한 도구입니다. 하지만 설정이 복잡해질수록 유지보수가 어려워질 수 있으므로, 필요한 설정만 신중하게 추가하는 것이 좋습니다.