Conversation
기기 ID·기기 목록·건수·사용자 존재 여부를 만료 판정까지 포함해 조회하는 쿼리 네 개를 추가하였습니다. 기존 currentlyActive() 조건을 그대로 재사용하므로 상태별 타임아웃이 바뀌어도 판정이 함께 따라옵니다. - findCurrentlyActiveByMachineId: 기기 엔티티 없이 ID만으로 조회 - findCurrentlyActiveMachineIds: 활성 예약이 걸린 기기 ID 목록 - countCurrentlyActive: 활성 예약 수 집계 - existsCurrentlyActiveByUser: 사용자의 활성 예약 존재 여부 Claude-Session: https://claude.ai/code/session_015e3wA7eCqrHBVCvcZ51yM2
status IN (RESERVED, RUNNING)만 보던 판정 지점을 만료 예약까지 거르는 쿼리로 전환하여, 같은 예약이 화면과 내부 로직에서 다르게 해석되던 문제를 해소하였습니다. - UpdateMachineStatusServiceImpl: 고장 복구 시 만료 예약을 근거로 markAsReserved()가 호출되어 기기가 다시 잠기던 문제를 해소하였습니다 - ShutdownIdleMachinesServiceImpl: 만료 예약만 걸린 기기를 유휴 전원 차단 대상에 포함하도록 하였습니다 - DeleteMachineServiceImpl: 만료 예약만 남은 기기를 삭제할 수 있도록 하였습니다 - QueryAdminDashboardServiceImpl: 활성 예약 집계에서 만료 예약을 제외하여 기기 목록에 보이는 상태와 어긋나지 않도록 하였습니다 - DeleteUserServiceImpl: 만료 예약만 남은 사용자를 관리자가 삭제할 수 있도록 하여 본인 탈퇴와의 비대칭을 없앴습니다 findActiveReservationByMachineId는 만료 제외가 이름에 드러나지 않아 findCurrentlyActiveReservationByMachineId로 바꾸고, 만료 판정을 ActiveReservationSelector의 부수 효과가 아니라 쿼리 단계에서 처리하도록 하였습니다. 사용처가 사라진 countActiveReservations, existsByUserAndStatusIn은 제거하였습니다. SmartThings가 보고한 실제 기기 상태를 함께 보는 ReservationLifecycleProcessor, ForceStopMachineServiceImpl과 통세척 계열은 대상에서 제외하였습니다. Closes #115 Claude-Session: https://claude.ai/code/session_015e3wA7eCqrHBVCvcZ51yM2
…eservation-checks [reservation] 만료 예약을 활성으로 판정하는 지점 정리
| final var activeStatuses = List.of(ReservationStatus.RESERVED, ReservationStatus.RUNNING); | ||
| final boolean hasActiveReservations = reservationRepository.existsByUserAndStatusIn(user, activeStatuses); | ||
| // 만료되지 않은 활성 예약이 있는지 확인. 만료 예약만 남은 사용자는 본인 탈퇴와 동일하게 삭제할 수 있어야 한다 | ||
| final boolean hasActiveReservations = reservationRepository.existsCurrentlyActiveByUser(user); |
There was a problem hiding this comment.
🟠 MEDIUM · DATA_INTEGRITY
만료 예약을 정리하지 않고 사용자를 삭제합니다
existsCurrentlyActiveByUser()는 스케줄러가 아직 정리하지 않은 만료 RESERVED 행이 있어도 false를 반환하므로 서비스가 곧바로 userRepository.delete(user)를 실행합니다. 그러나 해당 예약의 만료 처리와 연결된 기기의 availability 복구는 수행하지 않습니다.
예약 FK가 사용자 삭제를 제한하면 탈퇴가 무결성 제약 위반으로 실패하고, cascade로 예약이 삭제되면 스케줄러가 더 이상 그 예약을 발견할 수 없어 기기가 예약 당시의 비가용 상태로 남을 수 있습니다. 사용자를 삭제하기 전에 만료 예약을 정상적인 만료 경로로 처리하여 기기를 해제해야 합니다.
|
지적하신 대로 만료 예약을 정리하지 않고 사용자를 삭제하는 공백이 맞습니다. 본인 탈퇴( 다만 우려하신 두 가지 결과는 현재 코드베이스에서는 발생하지 않아, 이슈에 함께 적어두었습니다.
실제로 남는 문제는 DB의 배포 자체를 막을 심각도는 아니라고 판단하여 이 PR은 그대로 진행하고, 수정은 #132 에서 다루겠습니다. |
개요
#129 의 내용을 상용환경에 배포합니다.