Twitter Table Structure Guide
🐦 트위터 - Cassandra 테이블 설계 가이드
📋 개요
이 문서는 트위터와 같은 대규모 소셜 미디어 플랫폼의 데이터베이스 설계에 대한 종합 가이드입니다.
왜 이렇게 설계해야 하는지
각 테이블의 역할은 무엇인지
어떻게 동작하는지
단계별로 이해할 수 있도록 작성되었습니다.
🤔 왜 Cassandra를 사용하는가?
트위터의 특징
대량의 쓰기: 초당 수십만 개의 트윗 생성
빠른 읽기: 타임라인 조회 시 즉시 응답 필요
수평 확장: 사용자 증가에 따른 서버 확장 필요
시간 기반: 데이터 최신 트윗부터 시간순 정렬 중요
Cassandra의 장점
📊 관계형 DB (MySQL) vs Cassandra
관계형 DB:
복잡한 JOIN 연산 → 느린 읽기 성능
수직 확장 (서버 성능 향상) → 비용 ↗️
ACID 보장 → 일관성은 좋지만 성능 ↓
Cassandra:
비정규화된 테이블 → 빠른 읽기 성능 ⚡
수평 확장 (서버 대수 증가) → 비용 효율적
최종 일관성 → 성능 우선, 일관성은 eventual
📊 4개 핵심 테이블 상세 설명
1. 🏠 tweets 테이블 - 트윗의 원본 저장소
역할: 모든 트윗의 "진실의 원천(Source of Truth)"
Java 엔티티:
데이터 예시:
🔍 주요 사용 패턴:
POST /tweets: 새 트윗 저장GET /tweets/{tweetId}: 특정 트윗 조회다른 테이블에서 트윗 상세 정보 참조
⚠️ 중요한 점:
이 테이블은
user_id로 직접 조회하지 않습니다!"특정 사용자의 모든 트윗"은 다른 테이블에서 처리합니다.
2. 👥 followers_by_user 테이블 - 팔로우 관계
역할: "특정 사용자를 팔로우하는 모든 사람들"을 빠르게 찾기
복합 Primary Key 클래스
메인 엔티티
데이터 예시:
🔍 핵심 쿼리:
💡 왜 이렇게 설계했나요?
3. 📱 user_timeline 테이블 - 개인 타임라인 (Fan-out on Write)
역할: 각 사용자의 개인 타임라인을 미리 생성하여 저장
복합 Primary Key 클래스
메인 엔티티
🔄 Fan-out on Write 과정:
1단계: user-A가 "안녕하세요!" 트윗 작성
2단계: user-A의 팔로워들 조회
3단계: 각 팔로워의 타임라인에 트윗 추가
결과 데이터:
🔍 타임라인 조회 (매우 빠름!):
⚡ 성능 특징:
쓰기: O(팔로워 수) - 팔로워 수만큼 쓰기 발생
읽기: O(1) + 조회할 트윗 수 - 매우 빠름!
4. 🌟 celebrity_tweets 테이블 - 인플루언서 트윗 (Fan-out on Read)
역할: 팔로워가 많은 인플루언서의 트윗을 별도 저장
복합 Primary Key 클래스
메인 엔티티
🤔 왜 별도 테이블이 필요한가요?
문제 상황:
해결책: Fan-out on Read:
데이터 예시:
🔄 하이브리드 전략: Fan-out on Write + Fan-out on Read
전체 프로세스 시나리오
시나리오 1: 일반 사용자(user-A)가 트윗 작성
시나리오 2: 인플루언서(아이유)가 트윗 작성
시나리오 3: 사용자(user-1)가 타임라인 조회
성능 비교
🔍 Cassandra 핵심 개념 이해
파티션 키 vs 클러스터링 키
파티션 키 (Partition Key):
클러스터링 키 (Clustering Key):
커서 기반 페이지네이션
기존 OFFSET 방식의 문제점:
Cassandra 커서 방식:
🚀 구현 시 고려사항
1. 인플루언서 판단 기준
2. 배치 처리 최적화
3. 캐시 전략
4. 모니터링 지표
🔧 실제 구현 코드 예시
Repository 계층
Service 계층
💡 트러블슈팅 가이드
자주 발생하는 문제들
1. 타임라인 조회가 느려요
2. Fan-out 쓰기가 너무 느려요
3. 저장 공간이 부족해요
4. 일관성 문제가 발생해요
📚 참고 자료
🎉 마무리
대규모 소셜 미디어 플랫폼의 데이터베이스 설계 원칙의 핵심은 사용 패턴에 맞는 최적화와 트레이드오프의 균형.
핵심 포인트:
읽기 최적화: 자주 조회되는 데이터는 미리 계산하여 저장
쓰기 분산: 비용과 성능을 고려한 하이브리드 전략
확장성: 사용자 증가에 따른 유연한 아키텍처
Last updated