# 적자 탈출 가계부 - 데이터베이스 스키마 요약

## 개요
이 문서는 적자 탈출 가계부 애플리케이션의 데이터베이스 스키마를 요약합니다. 모든 테이블은 PostgreSQL 기반으로 설계되었으며, Supabase 환경에 최적화되어 있습니다.

## 기술적 특징
- **UUID 기반 기본 키**: 모든 테이블은 UUID 타입의 기본 키를 사용합니다.
- **타임존 지원**: 날짜/시간 데이터는 `TIMESTAMP WITH TIME ZONE` 타입을 사용하여 국제적 사용을 지원합니다.
- **정확한 금액 계산**: 모든 금액은 `DECIMAL(12, 2)` 타입을 사용하여 정확한 계산을 보장합니다.
- **Row Level Security (RLS)**: 모든 테이블에 RLS 정책이 적용되어 사용자는 자신의 데이터만 접근할 수 있습니다.
- **자동 생성 시간**: 모든 테이블은 `created_at`과 `updated_at` 필드를 포함하여 데이터 생성 및 수정 시간을 자동으로 기록합니다.
- **계층적 카테고리**: 카테고리는 계층 구조를 지원하여 상위/하위 카테고리 관계를 표현할 수 있습니다.
- **인덱스 최적화**: 자주 조회되는 필드에 인덱스를 적용하여 성능을 최적화했습니다.

## 테이블 구조

### 1. users (01_users.sql)
사용자 정보를 관리하는 테이블입니다.
- **주요 필드**: id, email, name, created_at, updated_at
- **관련 함수**: 사용자 프로필 자동 생성 트리거
- **보안**: RLS 정책으로 사용자는 자신의 정보만 접근 가능

### 2. categories (02_categories.sql)
지출/수입 카테고리를 관리하는 테이블입니다.
- **주요 필드**: id, user_id, name, parent_id, type, icon, color, is_system
- **계층 구조**: parent_id를 통해 상위/하위 카테고리 관계 표현
- **기본 데이터**: 15개 이상의 기본 카테고리와 하위 카테고리 제공
- **관련 함수**: 카테고리 계층 조회 함수

### 3. expenses (03_expenses.sql)
지출/수입 내역을 관리하는 테이블입니다.
- **주요 필드**: id, user_id, amount, is_income, category_id, card_id, date, memo
- **관련 함수**: 월별 지출 합계, 카테고리별 지출 분석 함수
- **인덱스**: user_id, category_id, date에 인덱스 적용

### 4. budgets (04_budgets.sql)
월별/카테고리별 예산을 관리하는 테이블입니다.
- **주요 필드**: id, user_id, category_id, year, month, amount
- **관련 함수**: 예산 대비 지출 비율 조회 함수
- **인덱스**: user_id, category_id, year, month에 인덱스 적용

### 5. cards (05_cards.sql)
카드 정보를 관리하는 테이블입니다.
- **주요 필드**: id, user_id, name, card_number, payment_day, is_active
- **관련 함수**: 월별 카드 사용 현황 조회 함수
- **보안**: 카드 번호는 마스킹 처리

### 6. limits (06_limits.sql)
지출 한도를 관리하는 테이블입니다.
- **주요 필드**: id, user_id, card_id, category_id, amount, period, start_date, end_date
- **관련 함수**: 활성화된 한도 및 사용량 조회 함수, 한도 경고 알림 트리거
- **제약 조건**: 카드 또는 카테고리 중 하나는 반드시 지정되어야 함

### 7. templates (07_templates.sql)
자주 사용하는 지출/수입 템플릿을 관리하는 테이블입니다.
- **주요 필드**: id, user_id, name, amount, is_income, category_id, card_id, usage_count
- **관련 함수**: 템플릿 사용 카운터 증가, 템플릿으로 지출/수입 생성, 자주 사용하는 템플릿 조회

### 8. notifications (08_notifications.sql)
알림 시스템을 관리하는 테이블입니다.
- **주요 필드**: id, user_id, title, message, type, related_id, is_read, priority
- **알림 타입**: limit_warning, budget_warning, payment_reminder, system_message, custom
- **관련 함수**: 알림 읽음 표시, 사용자 알림 조회, 예산 초과 알림 생성, 카드 결제일 알림 생성

### 9. analysis_settings (09_analysis_settings.sql)
사용자별 분석 설정을 관리하는 테이블입니다.
- **주요 필드**: id, user_id, setting_key, setting_value (JSONB)
- **설정 키**: dashboard_widgets, report_preferences, analysis_period, chart_colors 등
- **관련 함수**: 분석 설정 가져오기/저장, 기본 분석 설정 생성, 지출 분석 함수(카테고리별 지출 비율, 기간별 지출 추이)

## 마이그레이션 실행 방법
1. `run_migrations.sh` 스크립트를 사용하여 모든 마이그레이션 파일을 순서대로 실행합니다.
2. 환경 변수를 통해 데이터베이스 연결 정보를 설정할 수 있습니다.
   ```bash
   DB_HOST=localhost DB_PORT=5432 DB_NAME=mydb DB_USER=user DB_PASSWORD=pass ./run_migrations.sh
   ```

## 확장 계획
- **데이터 동기화**: 여러 기기 간 데이터 동기화 메커니즘 구현
- **분석 기능 확장**: 고급 재무 분석 및 예측 기능 추가
- **성능 최적화**: 대량의 트랜잭션 데이터 처리를 위한 파티셔닝 및 인덱싱 최적화
- **API 엔드포인트**: RESTful API 및 GraphQL 엔드포인트 개발

## 참고 사항
- 모든 SQL 파일은 `migrations` 디렉토리에 순서대로 번호가 매겨져 있습니다.
- 각 테이블은 자체 SQL 파일에 정의되어 있어 관리가 용이합니다.
- 트리거와 함수는 관련 테이블과 동일한 파일에 정의되어 있습니다.
