문서 파일 정리
This commit is contained in:
271
docs/02_기술_문서/데이터_모델_설계.md
Normal file
271
docs/02_기술_문서/데이터_모델_설계.md
Normal file
@@ -0,0 +1,271 @@
|
||||
# 적자 탈출 가계부 - 데이터 모델 설계
|
||||
|
||||
## 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. **감사 로깅**
|
||||
- 중요 데이터 변경에 대한 감사 로그 유지
|
||||
- 비정상적인 접근 패턴 모니터링
|
||||
Reference in New Issue
Block a user