🎯 프로젝트 리브랜딩: Kumamoto → Travel Planner v2.0
✨ 주요 변경사항: - 프로젝트 이름: kumamoto-travel-planner → travel-planner - 버전 업그레이드: v1.0.0 → v2.0.0 - 멀티유저 시스템 구현 (JWT 인증) - PostgreSQL 마이그레이션 시스템 추가 - Docker 컨테이너 이름 변경 - UI 브랜딩 업데이트 (Travel Planner) - API 서버 및 인증 시스템 추가 - 여행 공유 기능 구현 - 템플릿 시스템 추가 🔧 기술 스택: - Frontend: React + TypeScript + Vite - Backend: Node.js + Express + JWT - Database: PostgreSQL + 마이그레이션 - Infrastructure: Docker + Docker Compose 🌟 새로운 기능: - 사용자 인증 및 권한 관리 - 다중 여행 계획 관리 - 여행 템플릿 시스템 - 공유 링크 및 댓글 시스템 - 관리자 대시보드
This commit is contained in:
80
server/migrate.js
Normal file
80
server/migrate.js
Normal file
@@ -0,0 +1,80 @@
|
||||
const { query } = require('./db');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
async function runMigrations() {
|
||||
try {
|
||||
console.log('🔄 데이터베이스 마이그레이션 시작...');
|
||||
|
||||
// 마이그레이션 디렉토리 확인
|
||||
const migrationsDir = path.join(__dirname, 'migrations');
|
||||
if (!fs.existsSync(migrationsDir)) {
|
||||
console.log('📁 마이그레이션 디렉토리가 없습니다. 건너뜁니다.');
|
||||
return;
|
||||
}
|
||||
|
||||
// 마이그레이션 파일 목록
|
||||
const migrationFiles = fs.readdirSync(migrationsDir)
|
||||
.filter(file => file.endsWith('.sql'))
|
||||
.sort();
|
||||
|
||||
if (migrationFiles.length === 0) {
|
||||
console.log('📄 실행할 마이그레이션이 없습니다.');
|
||||
return;
|
||||
}
|
||||
|
||||
// 마이그레이션 테이블 생성
|
||||
await query(`
|
||||
CREATE TABLE IF NOT EXISTS migrations (
|
||||
id SERIAL PRIMARY KEY,
|
||||
filename VARCHAR(255) UNIQUE NOT NULL,
|
||||
executed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
)
|
||||
`);
|
||||
|
||||
// 각 마이그레이션 실행
|
||||
for (const filename of migrationFiles) {
|
||||
// 이미 실행된 마이그레이션인지 확인
|
||||
const existingResult = await query(
|
||||
'SELECT id FROM migrations WHERE filename = $1',
|
||||
[filename]
|
||||
);
|
||||
|
||||
if (existingResult.rows.length > 0) {
|
||||
console.log(`⏭️ ${filename} - 이미 실행됨`);
|
||||
continue;
|
||||
}
|
||||
|
||||
console.log(`🔧 ${filename} 실행 중...`);
|
||||
|
||||
// 마이그레이션 파일 읽기 및 실행
|
||||
const migrationPath = path.join(migrationsDir, filename);
|
||||
const migrationSQL = fs.readFileSync(migrationPath, 'utf8');
|
||||
|
||||
await query(migrationSQL);
|
||||
|
||||
// 마이그레이션 기록
|
||||
await query(
|
||||
'INSERT INTO migrations (filename) VALUES ($1)',
|
||||
[filename]
|
||||
);
|
||||
|
||||
console.log(`✅ ${filename} 완료`);
|
||||
}
|
||||
|
||||
console.log('🎉 모든 마이그레이션이 완료되었습니다!');
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ 마이그레이션 실패:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
// 직접 실행 시
|
||||
if (require.main === module) {
|
||||
runMigrations()
|
||||
.then(() => process.exit(0))
|
||||
.catch(() => process.exit(1));
|
||||
}
|
||||
|
||||
module.exports = { runMigrations };
|
||||
Reference in New Issue
Block a user