Conversation
…-220-BE-API-응답-개선
…-220-BE-API-응답-개선
Walkthrough세션의 tag 및 SessionVisibility 관련 필드·열거형·쿼리·서비스 메서드를 제거하고, AttendanceSession 관련 DTO/엔티티/리포지토리/서비스에서 해당 사용을 삭제했습니다. 별도로 새로운 JPA 엔티티 Changes
Sequence Diagram(s)sequenceDiagram
participant Client
participant AttendanceSessionService
participant AttendanceSessionRepository
Client->>AttendanceSessionService: getPublicSessions()
Note over AttendanceSessionService: 변경된 흐름\n(visibility 필터 제거)
AttendanceSessionService->>AttendanceSessionRepository: findAllByOrderByStartsAtDesc()
AttendanceSessionRepository-->>AttendanceSessionService: List<AttendanceSession>
AttendanceSessionService-->>Client: List<AttendanceSessionResponse>
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~35 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 (4)
💤 Files with no reviewable changes (3)
🔇 Additional comments (3)
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: 5
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceSessionService.java (2)
94-107: 메서드 이름과 구현이 불일치합니다.JavaDoc에서는 "공개 세션 목록 조회" 및 "학생들이 볼 수 있는 모든 세션만 조회"라고 설명하지만, 실제 구현은
findAllByOrderByStartsAtDesc()를 호출하여 모든 세션을 반환합니다. 가시성 필터링이 제거된 것으로 보이나, 메서드 이름과 주석이 이를 반영하지 않습니다.다음 중 하나를 선택하여 수정하세요:
옵션 1: 메서드 이름 변경 (권장)
/** - * 공개 세션 목록 조회 - * - 학생들이 볼 수 있는 모든 세션만 조회 + * 모든 세션 목록 조회 * - 최신 순으로 정렬 */ @Transactional(readOnly = true) -public List<AttendanceSessionResponse> getPublicSessions() { +public List<AttendanceSessionResponse> getSessions() { List<AttendanceSession> sessions = attendanceSessionRepository .findAllByOrderByStartsAtDesc();옵션 2: JavaDoc 주석만 업데이트
/** - * 공개 세션 목록 조회 - * - 학생들이 볼 수 있는 모든 세션만 조회 + * 세션 목록 조회 + * - 가시성 필터링 없이 모든 세션 반환 * - 최신 순으로 정렬 */
280-311: JavaDoc 주석이 구현과 불일치합니다.284줄의 JavaDoc에서 "공개 여부: isVisible boolean"을 언급하지만, 실제 구현(302-309줄)에서는 해당 필드가 포함되어 있지 않습니다. PR의 목적에 따라 가시성 관련 필드가 제거된 것으로 보입니다.
JavaDoc을 다음과 같이 수정하세요:
/** * AttendanceSession 엔티티를 Response DTO로 변환 * - 기본 세션 정보: 제목, 시작 시간, 출석 인정 시간, 보상 포인트 * - 위치 정보: location 객체 (lat, lng) - * - 공개 여부: isVisible boolean */ private AttendanceSessionResponse convertToResponse(AttendanceSession session) {
🧹 Nitpick comments (1)
backend/src/main/java/org/sejongisc/backend/betting/entity/Stock.java (1)
24-25: 심볼 중복 방지 검증 추가 권장데이터베이스 레벨에서
unique = true제약조건이 설정되어 있으나, 애플리케이션 레벨에서 저장 전 중복 검증 로직이 없으면 동시성 환경에서 제약조건 위반 예외가 발생할 수 있습니다.서비스 레이어에서 저장 전 중복 검증을 추가하거나, 예외 처리 로직을 구현하여 사용자에게 명확한 오류 메시지를 제공하는 것을 권장합니다.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (14)
backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceSessionRequest.java(0 hunks)backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceSessionResponse.java(0 hunks)backend/src/main/java/org/sejongisc/backend/attendance/entity/AttendanceSession.java(0 hunks)backend/src/main/java/org/sejongisc/backend/attendance/entity/SessionVisibility.java(0 hunks)backend/src/main/java/org/sejongisc/backend/attendance/repository/AttendanceSessionRepository.java(0 hunks)backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceSessionService.java(1 hunks)backend/src/main/java/org/sejongisc/backend/betting/entity/Stock.java(1 hunks)backend/src/main/java/org/sejongisc/backend/betting/repository/StockRepository.java(1 hunks)backend/src/test/java/org/sejongisc/backend/attendance/controller/AttendanceRoundControllerTest.java(1 hunks)backend/src/test/java/org/sejongisc/backend/attendance/controller/AttendanceSessionControllerTest.java(0 hunks)backend/src/test/java/org/sejongisc/backend/attendance/service/AttendanceRoundCheckInTest.java(1 hunks)backend/src/test/java/org/sejongisc/backend/attendance/service/AttendanceRoundServiceTest.java(1 hunks)backend/src/test/java/org/sejongisc/backend/attendance/service/AttendanceSessionServiceTest.java(0 hunks)backend/src/test/java/org/sejongisc/backend/attendance/service/SessionLocationUpdateTest.java(1 hunks)
💤 Files with no reviewable changes (7)
- backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceSessionResponse.java
- backend/src/main/java/org/sejongisc/backend/attendance/entity/AttendanceSession.java
- backend/src/test/java/org/sejongisc/backend/attendance/service/AttendanceSessionServiceTest.java
- backend/src/main/java/org/sejongisc/backend/attendance/entity/SessionVisibility.java
- backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceSessionRequest.java
- backend/src/test/java/org/sejongisc/backend/attendance/controller/AttendanceSessionControllerTest.java
- backend/src/main/java/org/sejongisc/backend/attendance/repository/AttendanceSessionRepository.java
🧰 Additional context used
🧬 Code graph analysis (1)
backend/src/main/java/org/sejongisc/backend/betting/entity/Stock.java (2)
backend/src/main/java/org/sejongisc/backend/betting/dto/PriceResponse.java (1)
Getter(10-42)backend/src/main/java/org/sejongisc/backend/betting/entity/BetRound.java (1)
Entity(14-158)
🔇 Additional comments (9)
backend/src/test/java/org/sejongisc/backend/attendance/service/AttendanceRoundCheckInTest.java (1)
1-383: 테스트 커버리지가 우수합니다!체크인 서비스의 주요 시나리오들(정상 출석, 지각, 시간 초과, 중복 출석, 위치 불일치, 위치 정보 누락)을 포괄적으로 테스트하고 있으며, 모킹과 검증 로직이 정확합니다.
backend/src/test/java/org/sejongisc/backend/attendance/service/AttendanceRoundServiceTest.java (1)
1-308: 라운드 서비스 테스트가 잘 구성되어 있습니다!CRUD 작업에 대한 성공/실패 케이스가 균형있게 커버되어 있으며, 저장소 상호작용 검증이 적절히 수행되고 있습니다.
backend/src/test/java/org/sejongisc/backend/attendance/service/SessionLocationUpdateTest.java (3)
40-89: 테스트 로직이 올바릅니다.기존 위치가 있는 경우의 위치 업데이트를 적절히 검증하고 있습니다. 새로운 좌표가 응답에 반영되는지 확인하며, save 호출도 검증합니다.
92-135: 테스트 로직이 올바릅니다.기존 위치가 없는 경우 기본 반경(100m)으로 새 위치가 생성되는 것을 적절히 검증하고 있습니다.
138-153: 테스트 로직이 올바릅니다.세션이 존재하지 않는 경우 예외가 적절히 발생하는지 검증하고 있습니다.
backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceSessionService.java (1)
242-265: 메서드 구현이 올바릅니다.세션 위치 업데이트 로직이 적절합니다. 기존 위치의 반경을 유지하거나 기본값 100m를 사용하는 처리가 명확합니다.
backend/src/main/java/org/sejongisc/backend/betting/repository/StockRepository.java (1)
8-10: LGTM!리포지토리 인터페이스가 Spring Data JPA 규약을 잘 따르고 있습니다.
findBySymbol메서드는 Stock 엔티티의 unique symbol 필드에 적합하며, Optional 반환 타입으로 null-safety를 보장합니다.backend/src/main/java/org/sejongisc/backend/betting/entity/Stock.java (2)
31-35: 두 가지 구체적인 정보가 필요합니다. 실시간 데이터를 확인하겠습니다.조회 결과를 바탕으로 검증을 완료했습니다.
2025년 10월 초 비트코인은 $125,000 이상의 최고가를 기록했으며, 현재는 약 $84,171 수준입니다. 가장 고가 주식인 Berkshire Hathaway (BRK.A)는 2025년 11월 기준 약 $754,625입니다.
precision=15, scale=2설정은 최대 9,999,999,999.99 (약 9조 9천억)까지 지원합니다. 2025년 현재:
- 비트코인: ~$126,000 ✓
- 최고가 주식(BRK.A): ~$754,625 ✓
- 모든 가격이 정밀도 한계보다 훨씬 낮음
가장 낙관적인 암호화폐 예측(2030년까지 $250K-$1M)도 정밀도 범위 내입니다.
현재 정밀도 설정으로 충분합니다. 이 리뷰 의견은 근거가 없습니다.
18-35: Stock 엔티티는 사용되지 않으며, BetRound의 가격 데이터 중복은 의도된 스냅샷 패턴입니다검증 결과, Stock 엔티티가 코드베이스 전체에서 사용되지 않으므로(StockRepository는 정의만 되어있고 주입되지 않음), 데이터 불일치 위험은 없습니다. BetRound가 가격 정보를 직접 저장하는 현재 설계는 베팅 라운드 생성 시점의 가격을 불변 스냅샷으로 보존하는 의도된 패턴으로, 이후 정산(settle)에서 비교하는 방식입니다(line 154, BetRound.java).
다만
getPriceData()메소드 주석(line 54, BettingService.java)에서 "기존 Stock 대체"라 명시되어 있으므로, Stock 엔티티는 더 이상 사용되지 않는 레거시 코드입니다. 정규화 관점에서는 현재 구조가 기술적으로 비정규화되어 있지만, 베팅 도메인에서는 라운드별 가격 스냅샷 보존이 필수적이므로 현재 설계가 적절합니다.권장사항:
- Stock 엔티티가 정말 불필요하면 완전히 제거
- Stock이 향후 다른 용도로 필요하면, BetRound와의 독립적 관계를 명시적으로 문서화
Summary by CodeRabbit
새로운 기능
리팩토링
테스트
✏️ Tip: You can customize this high-level summary in your review settings.