Nuxt 3는 유연한 설정 구조를 가지고 있습니다. 프로젝트 전역 설정을 정의할 때 가장 많이 쓰이는 두 가지는 다음과 같습니다:
이 두 설정은 비슷해 보이지만 목적, 생명 주기, 적용 대상이 분명히 다릅니다.
이번 글에서는 이 둘의 차이를 개념부터 실전까지 정리하고, 현업에서의 활용 예시와 실수를 방지하는 팁까지 총망라합니다.
runtimeConfig는 Nuxt에서 환경 변수 및 비밀값을 런타임에 안전하게 처리할 수 있는 방법입니다. 서버 전용 또는 클라이언트 공유 값으로 구분할 수 있으며, .env 파일과 연동해 환경별 설정을 유연하게 처리할 수 있습니다.
// nuxt.config.ts
export default defineNuxtConfig({
runtimeConfig: {
public: {
apiBase: '/api',
darkMode: false // 클라이언트에서도 접근 가능
},
secretKey: '123abc', // 서버에서만 접근 가능
}
})
const config = useRuntimeConfig()
console.log(config.public.apiBase) // ✅ 클라이언트 접근 가능
console.log(config.secretKey) // ✅ 서버에서만 접근 가능
설정값 | 위치 | 비고 |
---|---|---|
API Base URL | runtimeConfig.public.apiBase | 환경별 달라질 수 있음 |
인증 시크릿 키 | runtimeConfig.secretKey | 서버 전용, 클라이언트 접근 불가 |
외부 서비스 키 | public.recaptchaKey 등 | 클라이언트 사용 시 반드시 public 하위로 |
app.config.ts는 Nuxt 3에서 정적인 앱 전역 설정을 정의하기 위한 공식 방법입니다. 이 설정은 빌드 시점에 결정되며, 타입 추론이 가능하고 Nuxt 전체에서 공유됩니다.
// app.config.ts
export default defineAppConfig({
darkMode: true,
siteName: 'My Nuxt Blog',
layoutMode: 'boxed',
theme: {
primaryColor: '#1e40af'
}
})
const config = useAppConfig()
console.log(config.darkMode) // true
설정값 | 위치 | 비고 |
---|---|---|
다크모드 여부 | appConfig.darkMode | 전역 테마 설정 |
사이트 이름 | appConfig.siteName | SEO, Meta 설정 등에서 활용 |
기본 테마 색상 | appConfig.theme | 스타일 시스템 전역 공유 |
구분 | runtimeConfig | app.config |
---|---|---|
적용 시점 | 런타임 | 빌드 타임 |
변경 후 적용 | 서버 재시작 필요 | 빌드 다시 해야 함 |
클라이언트 접근 가능 | public 하위만 가능 | 전체 접근 가능 |
타입 지원 | 제한적 (useRuntimeConfig) | 자동 타입 추론 (useAppConfig) |
주 용도 | 보안 키, API 주소, 모드 분기 | 테마, 레이아웃, 전역 옵션 |
다크모드를 전역 설정으로 넣고, 이를 전 컴포넌트에서 반영하려면 app.config.ts가 적합합니다.
export default defineAppConfig({
darkMode: true,
theme: {
primary: '#1e293b',
darkBackground: '#0f172a',
}
})
<script setup>
const config = useAppConfig()
</script>
<template>
<div :class="{ 'dark': config.darkMode }" class="bg-white dark:bg-gray-900 text-black dark:text-white">
<h1>Hello Dark Mode</h1>
</div>
</template>
// nuxt.config.ts
export default defineNuxtConfig({
runtimeConfig: {
public: {
apiBase: process.env.NUXT_PUBLIC_API_BASE || '/api',
version: process.env.NUXT_PUBLIC_APP_VERSION || '1.0.0',
},
secretKey: process.env.NUXT_SECRET_KEY
}
})
// app.config.ts
export default defineAppConfig({
darkMode: true,
language: 'ko',
ui: {
layout: 'sidebar',
theme: {
color: '#06b6d4',
fontFamily: 'Inter, sans-serif'
}
}
})
Nuxt는 app.config에 자동으로 타입을 추론하지만, 직접 타입 선언을 확장할 수 있습니다.
// types/app.config.d.ts
declare module 'nuxt/schema' {
interface AppConfigInput {
ui?: {
layout?: 'full' | 'sidebar'
theme?: {
color?: string
fontFamily?: string
}
}
}
}
// nuxt.config.ts
import { defineNuxtConfig } from 'nuxt/config'
export default defineNuxtConfig({
// config...
})
이렇게 하면 VS Code에서 app.config.ts의 값도 완전하게 타입 추론됩니다.