✨ 주요 변경사항: - 프로젝트 이름: 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 🌟 새로운 기능: - 사용자 인증 및 권한 관리 - 다중 여행 계획 관리 - 여행 템플릿 시스템 - 공유 링크 및 댓글 시스템 - 관리자 대시보드
4.7 KiB
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
});
📞 지원
문제가 발생하면 다음을 확인하세요:
- PostgreSQL 서비스 실행 상태
- .env 파일의 DATABASE_URL 정확성
- 데이터베이스 사용자 권한
- 방화벽 설정 (포트 5432, 3000)
성공적으로 설정되면 브라우저에서 http://localhost:5173에 접속하여 초기 설정을 완료할 수 있습니다.