# 적자 탈출 가계부 - 데이터 모델 설계 ## 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. **감사 로깅** - 중요 데이터 변경에 대한 감사 로그 유지 - 비정상적인 접근 패턴 모니터링