diff --git a/backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceService.java b/backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceService.java index d0f80bfa..73449e60 100644 --- a/backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceService.java +++ b/backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceService.java @@ -15,6 +15,7 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.LocalTime; import java.util.List; import java.util.UUID; @@ -50,16 +51,17 @@ public AttendanceCheckInResponse checkInByRound(AttendanceCheckInRequest request user.getName(), request.getRoundId(), round.getRoundDate()); // 1. 라운드 시간 검증 - 통일된 로직 - LocalDate checkDate = LocalDate.now(); - LocalTime checkTime = LocalTime.now(); + LocalDateTime now = LocalDateTime.now(); + LocalDate checkDate = now.toLocalDate(); + LocalTime checkTime = now.toLocalTime(); LocalTime startTime = round.getStartTime(); LocalTime endTime = round.getEndTime(); LocalTime lateThreshold = startTime.plusMinutes(5); // 날짜 검증 if (!checkDate.equals(round.getRoundDate())) { - log.warn("❌ 출석 날짜 불일치: 라운드ID={}, 사용자={}, 현재날짜={}, 라운드날짜={}", - request.getRoundId(), user.getName(), checkDate, round.getRoundDate()); + log.warn("❌ 출석 날짜 불일치: 라운드ID={}, 사용자={}, 현재시간={}, 라운드날짜={}", + request.getRoundId(), user.getName(), now, round.getRoundDate()); return AttendanceCheckInResponse.builder() .roundId(request.getRoundId()) .success(false) @@ -71,7 +73,7 @@ public AttendanceCheckInResponse checkInByRound(AttendanceCheckInRequest request boolean isWithinTimeWindow = !checkTime.isBefore(startTime) && checkTime.isBefore(endTime); if (!isWithinTimeWindow) { log.warn("❌ 출석 시간 초과: 라운드ID={}, 사용자={}, 현재시간={}, 시작={}, 종료={}", - request.getRoundId(), user.getName(), checkTime, startTime, endTime); + request.getRoundId(), user.getName(), now, startTime, endTime); return AttendanceCheckInResponse.builder() .roundId(request.getRoundId()) .success(false) @@ -79,8 +81,8 @@ public AttendanceCheckInResponse checkInByRound(AttendanceCheckInRequest request .build(); } - log.info("✅ 시간 검증 성공: 라운드ID={}, 사용자={}, 시간={}, 범위=[{}~{}]", - request.getRoundId(), user.getName(), checkTime, startTime, endTime); + log.info("✅ 시간 검증 성공: 라운드ID={}, 사용자={}, 현재시간={}, 범위=[{}~{}]", + request.getRoundId(), user.getName(), now, startTime, endTime); // 2. 기존 출석 기록 확인 (PENDING 제외하고 실제 체크인한 기록만 중복으로 취급) Attendance existingAttendance = attendanceRepository.findByAttendanceRound_RoundIdAndUser(request.getRoundId(), user) diff --git a/backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceSessionService.java b/backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceSessionService.java index 8a5f920a..4e54198a 100644 --- a/backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceSessionService.java +++ b/backend/src/main/java/org/sejongisc/backend/attendance/service/AttendanceSessionService.java @@ -270,7 +270,7 @@ private String generateRandomCode() { /** * AttendanceSession 엔티티를 Response DTO로 변환 * - 기본 세션 정보: 제목, 기본 시작 시간, 출석 인정 시간, 보상 포인트 - * - 위치 정보: location 객체 (lat, lng) + * - 위치 정보: location 객체 (lat, lng, radiusMeters) */ private AttendanceSessionResponse convertToResponse(AttendanceSession session) { // 위치 정보 변환 (location이 존재하면 LocationInfo 객체 생성, 없으면 null) @@ -279,6 +279,7 @@ private AttendanceSessionResponse convertToResponse(AttendanceSession session) { location = AttendanceSessionResponse.LocationInfo.builder() .lat(session.getLocation().getLat()) .lng(session.getLocation().getLng()) + .radiusMeters(session.getLocation().getRadiusMeters()) .build(); }