Skip to content

[BE] SISC1-221 [FIX] api 응답 개선#138

Merged
Kosw6 merged 12 commits intomainfrom
SISC1-221-BE-api-응답-개선
Nov 24, 2025

Hidden character warning

The head ref may contain hidden characters: "SISC1-221-BE-api-\uc751\ub2f5-\uac1c\uc120"
Merged

[BE] SISC1-221 [FIX] api 응답 개선#138
Kosw6 merged 12 commits intomainfrom
SISC1-221-BE-api-응답-개선

Conversation

@ochanhyeok
Copy link
Contributor

@ochanhyeok ochanhyeok commented Nov 24, 2025

Summary by CodeRabbit

  • 새로운 기능

    • 베팅 기능용 주식 엔터티 및 심볼로 조회 가능한 검색 기능 추가
  • 리팩토링

    • 출석 세션에서 태그·가시성 관련 속성 및 관련 조회 로직 제거로 모델 간소화
    • 이에 따른 저장소·서비스 메서드 정리 및 응답 필드 축소
  • 테스트

    • 출석 라운드, 체크인 및 세션 위치 업데이트에 대한 단위/컨트롤러 테스트 추가
    • 기존 출석 세션 관련 일부 테스트 파일 제거 및 테스트 보안 설정 보강

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link

coderabbitai bot commented Nov 24, 2025

Walkthrough

세션의 tag 및 SessionVisibility 관련 필드·열거형·쿼리·서비스 메서드를 제거하고, AttendanceSession 관련 DTO/엔티티/리포지토리/서비스에서 해당 사용을 삭제했습니다. 별도로 새로운 JPA 엔티티 StockStockRepository가 추가되었고, 여러 단위 테스트가 추가·삭제·수정되었습니다.

Changes

코호트 / 파일(들) 변경 요약
세션 DTO/엔티티 필드 제거
backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceSessionRequest.java, backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceSessionResponse.java, backend/src/main/java/org/sejongisc/backend/attendance/entity/AttendanceSession.java
tagvisibility(및 관련 isVisible 응답 필드) 제거; 관련 임포트 정리
SessionVisibility 열거형 삭제
backend/src/main/java/org/sejongisc/backend/attendance/entity/SessionVisibility.java
SessionVisibility enum 파일 전체 삭제 (PUBLIC/PRIVATE 및 getDescription 제거)
리포지토리 쿼리 제거
backend/src/main/java/org/sejongisc/backend/attendance/repository/AttendanceSessionRepository.java
findByTag, findByTagAndStatus, findByVisibilityOrderByStartsAtDesc 메서드 삭제; 관련 임포트 제거
서비스 로직/메서드 변경
backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceSessionService.java
세션 생성/수정 시 tag/visibility 빌더 호출 제거; getSessionByCode, getSessionsByTag, getSessionsByStatus 제거; getPublicSessions()가 visibility 필터 대신 findAllByOrderByStartsAtDesc() 사용; convertToResponse에서 isVisible 미설정
신규 Stock 엔티티 및 리포지토리 추가
backend/src/main/java/org/sejongisc/backend/betting/entity/Stock.java, backend/src/main/java/org/sejongisc/backend/betting/repository/StockRepository.java
Stock JPA 엔티티(주요 필드: stockId, name, symbol, market, previousClosePrice, settleClosePrice) 추가; StockRepositoryfindBySymbol(String) 추가
테스트 추가/삭제/수정
backend/src/test/java/org/sejongisc/backend/attendance/controller/AttendanceRoundControllerTest.java, backend/src/test/java/org/sejongisc/backend/attendance/controller/AttendanceSessionControllerTest.java, backend/src/test/java/org/sejongisc/backend/attendance/service/* , backend/src/test/java/org/sejongisc/backend/attendance/controller/TestSecurityConfig.java
AttendanceRoundControllerTest, AttendanceRoundCheckInTest, AttendanceRoundServiceTest, SessionLocationUpdateTest 등 신규 추가; AttendanceSessionControllerTestAttendanceSessionServiceTest 일부 제거/수정; 테스트용 JwtParser 모킹 빈 추가 및 라운드 엔드포인트 security 매처 확장

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>
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~35 minutes

  • 주의 필요 영역:
    • getPublicSessions() 동작 변경(visibility 필터 제거)이 호출자 측에 미치는 영향 검토
    • 삭제된 서비스 메서드(getSessionByCode, getSessionsByTag, getSessionsByStatus)가 외부/다른 모듈에서 사용되는지 점검
    • 테스트 추가/삭제로 인한 커버리지 및 테스트 시나리오 누락 여부 확인
    • 신규 Stock 엔티티의 제약(unique, nullable)·정밀도 설정 검토

Possibly related PRs

Suggested reviewers

  • discipline24
  • Kosw6

Poem

🐰 태그는 사라지고 가시성도 물러나네
새로 온 Stock은 조용히 자리 잡고
메서드 몇 개는 길을 비켜주며
테스트들은 새로 피고 지네
당근으로 축하 — 폴짝! 🥕✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Title check ❓ Inconclusive PR 제목은 주요 변경사항인 tag, visibility 필드 제거 및 Stock 엔티티 추가와 같은 구체적인 내용을 명확하게 설명하지 않으며, '응답 개선'이라는 추상적 표현으로 변경사항의 핵심을 파악하기 어렵습니다. PR 제목을 더 구체적으로 변경하여 주요 변경사항을 명확히 드러내길 권장합니다. 예: '[BE] SISC1-221 Remove tag/visibility fields and add Stock entity' 또는 유사한 명확한 표현 사용.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch SISC1-221-BE-api-응답-개선

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5960b86 and 3b1ade7.

📒 Files selected for processing (4)
  • backend/src/test/java/org/sejongisc/backend/attendance/controller/AttendanceSessionControllerTest.java (0 hunks)
  • backend/src/test/java/org/sejongisc/backend/attendance/controller/TestSecurityConfig.java (2 hunks)
  • backend/src/test/java/org/sejongisc/backend/attendance/service/AttendanceServiceTest.java (0 hunks)
  • backend/src/test/java/org/sejongisc/backend/attendance/service/AttendanceSessionServiceTest.java (0 hunks)
💤 Files with no reviewable changes (3)
  • backend/src/test/java/org/sejongisc/backend/attendance/controller/AttendanceSessionControllerTest.java
  • backend/src/test/java/org/sejongisc/backend/attendance/service/AttendanceSessionServiceTest.java
  • backend/src/test/java/org/sejongisc/backend/attendance/service/AttendanceServiceTest.java
🔇 Additional comments (3)
backend/src/test/java/org/sejongisc/backend/attendance/controller/TestSecurityConfig.java (3)

3-4: LGTM!

테스트 설정에 필요한 임포트가 적절하게 추가되었습니다.


27-30: LGTM!

라운드 관련 엔드포인트에 대한 권한 설정이 올바르게 추가되었습니다. 와일드카드 패턴과 역할 요구사항이 적절하며, 더 구체적인 패턴을 먼저 배치하는 모범 사례를 따르고 있습니다.


16-19: 검증 완료: Mock 설정이 올바르게 구성됨

테스트 파일들에서 JwtParser mock이 다음과 같이 올바르게 관리되고 있습니다:

  • TemplateControllerTest.java: 각 테스트에서 when(jwtParser.validationToken(...)), when(jwtParser.getAuthentication(...)) 등으로 mock 동작 명시
  • LoginServiceImplTest.java: when(jwtParser.getUserIdFromToken(...)) 등으로 필요한 동작 설정
  • TestSecurityConfig의 unconfigured mock은 적절한 패턴으로, 각 테스트가 필요에 따라 동작을 구성

현재 구조는 표준적인 테스트 패턴이며 null 반환 문제는 발생하지 않습니다.


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 and usage tips.

@ochanhyeok ochanhyeok changed the title Sisc1 221 be api 응답 개선 [BE] SISC1-221 api 응답 개선 Nov 24, 2025
@ochanhyeok ochanhyeok changed the title [BE] SISC1-221 api 응답 개선 [BE] SISC1-221 [FIX] api 응답 개선 Nov 24, 2025
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between 68ac69c and 5960b86.

📒 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 엔티티는 더 이상 사용되지 않는 레거시 코드입니다. 정규화 관점에서는 현재 구조가 기술적으로 비정규화되어 있지만, 베팅 도메인에서는 라운드별 가격 스냅샷 보존이 필수적이므로 현재 설계가 적절합니다.

권장사항:

  1. Stock 엔티티가 정말 불필요하면 완전히 제거
  2. Stock이 향후 다른 용도로 필요하면, BetRound와의 독립적 관계를 명시적으로 문서화

@Kosw6 Kosw6 merged commit d56542e into main Nov 24, 2025
1 check passed
@Kosw6 Kosw6 deleted the SISC1-221-BE-api-응답-개선 branch November 24, 2025 14:20
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