-
Notifications
You must be signed in to change notification settings - Fork 2
Sisc1 52 be 주식 베팅 게임 구현 #95
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
The head ref may contain hidden characters: "SISC1-52-BE-\uC8FC\uC2DD-\uBCA0\uD305-\uAC8C\uC784-\uAD6C\uD604"
Conversation
개요이 변경사항은 베팅 모듈 전반에 Swagger/OpenAPI 문서화 주석을 추가하고, BettingController의 경로 변수를 문자열에서 Scope 열거형으로 변경하며, UserBetRequest에 검증 로직을 강화하고, BetRound 엔티티의 결제 로직에 보호 장치를 추가하고, Scope 열거형에 Jackson 직렬화 헬퍼를 도입합니다. 변경사항
추정 코드 리뷰 소요 시간🎯 2 (단순) | ⏱️ ~10분
관련 PR
추천 리뷰어
시
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (3)
backend/src/main/java/org/sejongisc/backend/betting/controller/BettingController.java(2 hunks)backend/src/main/java/org/sejongisc/backend/betting/dto/UserBetRequest.java(2 hunks)backend/src/main/java/org/sejongisc/backend/common/exception/ErrorCode.java(1 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
backend/src/main/java/org/sejongisc/backend/betting/controller/BettingController.java (1)
backend/src/main/java/org/sejongisc/backend/auth/controller/EmailController.java (1)
Tag(15-74)
🔇 Additional comments (3)
backend/src/main/java/org/sejongisc/backend/betting/controller/BettingController.java (1)
3-6: Swagger/OpenAPI 문서화가 잘 구현되었습니다.모든 엔드포인트에 명확한 설명과 예제가 추가되었으며, 다음과 같은 좋은 관행을 따르고 있습니다:
- 인증 principal 파라미터를
@Parameter(hidden = true)로 Swagger UI에서 숨김 처리- 각 엔드포인트의 가능한 응답 코드를 명확하게 문서화
- 한국어로 상세한 설명과 내부 로직 설명 제공
- 파라미터에 예제 값 포함
API 문서의 품질이 우수하여 API 사용자들이 쉽게 이해할 수 있습니다.
Also applies to: 29-143
backend/src/main/java/org/sejongisc/backend/betting/dto/UserBetRequest.java (2)
38-42: 유효성 검증 로직이 올바르게 구현되었습니다.
isStakePointsValid()메서드의 검증 로직이 정확합니다:
- 무료 베팅(
free = true)인 경우 포인트 검증을 건너뜀- 유료 베팅인 경우
stakePoints가 null이 아니고 10 이상이어야 함ErrorCode.BET_POINT_TOO_LOW와 일관성 있게 최소 10포인트 요구사항을 적용
@Schema(hidden = true)사용으로 내부 검증 메서드를 API 문서에서 적절히 숨김 처리했습니다.
4-4: Swagger 스키마 문서화가 명확합니다.모든 필드에 적절한 설명과 예제가 추가되었으며,
requiredMode를 사용하여 필수 필드를 명확하게 표시했습니다. DTO의 목적과 각 필드의 역할을 API 사용자가 쉽게 이해할 수 있습니다.Also applies to: 20-20, 23-23, 27-27, 31-31, 35-35
backend/src/main/java/org/sejongisc/backend/common/exception/ErrorCode.java
Show resolved
Hide resolved
discipline24
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
고생하셨습니다
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (2)
backend/src/main/java/org/sejongisc/backend/betting/entity/BetRound.java (2)
49-50: TODO 주석에 대한 검토를 권장합니다.현재
boolean타입으로 상태를 관리하고 있으며, Enum 클래스로의 변경을 고려하는 TODO 주석이 있습니다. 향후 라운드 상태가 더 세분화될 경우(예: PENDING, OPEN, LOCKED, SETTLED 등), Enum을 사용하면 타입 안정성과 확장성이 개선될 수 있습니다.Enum 기반의 상태 관리 구현을 원하시면 코드를 생성해드릴 수 있습니다.
107-120: 정산 로직에 적절한 가드가 추가되었습니다.중복 정산 방지(lines 111-113)와
finalPricenull 체크(lines 114-116)가 추가되어 안정성이 향상되었습니다. 다만 다른 비즈니스 로직에서는CustomException을 사용하는 반면, 여기서는IllegalArgumentException을 사용하고 있습니다. 일관성을 위해CustomException과 적절한ErrorCode를 사용하는 것을 고려해보세요.예시:
- if (finalPrice == null) { - throw new IllegalArgumentException("finalPrice must not be null"); - } + if (finalPrice == null) { + throw new CustomException(ErrorCode.INVALID_FINAL_PRICE); + }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (3)
backend/src/main/java/org/sejongisc/backend/betting/controller/BettingController.java(2 hunks)backend/src/main/java/org/sejongisc/backend/betting/entity/BetRound.java(3 hunks)backend/src/main/java/org/sejongisc/backend/betting/entity/Scope.java(2 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
backend/src/main/java/org/sejongisc/backend/betting/controller/BettingController.java (1)
backend/src/main/java/org/sejongisc/backend/auth/controller/EmailController.java (1)
Tag(15-74)
🔇 Additional comments (10)
backend/src/main/java/org/sejongisc/backend/betting/entity/BetRound.java (2)
3-77: Swagger 문서화 어노테이션이 적절하게 추가되었습니다.모든 필드에 명확한 한국어 설명이 포함된
@Schema어노테이션이 추가되어 API 문서의 가독성이 향상되었습니다.
122-127: 가격 동일 케이스의 비즈니스 로직을 확인하세요.현재
finalPrice가previousClosePrice와 정확히 같을 경우(compare == 0) RISE로 판정됩니다. 실제 주식 시장에서는 가격이 변동 없을 때를 별도로 처리하거나, 무승부로 간주하는 경우가 많습니다. 이것이 의도된 비즈니스 로직인지 확인하시기 바랍니다.만약 동일 가격일 때 특별한 처리가 필요하다면:
private BetOption determineResult(BigDecimal finalPrice) { int compare = finalPrice.compareTo(previousClosePrice); - if (compare >= 0) return BetOption.RISE; - return BetOption.FALL; + if (compare > 0) return BetOption.RISE; + if (compare < 0) return BetOption.FALL; + // 동일한 경우의 처리 (예: return BetOption.DRAW 또는 null) + return BetOption.RISE; // 또는 비즈니스 요구사항에 맞는 처리 }backend/src/main/java/org/sejongisc/backend/betting/entity/Scope.java (3)
3-6: Jackson 직렬화 지원 및 DayOfWeek 사용이 적절합니다.Jackson 어노테이션 추가로 enum의 직렬화/역직렬화가 명확해졌으며,
DayOfWeek상수 사용으로 가독성이 향상되었습니다.Also applies to: 23-30
36-40:from()메서드의 예외 처리를 확인하세요.
valueOf(value.toUpperCase())는 유효하지 않은 값에 대해IllegalArgumentException을 던집니다.@PathVariable로 사용될 때 Spring이 이를 400 Bad Request로 변환하지만, 사용자에게 더 명확한 에러 메시지를 제공하려면 명시적인 예외 처리를 고려하세요.더 명시적인 에러 처리 예시:
@JsonCreator public static Scope from(String value) { if (value == null) return null; + try { return Scope.valueOf(value.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("Invalid scope value: " + value + ". Must be DAILY or WEEKLY."); + } }다만 현재 구현도 Spring의 기본 처리로 충분할 수 있으니, 프로젝트의 에러 처리 정책에 따라 판단하시기 바랍니다.
42-45:toValue()메서드가 올바르게 구현되었습니다.
@JsonValue어노테이션을 통해 enum이 문자열로 직렬화되는 방식이 명확하게 정의되었습니다.backend/src/main/java/org/sejongisc/backend/betting/controller/BettingController.java (5)
3-6: Swagger 문서화를 위한 어노테이션이 적절하게 추가되었습니다.API 그룹화를 위한
@Tag어노테이션과 필요한 import 문이 올바르게 추가되었습니다.Also applies to: 29-29
34-60: 경로 변수를 Enum 타입으로 변경한 것은 좋은 개선입니다.
@PathVariable String scope를@PathVariable Scope scope로 변경하여 타입 안정성이 향상되었으며, 수동 파싱 로직이 제거되었습니다. Spring MVC가Scope.from()메서드(@JsonCreator)를 통해 자동으로 바인딩하므로, 유효하지 않은 값에 대해서는 자동으로 400 에러가 반환됩니다.Swagger 문서도 명확하게 작성되었습니다.
63-77: 베팅 라운드 이력 조회 엔드포인트 문서화가 명확합니다.API 동작과 향후 확장 가능성이 잘 설명되어 있습니다.
79-101: 베팅 등록 엔드포인트 문서화가 상세하고 적절합니다.무료/유료 베팅의 차이, 예상되는 응답 코드, 그리고 인증 파라미터를 API 문서에서 숨기는 처리가 모두 적절하게 구현되었습니다.
103-144: 베팅 취소 및 이력 조회 엔드포인트 문서화가 잘 작성되었습니다.두 엔드포인트 모두 명확한 설명, 적절한 응답 코드, 그리고 유용한 예시 값(UUID)이 포함되어 있어 API 사용자에게 도움이 됩니다.
Summary by CodeRabbit
릴리스 노트
Documentation
Bug Fixes