68 lines
1.9 KiB
JavaScript
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;
|