✨ 주요 변경사항: - 프로젝트 이름: 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 🌟 새로운 기능: - 사용자 인증 및 권한 관리 - 다중 여행 계획 관리 - 여행 템플릿 시스템 - 공유 링크 및 댓글 시스템 - 관리자 대시보드
214 lines
4.7 KiB
Markdown
214 lines
4.7 KiB
Markdown
# 🗄️ 데이터베이스 설정 가이드
|
|
|
|
## 📋 개요
|
|
Travel Planner v2.0은 PostgreSQL을 사용하여 멀티 사용자 여행 계획을 관리합니다.
|
|
|
|
## 🚀 빠른 시작
|
|
|
|
### 1. PostgreSQL 설치 확인
|
|
```bash
|
|
# PostgreSQL 버전 확인
|
|
psql --version
|
|
|
|
# PostgreSQL 서비스 상태 확인 (macOS)
|
|
brew services list | grep postgresql
|
|
|
|
# PostgreSQL 시작 (macOS)
|
|
brew services start postgresql
|
|
```
|
|
|
|
### 2. 데이터베이스 생성
|
|
```bash
|
|
# 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. 환경 변수 설정
|
|
```bash
|
|
# 서버 디렉토리로 이동
|
|
cd server
|
|
|
|
# 환경 변수 파일 생성
|
|
cp env.example .env
|
|
|
|
# .env 파일 편집
|
|
nano .env
|
|
```
|
|
|
|
### 4. .env 파일 예시
|
|
```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. 의존성 설치
|
|
```bash
|
|
cd server
|
|
npm install
|
|
```
|
|
|
|
### 2. 서버 실행
|
|
```bash
|
|
# 개발 모드
|
|
npm run dev
|
|
|
|
# 또는 일반 모드
|
|
npm start
|
|
```
|
|
|
|
### 3. 서버 확인
|
|
```bash
|
|
# 헬스 체크
|
|
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**: 여행 계획 댓글
|
|
|
|
### 스키마 업데이트
|
|
```bash
|
|
# 기존 데이터가 있는 경우 백업
|
|
pg_dump kumamoto_travel > backup.sql
|
|
|
|
# 새 스키마 적용
|
|
psql kumamoto_travel < server/schema_v2.sql
|
|
```
|
|
|
|
## 🔐 보안 설정
|
|
|
|
### JWT 시크릿 생성
|
|
```bash
|
|
# 랜덤 시크릿 생성 (Node.js)
|
|
node -e "console.log(require('crypto').randomBytes(64).toString('hex'))"
|
|
|
|
# 또는 OpenSSL 사용
|
|
openssl rand -hex 64
|
|
```
|
|
|
|
### 데이터베이스 보안
|
|
```sql
|
|
-- 사용자별 권한 설정
|
|
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;
|
|
```
|
|
|
|
## 🐛 문제 해결
|
|
|
|
### 연결 오류
|
|
```bash
|
|
# PostgreSQL 실행 확인
|
|
ps aux | grep postgres
|
|
|
|
# 포트 확인
|
|
lsof -i :5432
|
|
|
|
# 로그 확인
|
|
tail -f /usr/local/var/log/postgres.log
|
|
```
|
|
|
|
### 권한 오류
|
|
```sql
|
|
-- 데이터베이스 소유자 변경
|
|
ALTER DATABASE kumamoto_travel OWNER TO kumamoto_user;
|
|
|
|
-- 테이블 권한 부여
|
|
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO kumamoto_user;
|
|
```
|
|
|
|
### 스키마 초기화
|
|
```bash
|
|
# 모든 테이블 삭제 후 재생성
|
|
psql kumamoto_travel -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"
|
|
psql kumamoto_travel < server/schema_v2.sql
|
|
```
|
|
|
|
## 📈 성능 최적화
|
|
|
|
### 인덱스 확인
|
|
```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;
|
|
```
|
|
|
|
### 연결 풀 설정
|
|
```javascript
|
|
// server/db.js에서 연결 풀 조정
|
|
const pool = new Pool({
|
|
connectionString: process.env.DATABASE_URL,
|
|
max: 20, // 최대 연결 수
|
|
idleTimeoutMillis: 30000,
|
|
connectionTimeoutMillis: 2000,
|
|
});
|
|
```
|
|
|
|
## 🚀 프로덕션 배포
|
|
|
|
### 환경 변수 (프로덕션)
|
|
```env
|
|
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 설정
|
|
```javascript
|
|
// 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`에 접속하여 초기 설정을 완료할 수 있습니다.
|