Files
Hyungi Ahn 4264e5f8b3 refactor: Phase 2-3 - index.js 대폭 축소 및 설정 파일 분리 완료
index.js를 605줄에서 128줄로 축소 (79% 감소)
미들웨어, 라우트, 데이터베이스 설정을 별도 파일로 분리하여
코드 가독성 및 유지보수성 대폭 향상

주요 변경사항:

신규 파일 (3개):
- config/database.js: DB 연결 풀 관리 (dbPool.js에서 이동)
  * 환경 변수 기반 설정
  * 자동 재연결 로직 (최대 5회 재시도)
  * UTF-8MB4 문자셋 지원
  * logger 통합

- config/middleware.js: 미들웨어 중앙 관리
  * Helmet 보안 헤더 (security.js 사용)
  * CORS 설정 (cors.js 사용)
  * Compression (성능 최적화)
  * Body parser (50MB 제한)
  * 정적 파일 서빙 (public, uploads)
  * Response formatter

- config/routes.js: 라우트 중앙 관리
  * 모든 라우터 import 및 등록
  * Rate limiting 설정 (login, API)
  * 인증 미들웨어 적용
  * 공개 경로 관리
  * Swagger 문서 설정

수정 파일 (2개):
- index.js: 605줄 → 128줄 (79% 감소)
  * 간결한 서버 초기화 로직
  * setupMiddlewares/setupRoutes 함수 사용
  * Graceful shutdown 유지
  * 에러 핸들러 유지
  * 캐시 초기화 로직 유지

- dbPool.js: 호환성 레거시 파일로 전환
  * config/database.js로 위임
  * @deprecated 주석 추가
  * 기존 코드 하위 호환성 유지 (22개 파일에서 사용 중)

파일 통계:
- 3개 파일 추가, 2개 파일 수정
- +92 -621 (net -529 lines)
- index.js: 605 → 128 lines (-477 lines, -79%)

검증 필요 사항:
- [ ] 서버 정상 시작 확인
- [ ] 모든 API 엔드포인트 동작 확인
- [ ] CORS 설정 동작 확인
- [ ] 인증 미들웨어 동작 확인
- [ ] Rate limiting 동작 확인

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-11 11:55:15 +09:00

79 lines
1.8 KiB
JavaScript

/**
* 데이터베이스 연결 설정
*
* MySQL/MariaDB 커넥션 풀 관리
* - 환경 변수 기반 설정
* - 자동 재연결 (최대 5회 재시도)
* - UTF-8MB4 문자셋 지원
*
* @author TK-FB-Project
* @since 2025-12-11
*/
require('dotenv').config();
const mysql = require('mysql2/promise');
const retry = require('async-retry');
const logger = require('../utils/logger');
let pool = null;
async function initPool() {
if (pool) return pool;
const {
DB_HOST, DB_PORT, DB_USER,
DB_PASSWORD, DB_NAME,
DB_SOCKET, DB_CONN_LIMIT = '10'
} = process.env;
if (!DB_USER || !DB_PASSWORD || !DB_NAME) {
throw new Error('필수 환경변수(DB_USER, DB_PASSWORD, DB_NAME)가 없습니다.');
}
if (!DB_SOCKET && !DB_HOST) {
throw new Error('DB_SOCKET이 없으면 DB_HOST가 반드시 필요합니다.');
}
await retry(async () => {
const config = {
user: DB_USER,
password: DB_PASSWORD,
database: DB_NAME,
waitForConnections: true,
connectionLimit: parseInt(DB_CONN_LIMIT, 10),
queueLimit: 0,
charset: 'utf8mb4'
};
if (DB_SOCKET) {
config.socketPath = DB_SOCKET;
} else {
config.host = DB_HOST;
config.port = parseInt(DB_PORT, 10);
}
pool = mysql.createPool(config);
// 첫 연결 검증
const conn = await pool.getConnection();
await conn.query('SET NAMES utf8mb4');
conn.release();
const connectionInfo = DB_SOCKET ? `socket=${DB_SOCKET}` : `${DB_HOST}:${DB_PORT}`;
logger.info('MariaDB 연결 성공', {
connection: connectionInfo,
database: DB_NAME,
connectionLimit: parseInt(DB_CONN_LIMIT, 10)
});
}, {
retries: 5,
factor: 2,
minTimeout: 1000
});
return pool;
}
async function getDb() {
return initPool();
}
module.exports = { getDb };