Files
travel/DATABASE_SETUP.md
Hyungi Ahn fd5a68e44a 🎯 프로젝트 리브랜딩: 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

🌟 새로운 기능:
- 사용자 인증 및 권한 관리
- 다중 여행 계획 관리
- 여행 템플릿 시스템
- 공유 링크 및 댓글 시스템
- 관리자 대시보드
2025-11-25 10:39:58 +09:00

4.7 KiB

🗄️ 데이터베이스 설정 가이드

📋 개요

Travel Planner v2.0은 PostgreSQL을 사용하여 멀티 사용자 여행 계획을 관리합니다.

🚀 빠른 시작

1. PostgreSQL 설치 확인

# PostgreSQL 버전 확인
psql --version

# PostgreSQL 서비스 상태 확인 (macOS)
brew services list | grep postgresql

# PostgreSQL 시작 (macOS)
brew services start postgresql

2. 데이터베이스 생성

# PostgreSQL 접속
psql postgres

# 데이터베이스 생성
CREATE DATABASE kumamoto_travel;

# 사용자 생성 (선택사항)
CREATE USER kumamoto_user WITH PASSWORD 'your_password';
GRANT ALL PRIVILEGES ON DATABASE kumamoto_travel TO kumamoto_user;

# 종료
\q

3. 환경 변수 설정

# 서버 디렉토리로 이동
cd server

# 환경 변수 파일 생성
cp env.example .env

# .env 파일 편집
nano .env

4. .env 파일 예시

# 기본 설정 (로컬 개발용)
DATABASE_URL=postgresql://localhost:5432/kumamoto_travel

# 사용자 계정을 만든 경우
DATABASE_URL=postgresql://kumamoto_user:your_password@localhost:5432/kumamoto_travel

# JWT 시크릿 (랜덤한 문자열로 변경하세요)
JWT_SECRET=your-super-secret-jwt-key-change-this-in-production-123456789

# 선택사항
GOOGLE_MAPS_API_KEY=your-google-maps-api-key
PORT=3000
NODE_ENV=development

🔧 서버 시작

1. 의존성 설치

cd server
npm install

2. 서버 실행

# 개발 모드
npm run dev

# 또는 일반 모드
npm start

3. 서버 확인

# 헬스 체크
curl http://localhost:3000/health

# 데이터베이스 연결 테스트
curl http://localhost:3000/api/setup/test-db

# 설정 상태 확인
curl http://localhost:3000/api/setup/status

📊 데이터베이스 스키마

주요 테이블

  • users: 사용자 계정 (관리자/일반 사용자)
  • travel_plans: 여행 계획 (멀티 목적지 지원)
  • day_schedules: 날짜별 일정
  • activities: 개별 활동
  • share_links: 공유 링크 관리
  • trip_comments: 여행 계획 댓글

스키마 업데이트

# 기존 데이터가 있는 경우 백업
pg_dump kumamoto_travel > backup.sql

# 새 스키마 적용
psql kumamoto_travel < server/schema_v2.sql

🔐 보안 설정

JWT 시크릿 생성

# 랜덤 시크릿 생성 (Node.js)
node -e "console.log(require('crypto').randomBytes(64).toString('hex'))"

# 또는 OpenSSL 사용
openssl rand -hex 64

데이터베이스 보안

-- 사용자별 권한 설정
REVOKE ALL ON SCHEMA public FROM PUBLIC;
GRANT USAGE ON SCHEMA public TO kumamoto_user;
GRANT ALL ON ALL TABLES IN SCHEMA public TO kumamoto_user;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO kumamoto_user;

🐛 문제 해결

연결 오류

# PostgreSQL 실행 확인
ps aux | grep postgres

# 포트 확인
lsof -i :5432

# 로그 확인
tail -f /usr/local/var/log/postgres.log

권한 오류

-- 데이터베이스 소유자 변경
ALTER DATABASE kumamoto_travel OWNER TO kumamoto_user;

-- 테이블 권한 부여
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO kumamoto_user;

스키마 초기화

# 모든 테이블 삭제 후 재생성
psql kumamoto_travel -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"
psql kumamoto_travel < server/schema_v2.sql

📈 성능 최적화

인덱스 확인

-- 인덱스 사용 현황
SELECT schemaname, tablename, indexname, idx_tup_read, idx_tup_fetch 
FROM pg_stat_user_indexes;

-- 느린 쿼리 확인
SELECT query, mean_time, calls FROM pg_stat_statements ORDER BY mean_time DESC;

연결 풀 설정

// server/db.js에서 연결 풀 조정
const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
  max: 20,          // 최대 연결 수
  idleTimeoutMillis: 30000,
  connectionTimeoutMillis: 2000,
});

🚀 프로덕션 배포

환경 변수 (프로덕션)

DATABASE_URL=postgresql://user:password@host:port/database?sslmode=require
JWT_SECRET=production-secret-key-very-long-and-random
NODE_ENV=production
PORT=3000

SSL 설정

// SSL 연결 (프로덕션)
const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
  ssl: process.env.NODE_ENV === 'production' ? { rejectUnauthorized: false } : false
});

📞 지원

문제가 발생하면 다음을 확인하세요:

  1. PostgreSQL 서비스 실행 상태
  2. .env 파일의 DATABASE_URL 정확성
  3. 데이터베이스 사용자 권한
  4. 방화벽 설정 (포트 5432, 3000)

성공적으로 설정되면 브라우저에서 http://localhost:5173에 접속하여 초기 설정을 완료할 수 있습니다.