const express = require('express'); const cors = require('cors'); const helmet = require('helmet'); const rateLimit = require('express-rate-limit'); require('dotenv').config({ path: './config.env' }); const authRoutes = require('./routes/auth'); const workerRoutes = require('./routes/workers'); const dailyWorkRoutes = require('./routes/dailyWork'); const errorRoutes = require('./routes/errors'); const requestRoutes = require('./routes/requests'); const dashboardRoutes = require('./routes/dashboard'); const app = express(); const PORT = process.env.PORT || 14001; // 보안 미들웨어 app.use(helmet()); // Rate limiting const limiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15분 max: 100, // 최대 100개 요청 message: { error: '너무 많은 요청이 발생했습니다. 잠시 후 다시 시도해주세요.' } }); app.use('/api/', limiter); // CORS 설정 app.use(cors({ origin: process.env.CORS_ORIGIN || 'http://localhost:3000', credentials: true })); // Body parser app.use(express.json({ limit: '10mb' })); app.use(express.urlencoded({ extended: true, limit: '10mb' })); // 로깅 미들웨어 app.use((req, res, next) => { console.log(`${new Date().toISOString()} - ${req.method} ${req.path}`); next(); }); // API 라우트 app.use('/api/auth', authRoutes); app.use('/api/workers', workerRoutes); app.use('/api/daily-work', dailyWorkRoutes); app.use('/api/errors', errorRoutes); app.use('/api/requests', requestRoutes); app.use('/api/dashboard', dashboardRoutes); // 기본 라우트 app.get('/', (req, res) => { res.json({ message: '기간제 근로자 작업관리 시스템 API', version: '1.0.0', status: 'running', timestamp: new Date().toISOString() }); }); // 404 에러 처리 app.use((req, res) => { res.status(404).json({ error: '요청한 리소스를 찾을 수 없습니다.', path: req.path, method: req.method }); }); // 전역 에러 처리 app.use((err, req, res, next) => { console.error('서버 오류:', err); res.status(err.status || 500).json({ error: process.env.NODE_ENV === 'production' ? '서버 내부 오류가 발생했습니다.' : err.message, ...(process.env.NODE_ENV !== 'production' && { stack: err.stack }) }); }); // 서버 시작 app.listen(PORT, () => { console.log(`🚀 서버가 포트 ${PORT}에서 실행 중입니다.`); console.log(`📊 대시보드: http://localhost:${PORT}`); console.log(`🔧 환경: ${process.env.NODE_ENV}`); console.log(`🗄️ 데이터베이스: ${process.env.DB_HOST}:${process.env.DB_PORT}/${process.env.DB_NAME}`); }); // Graceful shutdown process.on('SIGTERM', () => { console.log('🛑 서버 종료 신호를 받았습니다.'); process.exit(0); }); process.on('SIGINT', () => { console.log('🛑 서버를 종료합니다.'); process.exit(0); });