[BE] [FIX] 포인트 예외 처리 및 모의트레이딩 재베팅 로직 수정#183
Hidden character warning
Conversation
개요베팅 시스템의 상태 관리를 개선하기 위한 변경 사항입니다. CANCELED 상태를 제거하고, 기존 베팅을 업데이트하는 기능을 추가하며, 저장소 조회 방식을 변경하고, 인증 요구 사항을 강화합니다. 변경 사항
예상 코드 리뷰 난이도🎯 3 (중간 난이도) | ⏱️ ~25 분 관련 이슈
관련 PR
추천 검토자
축시
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
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
🤖 Fix all issues with AI agents
In
`@backend/src/main/java/org/sejongisc/backend/point/service/PointHistoryService.java`:
- Around line 86-94: The recover(CustomException e) `@Recover` method in
PointHistoryService will never be invoked because the `@Retryable` is configured
with include = {OptimisticLockingFailureException.class}, so CustomException is
not a retryable exception; either remove this dead recover(CustomException e)
method or replace/add a `@Recover` method that matches the retryable exception
(e.g., recover(OptimisticLockingFailureException e) or recover(Exception e) if
you want a catch-all) so that Spring Retry will call it after retries are
exhausted; if the intent is to let CustomException propagate immediately, simply
delete recover(CustomException e).
🧹 Nitpick comments (2)
backend/src/main/java/org/sejongisc/backend/common/auth/config/SecurityConfig.java (1)
109-116: 인증 엔드포인트 추가는 적절합니다.
/api/user-bets/**패턴이 인증 필수 엔드포인트로 추가되어 베팅 관련 API가 보호됩니다.다만, Line 116의
.anyRequest().permitAll()이 활성화되어 있어 명시적으로 지정되지 않은 모든 엔드포인트가 공개됩니다. 향후 새로운 API 추가 시 인증 설정을 누락할 수 있으니, 운영 환경에서는.anyRequest().authenticated()로 변경하고 공개 API만 명시적으로permitAll()하는 방식을 권장합니다.backend/src/main/java/org/sejongisc/backend/betting/entity/UserBet.java (1)
78-86: 재베팅 로직이 적절하게 구현되었습니다.
updateBet메서드가 베팅 옵션, 포인트, 무료 여부를 업데이트하고 상태를 초기화하는 로직이 잘 구현되어 있습니다.방어적 코딩 관점에서, 현재 상태가
DELETED일 때만 재베팅이 가능하도록 엔티티 레벨에서 검증을 추가하면 서비스 레이어의 버그로 인한 의도치 않은 상태 변경을 방지할 수 있습니다.♻️ 상태 검증 추가 제안 (선택사항)
// 재베팅 처리 public void updateBet(BetOption option, Integer stakePoints, boolean isFree) { + if (this.betStatus != BetStatus.DELETED) { + throw new IllegalStateException("재베팅은 DELETED 상태에서만 가능합니다."); + } this.option = option; this.stakePoints = stakePoints; this.isFree = isFree; this.betStatus = BetStatus.ACTIVE; this.isCorrect = false; this.payoutPoints = null; }
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (8)
backend/src/main/java/org/sejongisc/backend/betting/entity/BetRound.javabackend/src/main/java/org/sejongisc/backend/betting/entity/BetStatus.javabackend/src/main/java/org/sejongisc/backend/betting/entity/UserBet.javabackend/src/main/java/org/sejongisc/backend/betting/repository/UserBetRepository.javabackend/src/main/java/org/sejongisc/backend/betting/service/BettingScheduler.javabackend/src/main/java/org/sejongisc/backend/betting/service/BettingService.javabackend/src/main/java/org/sejongisc/backend/common/auth/config/SecurityConfig.javabackend/src/main/java/org/sejongisc/backend/point/service/PointHistoryService.java
💤 Files with no reviewable changes (2)
- backend/src/main/java/org/sejongisc/backend/betting/entity/BetStatus.java
- backend/src/main/java/org/sejongisc/backend/betting/service/BettingScheduler.java
🔇 Additional comments (8)
backend/src/main/java/org/sejongisc/backend/betting/entity/BetRound.java (1)
129-134: LGTM!주석의 오타가 제거되었습니다. 기능적 변경 없이 코드 정리만 수행되었습니다.
backend/src/main/java/org/sejongisc/backend/betting/repository/UserBetRepository.java (1)
12-12: LGTM!기존
existsByRoundAndUserId대신findByRoundAndUserId를 사용하여 재베팅 로직에서 기존 베팅을 조회하고 업데이트할 수 있도록 변경되었습니다. Spring Data JPA 네이밍 컨벤션을 올바르게 따르고 있습니다.backend/src/main/java/org/sejongisc/backend/betting/entity/UserBet.java (1)
73-76: LGTM!
cancel()메서드의 주석이 추가되어 가독성이 향상되었습니다.backend/src/main/java/org/sejongisc/backend/betting/service/BettingService.java (5)
163-168: 재베팅 시 통계 일관성 검증재베팅 경로(기존 DELETED 상태 베팅이 있는 경우)에서도 통계가 증가합니다.
cancelUserBet메서드에서는 취소 시 통계를 차감하지만, DELETED 상태로 변경되는 경로에서도 동일하게 통계가 차감되는지 확인이 필요합니다.만약 DELETED 상태 전환 시 통계가 차감되지 않았다면, 재베팅 시 중복으로 통계가 증가할 수 있습니다.
202-207: 예외 처리 구조 적절함
DataIntegrityViolationException처리를 통해 동시 베팅 요청에 대한 DB 레벨 보호가 구현되어 있습니다.@Transactional어노테이션이 있으므로 예외 발생 시 통계 증가와 포인트 차감도 함께 롤백됩니다.
209-213: LGTM!
getActiveRoundResponse메서드는Optional.map을 사용하여 엔티티를 DTO로 깔끔하게 변환합니다. Controller에서 LazyInitializationException을 방지하기 위한 적절한 접근입니다.
185-200: 재베팅 시updateBet메서드가 올바르게 상태를 ACTIVE로 설정하고 있습니다.
UserBet.updateBet()메서드(라인 79-86)에서this.betStatus = BetStatus.ACTIVE;로 명시적으로 상태를 설정하며,isCorrect를 false로 초기화하고payoutPoints를 null로 초기화하여 재베팅에 필요한 모든 상태 변경을 정확하게 처리하고 있습니다.
149-155: 상태 검증 결과: 코드가 올바르게 구현되었습니다BetStatus 열거형에는 ACTIVE, DELETED, CLOSED만 존재하며,
cancel()메서드는 상태를 정확히BetStatus.DELETED로 설정합니다. 주석(line 141)에 명시된 "취소 이력이 있는 베팅도 재배팅 가능"이라는 의도와 코드(line 153)의BetStatus.DELETED확인이 일치하고 있습니다.updateBet()메서드에서 상태를BetStatus.ACTIVE로 변경하여 재베팅이 정상적으로 처리되므로, 현재 구현에는 문제가 없습니다.
✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.
backend/src/main/java/org/sejongisc/backend/point/service/PointHistoryService.java
Show resolved
Hide resolved
discipline24
left a comment
There was a problem hiding this comment.
고생하셨습니다~ 토끼 리뷰만 손보면 될거같네요.
PR 올린 후 백엔드 카톡방에 코드리뷰 요청해주세요~
|
토끼 리뷰는 디버깅 해보고 찾아봤을 때 실제 동작과 다른 것 같아서 반영 안 했습니다! 확인 한번만 부탁드려용 아래에 관련 내용 첨부할게용
+)
|
|
오 역시. 고생하셨습니다 |
Summary by CodeRabbit
릴리즈 노트
새로운 기능
버그 수정
보안
정리
✏️ Tip: You can customize this high-level summary in your review settings.