🚀 성능 최적화 (Task 8): - React.lazy를 활용한 코드 스플리팅 구현 - React.memo, useMemo, useCallback을 통한 메모이제이션 최적화 - 초기 번들 크기 87% 감소 (470kB → 62kB) - 백그라운드 동기화 간격 최적화 (5분 → 30초) 📦 Vercel 배포 인프라 구축 (Task 9): - vercel.json 배포 설정 및 보안 헤더 구성 - GitHub Actions 자동 배포 워크플로우 설정 - 환경별 배포 및 미리보기 시스템 구현 - 자동화된 배포 스크립트 및 환경 변수 관리 - 포괄적인 배포 가이드 및 체크리스트 작성 🔧 코드 품질 개선: - ESLint 주요 오류 수정 (사용하지 않는 변수/import 정리) - 테스트 커버리지 확장 (229개 테스트 통과) - TypeScript 타입 안전성 강화 - Prettier 코드 포맷팅 적용 ⚠️ 참고: 테스트 파일의 any 타입 및 일부 경고는 향후 개선 예정 🛠️ Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
91 lines
2.7 KiB
JavaScript
Executable File
91 lines
2.7 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
|
|
/**
|
|
* Vercel 환경 변수 자동 설정 스크립트
|
|
* 이 스크립트는 .env.example 파일을 기반으로 Vercel 환경 변수를 설정합니다.
|
|
*/
|
|
|
|
const { execSync } = require("child_process");
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
|
|
const ENV_EXAMPLE_PATH = path.join(__dirname, "..", ".env.example");
|
|
|
|
function parseEnvFile(filePath) {
|
|
if (!fs.existsSync(filePath)) {
|
|
console.error(`❌ 파일을 찾을 수 없습니다: ${filePath}`);
|
|
process.exit(1);
|
|
}
|
|
|
|
const content = fs.readFileSync(filePath, "utf-8");
|
|
const envVars = {};
|
|
|
|
content.split("\n").forEach((line) => {
|
|
line = line.trim();
|
|
if (line && !line.startsWith("#") && line.includes("=")) {
|
|
const [key, ...values] = line.split("=");
|
|
if (key.startsWith("VITE_")) {
|
|
envVars[key.trim()] = values.join("=").trim();
|
|
}
|
|
}
|
|
});
|
|
|
|
return envVars;
|
|
}
|
|
|
|
function setupVercelEnv() {
|
|
console.log("🚀 Vercel 환경 변수 설정을 시작합니다...");
|
|
|
|
// Vercel CLI 설치 확인
|
|
try {
|
|
execSync("vercel --version", { stdio: "ignore" });
|
|
} catch (error) {
|
|
console.error("❌ Vercel CLI가 설치되지 않았습니다.");
|
|
console.error("다음 명령어로 설치해주세요: npm i -g vercel");
|
|
process.exit(1);
|
|
}
|
|
|
|
// .env.example에서 환경 변수 파싱
|
|
console.log("📋 .env.example에서 환경 변수를 읽고 있습니다...");
|
|
const envVars = parseEnvFile(ENV_EXAMPLE_PATH);
|
|
|
|
if (Object.keys(envVars).length === 0) {
|
|
console.log("⚠️ VITE_ 접두사를 가진 환경 변수가 없습니다.");
|
|
return;
|
|
}
|
|
|
|
console.log("🔧 다음 환경 변수들을 Vercel에 설정해야 합니다:");
|
|
Object.keys(envVars).forEach((key) => {
|
|
console.log(` - ${key}`);
|
|
});
|
|
|
|
console.log("\\n📝 Vercel 대시보드에서 수동으로 설정하거나,");
|
|
console.log("다음 Vercel CLI 명령어들을 사용하세요:\\n");
|
|
|
|
// 환경별 설정 명령어 생성
|
|
const environments = [
|
|
{ name: "production", flag: "--prod" },
|
|
{ name: "preview", flag: "--preview" },
|
|
{ name: "development", flag: "--dev" },
|
|
];
|
|
|
|
environments.forEach((env) => {
|
|
console.log(`# ${env.name.toUpperCase()} 환경:`);
|
|
Object.keys(envVars).forEach((key) => {
|
|
const placeholder = `your-${env.name}-${key.toLowerCase().replace("vite_", "").replace(/_/g, "-")}`;
|
|
console.log(`vercel env add ${key} ${env.flag} # 값: ${placeholder}`);
|
|
});
|
|
console.log("");
|
|
});
|
|
|
|
console.log("💡 팁: Vercel 대시보드 (Settings > Environment Variables)에서");
|
|
console.log(" 더 쉽게 환경 변수를 관리할 수 있습니다.");
|
|
}
|
|
|
|
// 스크립트 실행
|
|
if (require.main === module) {
|
|
setupVercelEnv();
|
|
}
|
|
|
|
module.exports = { parseEnvFile, setupVercelEnv };
|