Sisc1 be 베팅게임 수정#134
Hidden character warning
Conversation
WalkthroughUserBet 취소 흐름을 ACTIVE → CANCELED로 원자적 전환하도록 변경하고, 취소 시 포인트 환불(타겟: BetRound ID) 및 BetRound 통계(업/다운 카운트·합계 포인트) 감소를 수행하도록 로직을 변경했으며, UserBetResponse DTO에 BetRound 관련 4개 필드를 추가했습니다. Changes
Sequence Diagram(s)sequenceDiagram
participant U as 사용자
participant S as BettingService
participant UR as UserBetRepository
participant BR as BetRoundRepository
participant PH as PointHistoryRepository
U->>S: cancelUserBet(userBetId)
S->>UR: updateStatusToCanceled(userBetId, userId, ACTIVE, CANCELED)
alt 업데이트된 행 = 0
S-->>U: 에러 (BET_ALREADY_PROCESSED)
else 업데이트된 행 = 1
S->>S: bet 정보 조회 (amount, option, round)
alt 유료 베팅인 경우
S->>PH: 포인트 환불 이력 생성 (targetId = roundId)
end
alt option == RISE
S->>BR: decrementUpStats(roundId, points)
else
S->>BR: decrementDownStats(roundId, points)
end
S-->>U: 취소 완료 (CANCELED)
end
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes
Possibly related PRs
Suggested reviewers
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
📜 Recent review detailsConfiguration used: CodeRabbit UI Review profile: CHILL Plan: Pro 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (2)
backend/src/main/java/org/sejongisc/backend/betting/repository/BetRoundRepository.java (1)
34-42: 증가 쿼리와 대칭적인 통계 감소 쿼리 구현은 좋습니다. 다만 음수로 내려가는 경우를 DB에서 한 번 더 막을 수 있습니다.현재 구현은
incrementUp/DownStats와 완전히 대칭이라 기본 동작은 문제 없습니다. 다만 서비스 레이어에서 중복 취소나 잘못된 파라미터로 이 메서드가 여러 번 호출될 가능성을 완전히 배제하기 어렵다면,
upBetCount >= 1 AND upTotalPoints >= :pointsdownBetCount >= 1 AND downTotalPoints >= :points와 같은 조건을 WHERE 절에 추가해 통계 값이 0 아래로 내려가지 않도록 DB 차원의 방어 로직을 두는 것도 고려해 볼 만합니다.
backend/src/main/java/org/sejongisc/backend/betting/dto/UserBetResponse.java (1)
6-53: 라운드 가격·통계 필드 추가 및 매핑은 일관되고 올바르게 보입니다.
previousClosePrice / settleClosePrice / upBetCount / downBetCount를BetRound에서 끌어와 함께 내려주는 구조는 클라이언트 입장에서 필요한 정보들을 잘 묶어준 것 같습니다(Line 28-32, 50-53).사소한 부분이지만, 이미
BetRound round = bet.getRound();(Line 36)를 선언하셨으니 아래의.betRoundId(...),.roundTitle(...),.symbol(...)도round.get…를 사용하도록 통일하면 NPE 디버깅이나 필드 추가 시 읽기성이 조금 더 좋아질 것 같습니다. 그 외에는 DTO 설계·매핑 모두 무난합니다.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (3)
backend/src/main/java/org/sejongisc/backend/betting/dto/UserBetResponse.java(3 hunks)backend/src/main/java/org/sejongisc/backend/betting/repository/BetRoundRepository.java(1 hunks)backend/src/main/java/org/sejongisc/backend/betting/service/BettingService.java(1 hunks)
backend/src/main/java/org/sejongisc/backend/betting/service/BettingService.java
Show resolved
Hide resolved
There was a problem hiding this comment.
Actionable comments posted: 1
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (4)
backend/src/main/java/org/sejongisc/backend/betting/entity/BetStatus.java(1 hunks)backend/src/main/java/org/sejongisc/backend/betting/repository/UserBetRepository.java(2 hunks)backend/src/main/java/org/sejongisc/backend/betting/service/BettingService.java(1 hunks)backend/src/main/java/org/sejongisc/backend/common/exception/ErrorCode.java(1 hunks)
🔇 Additional comments (6)
backend/src/main/java/org/sejongisc/backend/betting/entity/BetStatus.java (1)
6-7: LGTM!CANCELED 상태 추가가 적절합니다. 취소 흐름을 명확하게 표현하고 있습니다.
backend/src/main/java/org/sejongisc/backend/common/exception/ErrorCode.java (1)
84-84: LGTM!중복 취소 시도를 처리하기 위한 에러 코드가 적절합니다. HttpStatus.CONFLICT와 명확한 메시지가 잘 정의되어 있습니다.
backend/src/main/java/org/sejongisc/backend/betting/repository/UserBetRepository.java (1)
24-27: 원자적 상태 전환 로직이 잘 구현되어 있습니다.
@Modifying과 조건부 UPDATE를 사용한 원자적 상태 전환이 적절합니다.updatedCount를 반환하여 서비스 레이어에서 동시성 제어를 할 수 있도록 설계되었습니다. 다만 Line 3의 임포트 오류를 먼저 수정해야 합니다.backend/src/main/java/org/sejongisc/backend/betting/service/BettingService.java (3)
215-227: 이전 리뷰의 멱등성 문제가 해결되었습니다.원자적 상태 전환(
updateStatusToCanceled)과updatedCount체크를 통해 동시 취소 요청 시 중복 처리를 방지하는 로직이 잘 구현되었습니다. 이전 리뷰에서 제기된 포인트 이중 환불 및 통계 이중 감소 문제가 해결되었습니다.Based on learnings, the past review comment raised concerns about idempotency which are now properly addressed.
233-242: 포인트 환불 로직이 적절합니다.Line 240에서
betRound.getBetRoundID()를targetId로 사용하는 것이 베팅 생성(Line 176) 및 정산(Line 291)과 일관성 있게 처리되고 있습니다.
244-250: 검증 완료: 메서드가 올바르게 구현되어 있습니다.BetRoundRepository에서 두 메서드 모두 다음과 같이 올바르게 구현되어 있습니다:
decrementUpStats(line 37):@Modifying(clearAutomatically = true)및@Query로 원자적 UPDATE 구문 포함decrementDownStats(line 42):@Modifying(clearAutomatically = true)및@Query로 원자적 UPDATE 구문 포함두 메서드 모두 데이터베이스 수준의 원자적 연산을 통해 통계를 감소시키므로 코드가 안전합니다.
Summary by CodeRabbit
기능 개선
새로운 기능
✏️ Tip: You can customize this high-level summary in your review settings.