1. 관계 구조 정리
1) 크리에이터 – 콘텐츠
- 한 명의 크리에이터는 여러 콘텐츠를 만든다.
→ Creator (1) : Content (N)
2) 사용자 – 크리에이터
- 한 명의 사용자는 여러 크리에이터를 구독할 수 있다.
- 한 명의 크리에이터는 여러 사용자에게 구독될 수 있다.
즉,
User ↔ Creator 는 N:M 관계이며,
이를 표현하기 위해 Subscription(구독) 테이블이 필요하다.
2. ERD 초안
User
User
- id (PK)
- email
- name
- created_at
Creator
Creator
- id (PK)
- user_id (FK → User.id)
- channel_name
- description
- created_at
Content
Content
- id (PK)
- creator_id (FK → Creator.id)
- title
- body
- status (DRAFT / PUBLISHED)
- created_at
Subscription
Subscription
- id (PK)
- user_id (FK → User.id)
- creator_id (FK → Creator.id)
- status
- started_at
- ended_at
3. Creator를 별도 테이블로 분리한 이유
모든 사용자가 크리에이터로 활동하는 것은 아니다.
- 일반 사용자
- 크리에이터 사용자
이 둘은 역할이 다르다.
User는 “서비스 사용자”라는 기본 엔티티이고,
Creator는 “콘텐츠를 생산하는 역할”을 가진 확장 엔티티다.
이는 역할 분리이자 책임 분리다.
4. Subscription 테이블이 필요한 이유
User ↔ Creator는 N:M 관계다.
데이터베이스는 N:M 관계를 직접 표현할 수 없으므로
중간 테이블로 분리해야 한다.
하지만 Subscription은 단순 연결 테이블이 아니다.
구독은 다음과 같은 비즈니스 상태를 가진다.
- 언제 시작했는가
- 어떤 요금제를 사용 중인가
- 현재 활성 상태인가
- 다음 결제일은 언제인가
따라서 Subscription은
“관계 표현 + 비즈니스 상태 관리”를 담당하는 독립 엔티티다.
5. 구독 테이블 컬럼 설계 (확장 버전)
Subscription
- id (PK)
- user_id (FK → User.id)
- creator_id (FK → Creator.id)
- plan_type (FREE / PREMIUM)
- price
- billing_cycle (MONTHLY / YEARLY)
- next_billing_at
- started_at
- canceled_at
- expired_at
- status (ACTIVE / PAUSED / CANCELED / EXPIRED)
- created_at
- updated_at
설계 포인트
- 단순 연결이 아니라 “구독 계약”을 표현한다.
- status로 현재 상태를 관리한다.
- canceled_at, expired_at 등으로 이력 추적이 가능하다.
6. 중복 구독 가능 여부
한 사용자가 같은 크리에이터에 중복 구독할 수 있는가?
일반적으로는 불가능하다.
따라서 다음과 같은 제약이 필요하다.
- UNIQUE (user_id, creator_id)
이를 통해 동일 사용자–크리에이터 조합의 중복 구독을 방지한다.
7. 구독 취소 시 처리 방식
구독을 취소하면 row를 삭제할 것인가?
일반적으로는 삭제하지 않는다.
이유는 다음과 같다.
- 결제 이력 추적 필요
- 통계 및 매출 분석 필요
- 재구독 판단 근거 필요
따라서 soft delete 또는 status 변경 방식으로 처리한다.
예시
- status = CANCELED
- canceled_at 기록
데이터는 유지하고 상태만 변경한다.
8. 기본 API 설계
크리에이터 생성
POST /api/creators
- 사용자 중 크리에이터 역할을 생성
구독 생성
POST /api/subscriptions
- user_id는 로그인 사용자 기준
- creator_id와 요금제 정보 전달
구독 취소
DELETE /api/subscriptions/{id}
- 실제 삭제 대신 상태 변경 처리 권장
특정 크리에이터의 콘텐츠 조회
GET /api/creators/{id}/contents
- Creator 1 : N Content 관계 반영
내 구독 목록 조회
GET /api/users/me/subscriptions
- 로그인 사용자 기준 구독 목록 조회
9. 최종 정리
- Creator는 모든 사용자가 아닌, 역할이 분리된 엔티티다.
- Content는 크리에이터가 생산한 콘텐츠를 관리한다.
- User ↔ Creator는 N:M 관계이며 Subscription이 이를 풀어낸다.
- Subscription은 단순 연결 테이블이 아니라,
요금제, 결제 주기, 상태를 가지는 독립적인 비즈니스 엔티티다.
결론적으로,
구독 테이블은 단순 연결이 아니라
“비즈니스 상태를 가지는 독립 엔티티”다.
이 관점이 잡히면 ERD 설계 수준이 한 단계 올라간다.
'백엔드 기초 재정비 > ERD 기반 API 설계' 카테고리의 다른 글
| ERD → API → Service 흐름 정리 (0) | 2026.02.24 |
|---|---|
| 구독 시스템 설계에서 status가 핵심인 이유 (0) | 2026.02.23 |
| ERD 설계 사고 복습 정리 (0) | 2026.02.21 |
| ERD → API 매핑 연습 (0) | 2026.02.20 |
| 자기참조 관계 (댓글–대댓글) 설계 정리 (0) | 2026.02.19 |