#92 [BE] SISC1-204 [FEAT] 출석 세션 기능 개선#97
Hidden character warning
Conversation
…-201-BE-Swagger-고도화
…-201-BE-Swagger-고도화
…-201-BE-Swagger-고도화
- 출석체크 세션 내 라운드(주차) 복수 생성 기능 추가 - 라운드별 출석, 정보조회, 수정/삭제 API 신규 구현 - 출석 세션 생성 시 출석 가능 시간 및 출석ID 반환 추가 - 라운드 수정: 일자, 시간, 인정시간 변경 가능 - 출석 요청: 라운드ID, 위치값, 시간 고려 응답(성공/실패/사유) - 세션 위치 재설정 API 추가
Walkthrough출석 라운드(AttendanceRound) 엔티티·리포지토리·서비스·컨트롤러 및 관련 DTO가 추가되었고, 세션 위치 업데이트 엔드포인트와 라운드 기반 체크인·조회(익명 지원 포함) 흐름 및 JWT 기반 사용자 추출이 도입되었습니다. (요약 50단어 이내) Changes
Sequence Diagram(s)sequenceDiagram
participant Client
participant RoundCtrl as AttendanceRoundController
participant RoundSvc as AttendanceRoundService
participant AttendSvc as AttendanceService
participant RoundRepo as AttendanceRoundRepository
participant AttendRepo as AttendanceRepository
Note over Client,RoundCtrl: 라운드 생성
Client->>RoundCtrl: POST /api/attendance/sessions/{sessionId}/rounds
RoundCtrl->>RoundSvc: createRound(sessionId, request)
RoundSvc->>RoundRepo: save(round)
RoundRepo-->>RoundSvc: AttendanceRound
RoundSvc-->>RoundCtrl: AttendanceRoundResponse
RoundCtrl-->>Client: 201 Created
rect rgb(235,245,255)
Note over Client,RoundCtrl: 라운드별 체크인 (토큰→userId 추출 → 서비스)
Client->>RoundCtrl: POST /api/attendance/rounds/check-in
RoundCtrl->>RoundCtrl: extractUserId(Authorization)
RoundCtrl->>AttendSvc: checkInByRound(request, userId)
AttendSvc->>RoundRepo: findRoundById(request.roundId)
RoundRepo-->>AttendSvc: AttendanceRound
AttendSvc->>AttendSvc: 검증(시간/중복/위치/익명)
alt 검증 성공
AttendSvc->>AttendRepo: save(attendance)
AttendRepo-->>AttendSvc: saved
AttendSvc-->>RoundCtrl: AttendanceCheckInResponse(success)
else 검증 실패
AttendSvc-->>RoundCtrl: AttendanceCheckInResponse(failure)
end
RoundCtrl-->>Client: 200 OK / 400 Bad Request
end
Estimated code review effort🎯 4 (Complex) | ⏱️ ~55분 주의 검토 영역:
Possibly related PRs
Suggested reviewers
Poem
Pre-merge checks and finishing touches✅ Passed checks (3 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.
Actionable comments posted: 9
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceService.java (1)
375-393: 익명 출석 데이터를 응답으로 변환할 때 NPE가 발생합니다익명 체크인에서는
Attendance.user가null인데,convertToResponse가attendance.getUser().getUserId()등을 바로 호출해NullPointerException이 납니다. 익명 사용자를 위한 분기 처리를 추가하고, 필요 시anonymousUserName을 반환하도록 보완해 주세요.- return AttendanceResponse.builder() - .attendanceId(attendance.getAttendanceId()) - .userId(attendance.getUser().getUserId()) - .userName(attendance.getUser().getName()) + User user = attendance.getUser(); + + return AttendanceResponse.builder() + .attendanceId(attendance.getAttendanceId()) + .userId(user != null ? user.getUserId() : null) + .userName(user != null ? user.getName() : attendance.getAnonymousUserName()) .attendanceSessionId(attendance.getAttendanceSession().getAttendanceSessionId()) .attendanceStatus(attendance.getAttendanceStatus())
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (18)
backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceRoundController.java(1 hunks)backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceSessionController.java(2 hunks)backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceCheckInRequest.java(1 hunks)backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceCheckInResponse.java(1 hunks)backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceResponse.java(1 hunks)backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceRoundRequest.java(1 hunks)backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceRoundResponse.java(1 hunks)backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceSessionResponse.java(1 hunks)backend/src/main/java/org/sejongisc/backend/attendance/dto/SessionLocationUpdateRequest.java(1 hunks)backend/src/main/java/org/sejongisc/backend/attendance/entity/Attendance.java(2 hunks)backend/src/main/java/org/sejongisc/backend/attendance/entity/AttendanceRound.java(1 hunks)backend/src/main/java/org/sejongisc/backend/attendance/entity/AttendanceSession.java(1 hunks)backend/src/main/java/org/sejongisc/backend/attendance/entity/RoundStatus.java(1 hunks)backend/src/main/java/org/sejongisc/backend/attendance/repository/AttendanceRepository.java(1 hunks)backend/src/main/java/org/sejongisc/backend/attendance/repository/AttendanceRoundRepository.java(1 hunks)backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceRoundService.java(1 hunks)backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceService.java(4 hunks)backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceSessionService.java(2 hunks)
🧰 Additional context used
🧬 Code graph analysis (3)
backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceRoundRequest.java (1)
backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceCheckInResponse.java (1)
Getter(15-35)
backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceCheckInResponse.java (1)
backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceRoundRequest.java (1)
Getter(11-22)
backend/src/main/java/org/sejongisc/backend/attendance/entity/AttendanceRound.java (2)
backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceCheckInResponse.java (1)
Getter(15-35)backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceRoundRequest.java (1)
Getter(11-22)
🔇 Additional comments (3)
backend/src/main/java/org/sejongisc/backend/attendance/entity/RoundStatus.java (1)
6-20: 깔끔한 enum 구현입니다.라운드 상태를 명확하게 표현하는 enum이며, description 필드를 통해 한글 설명도 제공하고 있습니다.
backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceResponse.java (1)
45-49: 라운드 ID 필드 추가가 적절합니다.새로운 라운드 기능을 지원하기 위해
attendanceRoundId필드가 추가되었으며, Swagger 문서화도 잘 되어 있습니다.backend/src/main/java/org/sejongisc/backend/attendance/entity/AttendanceSession.java (1)
53-56: 라운드 관계 설정이 잘 되어 있습니다.
OneToMany관계가 적절한 cascade, fetch, orphanRemoval 설정과 함께 구성되었으며, 기존attendances관계와 일관된 패턴을 따르고 있습니다.
...end/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceRoundController.java
Show resolved
Hide resolved
...end/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceRoundController.java
Outdated
Show resolved
Hide resolved
backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceCheckInRequest.java
Show resolved
Hide resolved
backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceRoundRequest.java
Show resolved
Hide resolved
backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceRoundResponse.java
Show resolved
Hide resolved
backend/src/main/java/org/sejongisc/backend/attendance/dto/SessionLocationUpdateRequest.java
Show resolved
Hide resolved
...end/src/main/java/org/sejongisc/backend/attendance/repository/AttendanceRoundRepository.java
Outdated
Show resolved
Hide resolved
backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceRoundService.java
Show resolved
Hide resolved
backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceService.java
Show resolved
Hide resolved
- 관리자 권한 검증 추가 (@PreAuthorize) - DTO 입력값 검증 강화 (@NotNull, @DecimalMin/Max, @Min/Max) - 요청 본문 검증 추가 (@Valid) - Enum 비교 최적화 (toString().equals() → ==) - JPQL LIMIT/OFFSET을 네이티브 SQL로 수정 - roundDate 클라이언트 입력 존중 - userId null 안전성 개선
There was a problem hiding this comment.
Actionable comments posted: 0
♻️ Duplicate comments (3)
backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceRoundController.java (1)
154-166: 인증 사용자 UUID 파싱 실패 시 임의 UUID를 생성하면 중복 출석 차단이 무력화됩니다.
authentication.getName()을UUID로 변환하지 못했을 때(Line 160) 무작위 UUID를 만들어 계속 진행하면, 정상 로그인 사용자도 매번 다른 ID로 인식되어 중복 출석 검증과 포인트 집계가 모두 깨집니다.다음과 같이 수정하세요:
if (authentication != null && authentication.isAuthenticated()) { try { userId = UUID.fromString(authentication.getName()); log.info("라운드 출석 체크인 요청 (인증됨): roundId={}, userId={}", request.getRoundId(), userId); } catch (Exception e) { - log.warn("사용자 ID 파싱 실패, 임시 ID 사용: {}", e.getMessage()); - userId = UUID.randomUUID(); + log.error("사용자 ID 파싱 실패: {}", e.getMessage()); + throw new IllegalStateException("인증 정보에서 사용자 ID를 확인할 수 없습니다."); } } else { // 미인증 사용자: 임시 ID 사용 userId = UUID.randomUUID(); log.info("라운드 출석 체크인 요청 (미인증): roundId={}, 임시userId={}", request.getRoundId(), userId); }backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceService.java (1)
116-118: 익명 사용자 체크인 시 NPE가 발생합니다.
userId가null일 수 있는데, Line 118에서userRepository.findById(userId)를 호출하면 "The given id must not be null" 예외가 발생해 익명 체크인이 불가능합니다.다음과 같이 수정하세요:
public AttendanceCheckInResponse checkInByRound(AttendanceCheckInRequest request, UUID userId) { - // 사용자가 존재하면 조회, 없으면 null (익명 사용자 지원) - User user = userRepository.findById(userId).orElse(null); + // 사용자가 존재하면 조회, 없으면 null (익명 사용자 지원) + User user = null; + if (userId != null) { + user = userRepository.findById(userId).orElse(null); + }backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceRoundResponse.java (1)
108-135: 성능 최적화와 NPE 방어가 여전히 필요합니다.enum 비교 방식은 수정되었으나(
==사용), 다음 문제들이 남아있습니다:
- 성능 이슈: 출석 리스트를 3번 순회합니다 (Lines 109-111, 112-114, 115-117). 1번의 순회로 최적화할 수 있습니다.
- 잠재적 NPE:
getAttendances()가 null을 반환할 경우 NPE가 발생합니다.다음과 같이 개선하세요:
+import java.util.ArrayList; + public static AttendanceRoundResponse fromEntity(AttendanceRound round) { - long presentCount = round.getAttendances().stream() - .filter(a -> a.getAttendanceStatus() == AttendanceStatus.PRESENT) - .count(); - long lateCount = round.getAttendances().stream() - .filter(a -> a.getAttendanceStatus() == AttendanceStatus.LATE) - .count(); - long absentCount = round.getAttendances().stream() - .filter(a -> a.getAttendanceStatus() == AttendanceStatus.ABSENT) - .count(); + // null 방어 및 한 번의 순회로 모든 카운트 계산 + var attendances = round.getAttendances(); + if (attendances == null) { + attendances = new ArrayList<>(); + } + + long presentCount = 0; + long lateCount = 0; + long absentCount = 0; + + for (var attendance : attendances) { + AttendanceStatus status = attendance.getAttendanceStatus(); + if (status == AttendanceStatus.PRESENT) { + presentCount++; + } else if (status == AttendanceStatus.LATE) { + lateCount++; + } else if (status == AttendanceStatus.ABSENT) { + absentCount++; + } + } // 현재 시간 기준으로 라운드 상태를 실시간 계산 RoundStatus currentStatus = round.calculateCurrentStatus(); return AttendanceRoundResponse.builder() .roundId(round.getRoundId()) .roundDate(round.getRoundDate()) .startTime(round.getStartTime()) .endTime(round.getEndTime()) .allowedMinutes(round.getAllowedMinutes()) .roundStatus(currentStatus) .roundName(round.getRoundName()) .presentCount(presentCount) .lateCount(lateCount) .absentCount(absentCount) - .totalAttendees((long) round.getAttendances().size()) + .totalAttendees((long) attendances.size()) .build(); }
🧹 Nitpick comments (3)
backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceRoundController.java (2)
51-62: 상세 로깅이 프로덕션 환경에 적합한지 확인하세요.타입 정보와 세부 필드를 포함한 매우 상세한 디버그 로깅이 있습니다. 개발 중 디버깅용이라면 적절하지만, 프로덕션 환경에서는 로그 레벨을 조정하거나 제거를 고려하세요.
204-211: 에러 응답을 표준화된 DTO로 처리하세요.익명
HashMap을 사용한 에러 응답(Line 209-211)은 타입 안전성이 없고 일관성이 떨어집니다. 프로젝트의 표준 에러 응답 포맷(예:ErrorResponseDTO)을 사용하는 것을 권장합니다.예시:
} catch (Exception e) { log.error("라운드별 출석 명단 조회 실패: {}", e.getMessage()); - return ResponseEntity.status(400).body(new java.util.HashMap<String, String>() {{ - put("error", "라운드를 찾을 수 없습니다"); - }}); + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(ErrorResponse.of("ROUND_NOT_FOUND", "라운드를 찾을 수 없습니다")); }backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceService.java (1)
227-233: 지각 판별 로직이 중복된 시간 조회를 수행합니다.Line 227에서
LocalTime.now()를 다시 호출하지만, Line 143에서 이미checkTime으로 캡처했습니다. 일관성을 위해 동일한 시간 값을 사용하는 것이 좋습니다.- // 4. 출석 상태 판별 (정상/지각) - java.time.LocalTime now = java.time.LocalTime.now(); - java.time.LocalTime lateThreshold = round.getStartTime().plusMinutes(5); - AttendanceStatus status = now.isAfter(lateThreshold) ? + // 4. 출석 상태 판별 (정상/지각) + java.time.LocalTime lateThreshold = round.getStartTime().plusMinutes(5); + AttendanceStatus status = checkTime.isAfter(lateThreshold) ? AttendanceStatus.LATE : AttendanceStatus.PRESENT; - log.info("📊 출석 상태 판별: 현재시간={}, 시작시간={}, 지각기준={}, 판별상태={}", - now, round.getStartTime(), lateThreshold, status); + log.info("📊 출석 상태 판별: 현재시간={}, 시작시간={}, 지각기준={}, 판별상태={}", + checkTime, round.getStartTime(), lateThreshold, status);
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (6)
backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceRoundController.java(1 hunks)backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceCheckInRequest.java(1 hunks)backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceRoundRequest.java(1 hunks)backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceRoundResponse.java(1 hunks)backend/src/main/java/org/sejongisc/backend/attendance/repository/AttendanceRoundRepository.java(1 hunks)backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceService.java(5 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- backend/src/main/java/org/sejongisc/backend/attendance/repository/AttendanceRoundRepository.java
🧰 Additional context used
🧬 Code graph analysis (4)
backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceRoundResponse.java (2)
backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceRoundRequest.java (1)
Getter(15-55)backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceResponse.java (1)
Getter(11-114)
backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceRoundRequest.java (1)
backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceRoundResponse.java (1)
Getter(18-136)
backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceCheckInRequest.java (3)
backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceCheckInResponse.java (1)
Getter(15-35)backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceResponse.java (1)
Getter(11-114)backend/src/main/java/org/sejongisc/backend/attendance/dto/SessionLocationUpdateRequest.java (1)
Getter(11-20)
backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceRoundController.java (1)
backend/src/main/java/org/sejongisc/backend/common/auth/springsecurity/CustomUserDetailsService.java (1)
RequiredArgsConstructor(16-38)
🔇 Additional comments (5)
backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceCheckInRequest.java (1)
1-63: 이전 리뷰의 개선사항이 모두 반영되었습니다!필수 필드 검증(
@NotNull,@DecimalMin,@DecimalMax)과 Swagger 문서화가 잘 적용되어 있습니다. GPS 좌표 범위 검증도 적절하게 설정되어 있습니다.backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceRoundRequest.java (1)
1-55: 이전 리뷰의 개선사항이 모두 반영되었습니다!필수 필드 검증(
@NotNull,@Min,@Max)과 Swagger 문서화가 잘 적용되어 있습니다.allowedMinutes의 범위 제한(1~120분)도 적절합니다.backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceRoundController.java (1)
46-47: 관리자 권한 검증이 올바르게 추가되었습니다!라운드 생성, 수정, 삭제 엔드포인트에
@PreAuthorize가 적절하게 적용되어 이전 리뷰의 보안 이슈가 해결되었습니다.Also applies to: 110-111, 129-130
backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceService.java (2)
143-154: 시간 검증 로직이 명확하고 잘 구현되었습니다.날짜와 시간 검증을 분리하여 처리하고 상세한 로깅을 포함한 것이 좋습니다. 디버깅과 운영 모니터링에 도움이 됩니다.
378-383: 익명 사용자 처리 로직이 잘 구현되었습니다.
user가 null일 경우를 적절히 처리하고,anonymousUserName필드를 사용하여 익명 사용자 정보를 제공하는 것이 좋습니다.
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 (3)
backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceRoundController.java(1 hunks)backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceRoundRequest.java(1 hunks)backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceRoundResponse.java(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
- backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceRoundResponse.java
- backend/src/main/java/org/sejongisc/backend/attendance/dto/AttendanceRoundRequest.java
🧰 Additional context used
🧬 Code graph analysis (1)
backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceRoundController.java (1)
backend/src/main/java/org/sejongisc/backend/common/auth/springsecurity/CustomUserDetailsService.java (1)
RequiredArgsConstructor(16-38)
...end/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceRoundController.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 (2)
backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceRoundController.java(1 hunks)backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceRoundService.java(1 hunks)
🧰 Additional context used
🧬 Code graph analysis (2)
backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceRoundService.java (2)
backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceService.java (1)
Service(23-399)backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceSessionService.java (1)
Service(23-368)
backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceRoundController.java (2)
backend/src/main/java/org/sejongisc/backend/common/auth/springsecurity/CustomUserDetailsService.java (1)
RequiredArgsConstructor(16-38)backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceSessionController.java (1)
RestController(21-305)
...end/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceRoundController.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 (1)
backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceRoundController.java(1 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceRoundController.java (2)
backend/src/main/java/org/sejongisc/backend/common/auth/springsecurity/CustomUserDetailsService.java (1)
RequiredArgsConstructor(16-38)backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceSessionController.java (1)
RestController(21-305)
...end/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceRoundController.java
Show resolved
Hide resolved
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (1)
backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceSessionController.java (1)
203-226: 위치 재설정 엔드포인트 설계 및 로깅 관련 제안전반적으로 기존 컨트롤러 스타일(관리자 권한, 로깅, 서비스 위임, 200 OK 응답)과 잘 맞고, 일반 수정
PUT /{sessionId}와 위치 전용PUT /{sessionId}/location을 분리한 것도 명확해서 좋습니다.다만 두 가지 정도만 확인/검토를 제안합니다.
반경 유지 및 세션 상태 비즈니스 규칙 확인 권장
- JavaDoc/설명에 “반경은 기존 값 유지”라고 되어 있는데, 실제 구현이
AttendanceSessionService.updateSessionLocation(...)에서 확실히 보장되는지 한 번만 확인해 두면 좋겠습니다.- 진행 중(OPEN) 세션, 종료(CLOSED) 세션 등에 대해 위치 변경을 허용/차단하는 규칙이 있다면, Service 레벨에서 상태 검증이 들어가 있는지 같이 점검해 보시는 것을 권장합니다.
위도·경도 전체를 info 로그에 남기는 부분은 선택적 조정 여지
- 운영 환경에서 위치 정보가 민감하게 취급되어야 한다면,
- 로그 레벨을
debug로 내리거나,- 위도/경도의 일부만 마스킹하는 등
정책적으로 한 번 논의해 볼 만합니다. 지금도 기능적으로는 문제 없고, 단지 프라이버시나 로그 용량 관점에서의 선택 사항입니다.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceSessionController.java(2 hunks)
🔇 Additional comments (1)
backend/src/main/java/org/sejongisc/backend/attendance/controller/AttendanceSessionController.java (1)
10-10: 새 DTO import 적절하게 추가됨
SessionLocationUpdateRequest를 사용하는 신규 엔드포인트에 맞춰 import를 잘 추가하셨습니다. 다른 부분과도 일관적이고 별도 수정 필요 없어 보입니다.
Summary by CodeRabbit
New Features
Other