Files
hyungi 13b09ef2ae 🚀 초기 프로젝트 설정 완료
 기능:
- 기간제 근로자 작업관리 시스템 기본 구조
- 한국어 기반 프론트엔드 (로그인, 대시보드, 작업자 관리)
- Node.js Express 백엔드 API 서버 구조
- MySQL 데이터베이스 스키마 설계
- 14000번대 포트 구성으로 충돌 방지

📁 구조:
- frontend/ : HTML, CSS, JS (Bootstrap 5)
- backend/ : Node.js, Express, MySQL
- database/ : 초기화 스크립트
- docs/ : 문서

🔌 포트:
- 웹: 14000, API: 14001, DB: 14002, phpMyAdmin: 14003

🎯 다음 단계: 백엔드 API 라우트 구현 및 Docker 설정
2025-10-20 13:31:39 +09:00

103 lines
2.9 KiB
JavaScript

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);
});