import "dotenv/config"; import express from "express"; import cors from "cors"; import helmet from "helmet"; import compression from "compression"; import rateLimit from "express-rate-limit"; import config from "./config/environment"; import { logger } from "./utils/logger"; import { errorHandler } from "./middleware/errorHandler"; // 라우터 임포트 import authRoutes from "./routes/authRoutes"; import adminRoutes from "./routes/adminRoutes"; import multilangRoutes from "./routes/multilangRoutes"; import tableManagementRoutes from "./routes/tableManagementRoutes"; import screenManagementRoutes from "./routes/screenManagementRoutes"; import commonCodeRoutes from "./routes/commonCodeRoutes"; import dynamicFormRoutes from "./routes/dynamicFormRoutes"; // import userRoutes from './routes/userRoutes'; // import menuRoutes from './routes/menuRoutes'; const app = express(); // 기본 미들웨어 app.use(helmet()); app.use(compression()); app.use(express.json({ limit: "10mb" })); app.use(express.urlencoded({ extended: true, limit: "10mb" })); // CORS 설정 app.use( cors({ origin: config.cors.origin, credentials: true, methods: ["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"], allowedHeaders: ["Content-Type", "Authorization", "X-Requested-With"], }) ); // Rate Limiting (개발 환경에서는 완화) const limiter = rateLimit({ windowMs: 1 * 60 * 1000, // 1분 max: config.nodeEnv === "development" ? 1000 : 100, // 개발환경에서는 1000, 운영환경에서는 100 message: { error: "너무 많은 요청이 발생했습니다. 잠시 후 다시 시도해주세요.", }, skip: (req) => { // 헬스 체크는 Rate Limiting 제외 return req.path === "/health"; }, }); app.use("/api/", limiter); // 헬스 체크 엔드포인트 app.get("/health", (req, res) => { res.status(200).json({ status: "OK", timestamp: new Date().toISOString(), uptime: process.uptime(), environment: config.nodeEnv, }); }); // API 라우터 app.use("/api/auth", authRoutes); app.use("/api/admin", adminRoutes); app.use("/api/multilang", multilangRoutes); app.use("/api/table-management", tableManagementRoutes); app.use("/api/screen-management", screenManagementRoutes); app.use("/api/common-codes", commonCodeRoutes); app.use("/api/dynamic-form", dynamicFormRoutes); // app.use('/api/users', userRoutes); // app.use('/api/menus', menuRoutes); // 404 핸들러 app.use("*", (req, res) => { res.status(404).json({ success: false, message: "요청한 리소스를 찾을 수 없습니다.", path: req.originalUrl, }); }); // 에러 핸들러 app.use(errorHandler); // 서버 시작 const PORT = config.port; app.listen(PORT, () => { logger.info(`🚀 Server is running on port ${PORT}`); logger.info(`📊 Environment: ${config.nodeEnv}`); logger.info(`🔗 Health check: http://localhost:${PORT}/health`); }); export default app;