duckil_plm/plm-api/src/app.js

68 lines
1.9 KiB
JavaScript

// 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;