본문으로 건너뛰기

스티커 정책

1. 목적​

사용자가 콘텐츠를 정주행하면 리워드 스티커를 획득하여 수집 도감을 완성하는 게임화 요소를 제공합니다. 스티커 시스템은 사용자 참여도를 높이고, 콘텐츠 소비를 촉진하는 핵심 인센티브입니다.


2. 스티커 기본 구조​

2-1. 스티커 (Sticker)​

필드타입설명
episodeOneToOneField에피소드와 1:1 관계
nameCharField(200)스티커 이름 (다국어, TranslatableModel)
image_urlURLField(500)스티커 이미지 URL
base_scoreFloatField사전 계산된 기본 점수 (크론에서 업데이트)
score_updated_atDateTimeField점수 마지막 업데이트 시각
  • 에피소드 1개당 스티커 1개가 반드시 존재합니다.
  • 스티커 이름은 TranslatableModel 기반으로 서비스 언어별 제공됩니다.

2-2. 획득 (UserSticker)​

  • 사용자가 에피소드를 완독하면 스티커를 획득합니다.
  • 고유 제약: user + sticker 조합 (중복 획득 불가)
  • earned_at으로 획득 시각을 기록합니다.

3. 획득 API​

3-1. 스티커 획득​

  • Endpoint: POST /api/stickers/earn/<episode_id>/
  • 에피소드 완독 후 호출하여 스티커를 획득합니다.
  • 이미 획득한 스티커를 다시 요청하면 중복 처리 방지됩니다.

3-2. 보유 스티커 목록​

  • Endpoint: GET /api/stickers/
  • 사용자가 보유한 전체 스티커 목록을 반환합니다.

4. 스코어링 시스템​

스티커 노출 우선순위를 결정하는 점수 계산 로직입니다. 크론 작업을 통해 주기적으로 base_score가 업데이트됩니다.

4-1. 점수 계산 공식​

base_score = 신규(+3) + 캠페인(+2) + 어제노출(-1) + 인기도(+0.1 * 수집자수)
요소점수조건
신규 스티커+3최근 등록된 스티커
캠페인 대상+2활성 캠페인에 포함된 스티커
어제 노출-1전일 노출 이력이 있는 스티커
인기도 보너스+0.1 * 수집자 수수집자 수에 비례한 가산점

4-2. 노출 추적 페널티​

최근 7일 내 Popular/Missing 영역에서 노출된 스티커에는 -2점이 추가로 적용되어, 동일 스티커가 반복 노출되는 것을 방지합니다.


5. 스티커 통계 (StickerStats)​

스티커별 수집자 수를 기간별로 집계합니다.

필드설명
total_collectors전체 수집자 수
daily_collectors일간 수집자 수
weekly_collectors주간 수집자 수
monthly_collectors월간 수집자 수
last_updated마지막 업데이트 시각
  • 스티커와 1:1 관계 (OneToOne)

API​

  • Endpoint: GET /api/stickers/stats/

6. 인기 스티커 (StickersPopular)​

기간별, 국가별 인기 스티커 순위를 관리합니다.

필드설명
position순위
popularity_score인기 점수
period집계 기간: daily / weekly / monthly / all-time
country국가 코드 (KR, JP, EN, ES) 또는 null (글로벌)
  • 고유 제약: sticker + period + country 조합

API​

  • Endpoint: GET /api/stickers/popular/
  • 디버그: GET /api/stickers/popular/debug/<sticker_id>/

7. 미보유 스티커 (StickersMissing)​

사용자가 아직 보유하지 않은 스티커 목록을 관리합니다.

필드설명
user사용자
sticker미보유 스티커
position노출 순서
  • 고유 제약: user + sticker 조합
  • position 및 created_at 기준으로 정렬됩니다.

API​

  • Endpoint: GET /api/stickers/missing/

8. 공개 예정 스티커 (StickersUpcoming)​

아직 공개되지 않은 예정 스티커를 관리합니다.

필드설명
release_date공개 예정일
is_featured주요 스티커 여부
position노출 순서

API​

  • Endpoint: GET /api/stickers/upcoming/

9. 위시리스트 (StickerWishlist)​

사용자가 관심 있는 공개 예정 스티커를 저장합니다.

  • 고유 제약: user + sticker 조합
  • 최신순 정렬

API​

  • 목록 조회 / 추가: GET / POST /api/stickers/wishlist/
  • 삭제: DELETE /api/stickers/wishlist/<sticker_id>/

10. 노출 추적 (StickerExposure)​

사용자에게 Popular/Missing 영역에서 노출된 스티커를 기록하여 점수 계산에 활용합니다.

필드설명
exposure_typepopular (인기 영역) 또는 missing (미보유 영역)
exposed_at노출 시각
  • 고유 제약: user + sticker + exposure_type 조합
  • 동일 조합은 1개만 유지되며, exposed_at만 업데이트됩니다.
  • 최근 7일 내 노출된 스티커에 -2점 페널티가 적용됩니다.

11. 캠페인 (StickerCampaign)​

이벤트/캠페인과 스티커를 연결하여 노출 우선순위를 부스트합니다.

필드설명
event연결된 이벤트 (FK, 선택적)
campaign_name캠페인 이름
is_active활성 여부
priority_boost우선순위 가산점 (기본 +2점, 조정 가능)
start_date캠페인 시작일
end_date캠페인 종료일 (nullable)
  • 캠페인 대상 스티커에는 priority_boost 만큼의 가산점이 적용됩니다.
  • is_ongoing 속성으로 현재 진행 중 여부를 판단합니다: is_active가 true이고, 현재 시각이 start_date와 end_date 사이인 경우