데이터베이스 설계

← 아키텍처 개요


요약

항목 내용
DB PostgreSQL 16 (Alpine, 512MB)
ORM Spring Data JPA + QueryDSL 5.1.0
마이그레이션 Flyway (V1: 스키마, V2: 인덱스)
ID 전략 Snowflake ID (BIGINT)
암호화 messages.content → AES-256
테이블 수 16개

ER 다이어그램

erDiagram
    users ||--o{ chat_room_members : "참여"
    users ||--o{ messages : "전송"
    users ||--o{ message_reactions : "리액션"
    users ||--o{ friends : "친구"
    users ||--o{ friend_requests : "요청"
    users ||--o{ blocks : "차단"
    users ||--o{ hidden_friends : "숨김"
    users ||--o{ reports : "신고"
    users ||--o{ device_tokens : "디바이스"
    users ||--|| notification_settings : "설정"
    users ||--o{ refresh_tokens : "인증"
    users ||--o{ password_reset_tokens : "리셋"
    users ||--o{ terms_agreements : "약관"
    users ||--o{ profile_history : "이력"

    chat_rooms ||--o{ chat_room_members : "포함"
    chat_rooms ||--o{ messages : "메시지"
    messages ||--o{ message_reactions : "리액션"

    users {
        bigint id PK
        varchar email UK
        varchar nickname
        varchar status
        varchar online_status
    }
    chat_rooms {
        bigint id PK
        varchar name
        varchar type
    }
    messages {
        bigint id PK
        bigint chat_room_id FK
        bigint sender_id FK
        varchar content "AES-256"
        varchar type
    }

테이블 목록 (16개)

핵심 테이블

# 테이블 PK 전략 주요 컬럼 설명
1 users Snowflake email(UK), nickname, status, role, online_status, status_message 사용자
2 chat_rooms Snowflake name, type(DIRECT/GROUP/SELF), announcement 채팅방
3 chat_room_members Snowflake chat_room_id(FK), user_id(FK), role, last_read_message_id 채팅방 멤버
4 messages Snowflake chat_room_id(FK), sender_id(FK), content(AES-256), type, file_, link_preview_, reply_to, forwarded_from 메시지
5 message_reactions IDENTITY message_id(FK), user_id(FK), emoji 리액션

친구/차단

# 테이블 PK 전략 UK 제약 설명
6 friends Snowflake (user_id, friend_id) 친구 관계
7 friend_requests Snowflake (requester_id, receiver_id) 친구 요청
8 blocks Snowflake (blocker_id, blocked_id) 차단
9 hidden_friends IDENTITY (user_id, friend_id) 숨김

시스템

# 테이블 PK 전략 설명
10 reports Snowflake 신고 (사용자/메시지/채팅방)
11 device_tokens Snowflake FCM 디바이스 토큰
12 notification_settings Snowflake 알림 설정 (1:1 with users)
13 refresh_tokens Snowflake JWT Refresh Token
14 password_reset_tokens IDENTITY 비밀번호 리셋 토큰
15 terms_agreements IDENTITY 약관 동의
16 profile_history IDENTITY 프로필 변경 이력

주요 인덱스

테이블 인덱스 용도
messages (chat_room_id, created_at DESC) 메시지 히스토리 조회
messages GIN(to_tsvector(content)) 전문 검색
chat_room_members (chat_room_id, user_id) 멤버십 확인
friends (user_id), (friend_id), (status) 친구 목록
friend_requests (requester_id), (receiver_id), (status) 요청 목록
reports (status), (created_at DESC) 관리자 조회

API 설계