[reservation] 만료 예약을 활성으로 판정하는 지점 정리 - #129
Merged
Merged
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
Member
|
/review |
exijn
approved these changes
Sep 10, 2026
This was referenced Sep 10, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
개요
status IN (RESERVED, RUNNING)만 보던 활성 예약 판정 지점을 만료 예약까지 거르는 쿼리로 전환하여, 같은 예약이 화면과 내부 로직에서 다르게 해석되던 문제를 해소하였습니다.#110이 조회에서 감춘 만료 예약이 다른 경로에서는 여전히 기기와 사용자를 잠그고 있었습니다.본문
활성 예약 쿼리 추가
#114에서 도입한currentlyActive()조건을 재사용하여ReservationRepositoryCustom에 쿼리 네 개를 추가하였습니다. 판정 로직을 서비스에 복제하지 않으므로, 상태별 타임아웃이 바뀌면 모든 호출부가 함께 따라옵니다.findCurrentlyActiveByMachineId: 기기 엔티티 없이 ID만으로 조회findCurrentlyActiveMachineIds: 활성 예약이 걸린 기기 ID 목록countCurrentlyActive: 활성 예약 수 집계existsCurrentlyActiveByUser: 사용자의 활성 예약 존재 여부판정 지점 전환
UpdateMachineStatusServiceImpl: 고장 복구 시 만료 예약을 근거로markAsReserved()가 호출되어 기기가 다시 잠기던 문제를 해소하였습니다.ShutdownIdleMachinesServiceImpl: 만료 예약만 걸린 기기를 유휴 전원 차단 대상에 포함하도록 하였습니다.DeleteMachineServiceImpl: 만료 예약만 남은 기기를 삭제할 수 있도록 하였습니다.QueryAdminDashboardServiceImpl: 활성 예약 집계에서 만료 예약을 제외하여 기기 목록에 보이는 상태와 어긋나지 않도록 하였습니다.DeleteUserServiceImpl: 만료 예약만 남은 사용자를 관리자가 삭제할 수 있도록 하여WithdrawUserServiceImpl을 통한 본인 탈퇴와의 비대칭을 없앴습니다.findActiveReservationByMachineId는 만료 제외 여부가 이름에 드러나지 않아findCurrentlyActiveReservationByMachineId로 변경하였습니다. 만료 판정도ActiveReservationSelector의 부수 효과가 아니라 쿼리 단계에서 처리하도록 옮겼으며, 이 과정에서QueryAllMachinesStatusServiceImpl의 지연 로딩이 fetch join으로 정리되었습니다. 사용처가 사라진countActiveReservations,existsByUserAndStatusIn은 제거하였습니다.조사 중 확인한 사항
이슈에 적힌
UpdateMachineStatusServiceImpl과DeleteMachineServiceImpl은 동작상으로는 이미 정상이었습니다.#114에서ActiveReservationSelector.selectPrimary()가 후보를isCurrentlyActive()로 거르게 되면서 만료 예약이 반환되지 않는 상태였습니다. 다만 만료 제외가 대표 예약 선택기의 부수 효과에 의존하는 구조는 그대로여서, 이번에 쿼리 레벨로 내렸습니다. 실제 버그가 남아 있던 곳은 나머지 세 곳입니다.테스트
ReservationRepositoryCurrentlyActiveTest에 만료 예약만 남은 사용자와 기기 픽스처를 추가하고, 신규 쿼리 네 개와 대표 예약 선택 결과를 실제 DB 대상으로 검증하였습니다.DeleteUserServiceTest에 만료 예약만 남은 사용자가 삭제되는 케이스를 추가하였습니다.gradlew.bat test전체 통과를 확인하였습니다.범위에서 제외한 것
ReservationLifecycleProcessor와ForceStopMachineServiceImpl은 SmartThings가 보고한 실제 기기 상태를 함께 보므로 이슈에서 제외된 대로 두었습니다. 통세척 계열(RunWasherTubCleanServiceImpl,ReleaseFinishedWasherTubCleanServiceImpl,WasherTubCleanMachineGuard)도 이슈 목록에 없어 건드리지 않았습니다. 이들 역시 만료 예약을 활성으로 보며, 특히 점유 해제 경로는 기기가CLEANING에 고정되는 문제가 있습니다. 후속 이슈 #131 로 분리하였습니다.Closes #115
https://claude.ai/code/session_015e3wA7eCqrHBVCvcZ51yM2