@startuml !theme mono title User Service ERD ' ==================== ' Entity 정의 ' ==================== entity "users" as users { * **id** : UUID <> -- * name : VARCHAR(100) * phone_number : VARCHAR(20) <> * email : VARCHAR(255) <> * password_hash : VARCHAR(255) * role : VARCHAR(20) * status : VARCHAR(20) last_login_at : TIMESTAMP * created_at : TIMESTAMP * updated_at : TIMESTAMP -- CHECK: role IN ('OWNER', 'ADMIN') CHECK: status IN ('ACTIVE', 'INACTIVE', 'LOCKED', 'WITHDRAWN') } entity "stores" as stores { * **id** : UUID <> -- * user_id : UUID <> <> * name : VARCHAR(200) * industry : VARCHAR(100) * address : VARCHAR(500) business_hours : TEXT * created_at : TIMESTAMP * updated_at : TIMESTAMP } ' ==================== ' 관계 정의 ' ==================== users ||--|| stores : "1:1\nhas" ' ==================== ' 인덱스 정의 ' ==================== note right of users **인덱스** - idx_users_email (email) - idx_users_phone_number (phone_number) - idx_users_status (status) **비즈니스 규칙** - email: 로그인 ID (UNIQUE) - phone_number: 중복 불가 - password_hash: bcrypt 암호화 - role: OWNER(소상공인), ADMIN(관리자) - status: 계정 상태 관리 - last_login_at: 최종 로그인 추적 end note note right of stores **인덱스** - idx_stores_user_id (user_id) **비즈니스 규칙** - user_id: User와 1:1 관계 (UNIQUE) - ON DELETE CASCADE - industry: 업종 (예: 음식점, 카페) - business_hours: 영업시간 정보 end note ' ==================== ' Redis 캐시 구조 ' ==================== note top of users **Redis 캐시** 1. JWT 세션 - Key: session:{token} - Value: {userId, role, email, expiresAt} - TTL: JWT 만료시간 (예: 7일) 2. JWT Blacklist - Key: blacklist:{token} - Value: {userId, logoutAt} - TTL: 토큰 만료시간까지 end note ' ==================== ' 제약조건 설명 ' ==================== note bottom of stores **Foreign Key 제약** - FK: user_id → users(id) - ON DELETE CASCADE - ON UPDATE CASCADE **1:1 관계 보장** - UNIQUE: user_id - 하나의 User는 최대 하나의 Store end note @enduml