import dotenv from "dotenv"; import path from "path"; // .env 파일 로드 dotenv.config({ path: path.resolve(process.cwd(), ".env") }); interface Config { // 서버 설정 port: number; host: string; nodeEnv: string; // 데이터베이스 설정 databaseUrl: string; // JWT 설정 jwt: { secret: string; expiresIn: string; refreshExpiresIn: string; }; // 보안 설정 bcryptRounds: number; sessionSecret: string; // CORS 설정 cors: { origin: string | string[] | boolean; // 타입을 확장하여 배열과 boolean도 허용 credentials: boolean; }; // 로깅 설정 logging: { level: string; file: string; }; // API 설정 apiPrefix: string; apiVersion: string; // 파일 업로드 설정 maxFileSize: number; uploadDir: string; // 이메일 설정 smtpHost: string; smtpPort: number; smtpUser: string; smtpPass: string; // Redis 설정 redisUrl: string; // 개발 환경 설정 debug: boolean; showErrorDetails: boolean; } // CORS origin 처리 함수 const getCorsOrigin = (): string[] | boolean => { // 개발 환경에서는 모든 origin 허용 if (process.env.NODE_ENV === "development") { return true; } // 환경변수가 있으면 쉼표로 구분하여 배열로 변환 if (process.env.CORS_ORIGIN) { return process.env.CORS_ORIGIN.split(",").map((origin) => origin.trim()); } // 기본값: 허용할 도메인들 return [ "http://localhost:9771", // 로컬 개발 환경 "http://192.168.0.70:5555", // 내부 네트워크 접근 "http://39.117.244.52:5555", // 외부 네트워크 접근 "https://v1.vexplor.com", // 운영 프론트엔드 "https://api.vexplor.com", // 운영 백엔드 ]; }; const config: Config = { // 서버 설정 port: parseInt(process.env.PORT || "8080", 10), host: process.env.HOST || "0.0.0.0", nodeEnv: process.env.NODE_ENV || "development", // 데이터베이스 설정 databaseUrl: process.env.DATABASE_URL || "postgresql://postgres:postgres@localhost:5432/ilshin", // JWT 설정 jwt: { secret: process.env.JWT_SECRET || "ilshin-plm-super-secret-jwt-key-2024", expiresIn: process.env.JWT_EXPIRES_IN || "24h", refreshExpiresIn: process.env.JWT_REFRESH_EXPIRES_IN || "7d", }, // 보안 설정 bcryptRounds: parseInt(process.env.BCRYPT_ROUNDS || "12", 10), sessionSecret: process.env.SESSION_SECRET || "ilshin-plm-session-secret-2024", // CORS 설정 cors: { origin: getCorsOrigin(), credentials: true, // 쿠키 및 인증 정보 포함 허용 }, // 로깅 설정 logging: { level: process.env.LOG_LEVEL || "info", file: process.env.LOG_FILE || "logs/app.log", }, // API 설정 apiPrefix: process.env.API_PREFIX || "/api", apiVersion: process.env.API_VERSION || "v1", // 파일 업로드 설정 maxFileSize: parseInt(process.env.MAX_FILE_SIZE || "10485760", 10), uploadDir: process.env.UPLOAD_DIR || "uploads", // 이메일 설정 smtpHost: process.env.SMTP_HOST || "smtp.gmail.com", smtpPort: parseInt(process.env.SMTP_PORT || "587", 10), smtpUser: process.env.SMTP_USER || "", smtpPass: process.env.SMTP_PASS || "", // Redis 설정 redisUrl: process.env.REDIS_URL || "redis://localhost:6379", // 개발 환경 설정 debug: process.env.DEBUG === "true", showErrorDetails: process.env.SHOW_ERROR_DETAILS === "true", }; export default config;