버그 설명
#110 에서 기기 상태 조회와 예약 생성 검증이 "만료된 RESERVED 예약은 현재 활성 예약이 아니다"라는 기준으로 옮겨졌습니다. 그러나 같은 판정을 하는 나머지 지점은 여전히 status IN (RESERVED, RUNNING)만 보고 있어, 같은 예약이 화면과 내부 로직에서 다르게 해석됩니다.
1. UpdateMachineStatusServiceImpl:38-45
고장 복구 시 활성 예약을 근거로 availability를 재동기화하는데, 만료 여부를 보지 않습니다.
findActiveReservation(machine).ifPresent(reservation -> {
switch (reservation.getStatus()) {
case RESERVED -> machine.markAsReserved();
...
만료된 RESERVED 예약이 남아 있으면 markAsReserved()가 호출되어, #110 이 조회에서 감춘 상태를 DB에 다시 씁니다. 결과적으로 기기가 다시 잠깁니다. 이 목록에서 가장 영향이 큽니다.
2. ShutdownIdleMachinesServiceImpl:46
var activeMachineIds = Set.copyOf(reservationRepository.findMachineIdsByStatusIn(ACTIVE_STATUSES));
만료 예약이 걸린 기기를 사용 중으로 간주해 유휴 전원 차단 대상에서 제외합니다. 실제로는 아무도 사용하지 않는 기기가 계속 켜져 있게 됩니다.
3. DeleteMachineServiceImpl:27
만료 예약만 남아 있어도 findActiveReservationByMachineId().isPresent()가 참이 되어 기기를 삭제할 수 없습니다.
4. QueryAdminDashboardServiceImpl:35
countActiveReservations()가 만료 예약까지 활성으로 집계합니다. 관리자 대시보드의 활성 예약 수와 기기 목록에 보이는 상태가 어긋납니다.
5. DeleteUserServiceImpl:34
final boolean hasActiveReservations = reservationRepository.existsByUserAndStatusIn(user, activeStatuses);
만료 예약만 남은 사용자를 관리자가 삭제할 수 없습니다. 본인은 WithdrawUserServiceImpl로 탈퇴가 가능한데 관리자 삭제만 막히는 비대칭도 함께 발생합니다.
기타 사항
다섯 곳 모두 isActive() && !isExpired() 판정이 필요합니다. 판정 로직을 그대로 복제하면 중복이 8곳 가까이 되므로, 판정을 도메인과 쿼리 레벨로 올리는 작업을 먼저 하고 그 결과를 사용하는 편이 낫습니다.
ReservationLifecycleProcessor, ForceStopMachineServiceImpl은 SmartThings가 보고한 실제 기기 상태를 함께 보고 판단하므로 이 목록에서 제외했습니다.
판정 로직 이관은 #114 에서 다루므로, 이 이슈는 #110 머지와 #114 완료 이후에 착수하는 것을 권장합니다.
버그 설명
#110 에서 기기 상태 조회와 예약 생성 검증이 "만료된 RESERVED 예약은 현재 활성 예약이 아니다"라는 기준으로 옮겨졌습니다. 그러나 같은 판정을 하는 나머지 지점은 여전히
status IN (RESERVED, RUNNING)만 보고 있어, 같은 예약이 화면과 내부 로직에서 다르게 해석됩니다.1.
UpdateMachineStatusServiceImpl:38-45고장 복구 시 활성 예약을 근거로
availability를 재동기화하는데, 만료 여부를 보지 않습니다.만료된 RESERVED 예약이 남아 있으면
markAsReserved()가 호출되어, #110 이 조회에서 감춘 상태를 DB에 다시 씁니다. 결과적으로 기기가 다시 잠깁니다. 이 목록에서 가장 영향이 큽니다.2.
ShutdownIdleMachinesServiceImpl:46만료 예약이 걸린 기기를 사용 중으로 간주해 유휴 전원 차단 대상에서 제외합니다. 실제로는 아무도 사용하지 않는 기기가 계속 켜져 있게 됩니다.
3.
DeleteMachineServiceImpl:27만료 예약만 남아 있어도
findActiveReservationByMachineId().isPresent()가 참이 되어 기기를 삭제할 수 없습니다.4.
QueryAdminDashboardServiceImpl:35countActiveReservations()가 만료 예약까지 활성으로 집계합니다. 관리자 대시보드의 활성 예약 수와 기기 목록에 보이는 상태가 어긋납니다.5.
DeleteUserServiceImpl:34만료 예약만 남은 사용자를 관리자가 삭제할 수 없습니다. 본인은
WithdrawUserServiceImpl로 탈퇴가 가능한데 관리자 삭제만 막히는 비대칭도 함께 발생합니다.기타 사항
다섯 곳 모두
isActive() && !isExpired()판정이 필요합니다. 판정 로직을 그대로 복제하면 중복이 8곳 가까이 되므로, 판정을 도메인과 쿼리 레벨로 올리는 작업을 먼저 하고 그 결과를 사용하는 편이 낫습니다.ReservationLifecycleProcessor,ForceStopMachineServiceImpl은 SmartThings가 보고한 실제 기기 상태를 함께 보고 판단하므로 이 목록에서 제외했습니다.판정 로직 이관은 #114 에서 다루므로, 이 이슈는 #110 머지와 #114 완료 이후에 착수하는 것을 권장합니다.