minstudio

환경 변수 관리와 배포 전략

실무 배포 환경에서는 보안이 생명입니다. Next.js는 .env.local을 통해 서버 전용 시크릿(DB 비밀번호 등)과 클라이언트 노출 변수(API Endpoint 등)를 완벽히 분리 관리합니다.

접두어 NEXT_PUBLIC_이 붙은 변수만이 브라우저 번들에 포함되며, 나머지 변수는 오직 안전한 Node.js 서버 환경에서만 접근 가능합니다. Vercel 플랫폼과 결합하면 브랜치별 환경 변수 구성과 Edge Network 캐싱을 손쉽게 세팅할 수 있습니다.

🔐 환경 변수 보안 파이프라인 (.env 분리) .env.local DB_PASSWORD=secret NEXT_PUBLIC_API_URL=... Node.js 서버 (안전함) 서버 컴포넌트, 서버 액션, 라우트 핸들러에서 사용 가능 process.env.DB_PASSWORD 브라우저 클라이언트 (노출됨) 클라이언트 컴포넌트 등 빌드 시점에 번들러가 하드코딩함 process.env.NEXT_PUBLIC_API Webpack
// ==========================================
// 📂 app/lib/db.ts (서버 환경 전용)
// ==========================================
import mysql from 'mysql2/promise'

export const dbPool = mysql.createPool({
  host: 'db.example.com',
  // 서버에서만 접근 가능하므로 안전합니다! 
  // (클라이언트 번들에는 절대 포함되지 않습니다)
  password: process.env.DATABASE_PASSWORD, 
})


// ==========================================
// 📂 app/components/PaymentForm.tsx (클라이언트 컴포넌트)
// ==========================================
'use client'

import { loadStripe } from '@stripe/stripe-js'

export function PaymentForm() {
  // NEXT_PUBLIC_ 접두사가 있으므로 브라우저용 JS 번들에 포함됩니다.
  // 빌드 시점에 문자열 "pk_test_12345" 로 자동 치환(Replace)됩니다.
  const handlePayment = async () => {
    const stripe = await loadStripe(process.env.NEXT_PUBLIC_STRIPE_KEY!)
    // 결제 로직 수행...
  }

  return <button onClick={handlePayment}>결제하기</button>
}

// 💡 실무 베스트 프랙티스
// Next.js 환경 변수는 런타임에 읽어오는 게 아니라 "빌드 타임"에 코드에 박힙니다.
// 따라서 클라이언트 변수를 변경했다면 반드시 프로젝트를 다시 빌드(Re-build)해야 합니다!
환경 변수 관리와 배포 전략 | Minstudio