Skip to content

마커 재화 시스템 서버 API 추가 (소비/광고 리워드 적립) - #255

Open
unam98 wants to merge 1 commit into
mainfrom
feature/marker-quota-system
Open

마커 재화 시스템 서버 API 추가 (소비/광고 리워드 적립)#255
unam98 wants to merge 1 commit into
mainfrom
feature/marker-quota-system

Conversation

@unam98

@unam98 unam98 commented Aug 25, 2026

Copy link
Copy Markdown
Collaborator

작업 배경

  • 코스를 그릴 때 찍는 마커 개수가 지금은 사실상 무제한이라, 이걸 계정 단위 재화로 관리하고 다 쓰면 영상 광고를 보고 추가로 받을 수 있게 하는 기능의 서버 쪽을 먼저 구현.
  • 소비와 적립 각각 서로 다른 성격의 정합성 문제가 있어, 하나의 락 전략으로 뭉뚱그리지 않고 문제에 맞는 방식을 따로 적용함.

변경 사항

영역 내용
RunnectUser markerQuotaBalance 필드 추가 (기본값 20)
UserRepository consumeMarkerQuota/grantMarkerQuota — 조회·비교·차감을 조건부 UPDATE 한 문장으로 처리하는 원자적 쿼리
MarkerRewardClaim (신규) (user_id, rewardTransactionId) 유니크 제약으로 광고 리워드 중복 지급 방지
MarkerRewardGrantExecutor (신규) REQUIRES_NEW로 리워드 지급을 격리 실행, 유니크 제약 위반 시 롤백만 하고 호출부에서 "이미 지급됨"으로 처리
MarkerQuotaController/MarkerQuotaService GET /api/marker-quota, POST /api/marker-quota/consume, POST /api/marker-quota/reward

영향 범위

  • 신규 API 3개 추가, 기존 API/엔티티 필드에는 컬럼 추가 외 변경 없음 (기존 로직 영향 없음).
  • 런타임 영향: RunnectUser 테이블에 컬럼 1개, MarkerRewardClaim 테이블 1개가 새로 생성됨 (Hibernate ddl-auto: update로 자동 반영).
  • 리워드 지급 경로를 만들다가, REQUIRES_NEW 호출부에 별도 트랜잭션을 씌우면 스레드당 커넥션을 2개씩 점유해 동시 요청이 몰릴 때 커넥션 풀이 빨리 고갈될 수 있다는 걸 실제로 재현해 확인하고 수정함 — 같은 패턴(SocialSignUpRegistrar)이 이미 AuthService.signIn()에도 있어 잠재적으로 영향받을 수 있는데, 이번 PR 스코프 밖이라 별도로 공유만 함.

검증 매트릭스

영향 범위 테스트 코드
소비 시 같은 유저 요청이 몰려도 잔액이 음수로 내려가지 않음 요청이_몰려도_잔액이_음수로_내려가지_않는다
같은 rewardTransactionId로 동시 요청해도 지급은 정확히 1번만 발생 같은_트랜잭션ID로_동시에_요청해도_한_번만_지급된다

Test Plan

  • MarkerQuotaConcurrencyTest 2건 로컬 Postgres로 통과 확인
  • 기존 전체 테스트 스위트(91개 클래스) 회귀 없음 확인
  • Android 연동 후 실제 앱에서 E2E 확인 (다음 PR)

🤖 Generated with Claude Code

코스를 그릴 때 찍는 마커 개수를 계정 단위 재화로 관리한다. 소비(코스 저장 시
차감)는 조회-비교-차감을 조건부 UPDATE 한 문장으로 합쳐 락 없이 원자적으로
처리하고, 적립(광고 시청 보상)은 MarkerRewardClaim의 유니크 제약으로 같은
리워드 요청이 중복 지급되지 않도록 멱등성을 보장한다.

동시성 테스트(MarkerQuotaConcurrencyTest)로 두 경로 모두 검증:
- 잔액보다 많은 소비 요청이 몰려도 잔액이 음수로 내려가지 않음
- 같은 rewardTransactionId로 동시에 요청해도 지급은 정확히 1번만 발생

리워드 지급 경로를 만들며 REQUIRES_NEW 호출부에 별도 @transactional을
씌우면 스레드당 커넥션을 2개씩 점유해 동시 요청이 몰릴 때 커넥션 풀이
예상보다 빨리 고갈될 수 있다는 걸 실제로 재현해 확인하고 수정함.

Claude-Session: https://claude.ai/code/session_01SPpjaoQ3Pxfd4624hWZsik
@coderabbitai

coderabbitai Bot commented Aug 25, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 028dd9cb-78ad-49b2-8a98-6454ad256a8e


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants