// src/app.js const express = require("express"); const cors = require("cors"); const config = require("./config/config"); const { sequelize } = require("./models"); const logger = require("./config/logger"); const requestLogger = require("./middleware/requestLogger.middleware"); const errorHandler = require("./middleware/errorHandler.middleware"); const registerRoutes = require("./routes"); const app = express(); // Middleware 설정 app.use(cors(config.cors)); app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.use(requestLogger); // 라우트 등록 registerRoutes(app); // 에러 핸들링 app.use(errorHandler); const waitForDatabase = async (retries = 5, interval = 2000) => { for (let i = 0; i < retries; i++) { try { await sequelize.authenticate(); logger.info("Database connection established successfully."); return true; } catch (error) { logger.warn(`Database connection attempt ${i + 1} failed:`, error); if (i < retries - 1) { logger.info(`Retrying in ${interval / 1000} seconds...`); await new Promise((resolve) => setTimeout(resolve, interval)); } } } throw new Error("Could not connect to database after multiple attempts"); }; const initializeServer = async () => { try { // 데이터베이스 연결 대기 await waitForDatabase(); // 개발 환경에서만 데이터베이스 동기화 if (process.env.NODE_ENV !== "production") { await sequelize.sync({ alert: true }); logger.info("Database synchronized."); //await require("./utils/createInitialAdmin")(); } // 서버 시작 const port = config.port; app.listen(port, () => { logger.info(`Server is running on port ${port}`); }); } catch (error) { logger.error("Unable to start server:", error); process.exit(1); } }; initializeServer(); module.exports = app;