Files
zellyy-finance/docs/02_기술_문서/데이터_모델_설계.md
2025-03-21 16:08:43 +09:00

6.3 KiB

적자 탈출 가계부 - 데이터 모델 설계

1. 핵심 데이터 엔티티

1.1 사용자(Users) 테이블

users
- id: UUID (PK)
- email: STRING (UNIQUE)
- password_hash: STRING
- name: STRING
- profile_image: STRING (nullable)
- created_at: TIMESTAMP
- updated_at: TIMESTAMP
- last_login_at: TIMESTAMP (nullable)
- notification_settings: JSON
- theme_preference: STRING (default: 'light')
- is_active: BOOLEAN (default: true)

1.2 카드(Cards) 테이블

cards
- id: UUID (PK)
- user_id: UUID (FK -> users.id)
- name: STRING
- card_type: ENUM ('credit', 'debit', 'prepaid')
- card_number_last4: STRING
- issuer: STRING
- color: STRING (for UI)
- payment_day: INTEGER (1-31)
- monthly_limit: DECIMAL
- is_active: BOOLEAN (default: true)
- created_at: TIMESTAMP
- updated_at: TIMESTAMP

1.3 카테고리(Categories) 테이블

categories
- id: UUID (PK)
- name: STRING
- icon: STRING
- color: STRING
- parent_id: UUID (FK -> categories.id, nullable)
- is_system: BOOLEAN (default: false)
- is_active: BOOLEAN (default: true)
- created_at: TIMESTAMP
- updated_at: TIMESTAMP

1.4 지출(Expenses) 테이블

expenses
- id: UUID (PK)
- user_id: UUID (FK -> users.id)
- card_id: UUID (FK -> cards.id)
- category_id: UUID (FK -> categories.id)
- amount: DECIMAL
- merchant: STRING
- transaction_date: TIMESTAMP
- description: TEXT (nullable)
- location: GEOGRAPHY (nullable)
- is_recurring: BOOLEAN (default: false)
- receipt_image: STRING (nullable)
- tags: STRING[] (nullable)
- created_at: TIMESTAMP
- updated_at: TIMESTAMP

1.5 한도(Limits) 테이블

limits
- id: UUID (PK)
- user_id: UUID (FK -> users.id)
- card_id: UUID (FK -> cards.id, nullable)
- category_id: UUID (FK -> categories.id, nullable)
- amount: DECIMAL
- period: ENUM ('daily', 'weekly', 'monthly')
- start_date: DATE
- end_date: DATE (nullable)
- is_active: BOOLEAN (default: true)
- created_at: TIMESTAMP
- updated_at: TIMESTAMP

1.6 알림(Notifications) 테이블

notifications
- id: UUID (PK)
- user_id: UUID (FK -> users.id)
- title: STRING
- message: TEXT
- type: ENUM ('limit_warning', 'payment_reminder', 'tip', 'system')
- related_entity_type: STRING (nullable)
- related_entity_id: UUID (nullable)
- is_read: BOOLEAN (default: false)
- created_at: TIMESTAMP
- read_at: TIMESTAMP (nullable)

1.7 템플릿(Templates) 테이블

templates
- id: UUID (PK)
- user_id: UUID (FK -> users.id)
- name: STRING
- category_id: UUID (FK -> categories.id)
- amount: DECIMAL (nullable)
- merchant: STRING (nullable)
- description: TEXT (nullable)
- is_favorite: BOOLEAN (default: false)
- created_at: TIMESTAMP
- updated_at: TIMESTAMP

2. 데이터 관계 및 제약 조건

2.1 테이블 간 관계 (ERD)

Users (1) --- (*) Cards
Users (1) --- (*) Expenses
Users (1) --- (*) Limits
Users (1) --- (*) Notifications
Users (1) --- (*) Templates

Cards (1) --- (*) Expenses
Cards (1) --- (*) Limits

Categories (1) --- (*) Expenses
Categories (1) --- (*) Limits
Categories (1) --- (*) Templates
Categories (1) --- (*) Categories (자기 참조: 부모-자식 관계)

2.2 기본 카테고리 목록

시스템에서 기본적으로 제공하는 카테고리 목록입니다:

  1. 식비

    • 식료품
    • 외식
    • 카페/음료
  2. 주거/통신

    • 월세/관리비
    • 전기/수도/가스
    • 인터넷/통신비
    • 가구/가전
  3. 교통

    • 대중교통
    • 자동차/유류비
    • 택시
  4. 쇼핑

    • 의류/패션
    • 화장품/미용
    • 전자기기
    • 생활용품
  5. 여가/문화

    • 영화/공연
    • 취미/레저
    • 여행/숙박
    • 도서/음악
  6. 의료/건강

    • 병원/약국
    • 운동/피트니스
  7. 교육

    • 학비/등록금
    • 학원/강의
    • 교재/학습도구
  8. 금융

    • 보험
    • 세금
    • 대출이자
    • 투자
  9. 기타

    • 기부/후원
    • 용돈/선물
    • 기타 지출

2.3 데이터 유효성 검사 규칙

사용자(Users)

  • 이메일은 유효한 형식이어야 하며 중복될 수 없음
  • 비밀번호는 최소 8자 이상, 영문/숫자/특수문자 조합
  • 이름은 필수 입력 항목

카드(Cards)

  • 카드 이름은 필수 입력 항목
  • 월 한도는 0보다 커야 함
  • 결제일은 1-31 사이의 값이어야 함

지출(Expenses)

  • 금액은 0보다 커야 함
  • 거래 날짜는 현재 날짜보다 미래일 수 없음
  • 카테고리는 필수 선택 항목

한도(Limits)

  • 한도 금액은 0보다 커야 함
  • 카드 ID와 카테고리 ID는 둘 다 null이거나, 둘 중 하나만 지정되어야 함
  • 시작 날짜는 필수 입력 항목

템플릿(Templates)

  • 템플릿 이름은 필수 입력 항목
  • 카테고리는 필수 선택 항목

3. 데이터베이스 인덱스 설계

성능 최적화를 위한 인덱스 설계:

users: (email)
cards: (user_id, is_active)
expenses: (user_id, card_id), (user_id, category_id), (user_id, transaction_date), (is_recurring)
limits: (user_id, card_id), (user_id, category_id), (user_id, is_active)
notifications: (user_id, is_read), (user_id, created_at)
templates: (user_id, is_favorite)
categories: (parent_id), (is_system)

4. 데이터 마이그레이션 전략

  1. 초기 설정

    • 기본 카테고리 데이터 생성
    • 시스템 설정 데이터 생성
  2. 버전 관리

    • 데이터베이스 스키마 버전 관리 시스템 도입
    • 각 마이그레이션에 고유 ID 부여
  3. 업그레이드 경로

    • 이전 버전에서 새 버전으로의 마이그레이션 스크립트 준비
    • 데이터 무결성 검증 단계 포함
  4. 롤백 전략

    • 각 마이그레이션에 대한 롤백 스크립트 준비
    • 중요 데이터 변경 전 백업 수행

5. 데이터 보안 고려사항

  1. 개인정보 보호

    • 사용자 비밀번호는 단방향 해시로 저장 (bcrypt 또는 Argon2)
    • 카드 번호는 마지막 4자리만 저장
    • 개인식별정보(PII)는 암호화하여 저장
  2. 접근 제어

    • 사용자는 자신의 데이터만 접근 가능
    • 관리자 권한은 최소 필요 인원에게만 부여
  3. 데이터 백업

    • 정기적인 데이터베이스 백업 수행
    • 백업 데이터 암호화 저장
  4. 감사 로깅

    • 중요 데이터 변경에 대한 감사 로그 유지
    • 비정상적인 접근 패턴 모니터링