Skip to content

[reservation] 만료 예약을 활성으로 판정하는 지점 정리 - #129

Merged
d1ng1724 merged 2 commits into
developfrom
fix/unify-currently-active-reservation-checks
Sep 10, 2026
Merged

[reservation] 만료 예약을 활성으로 판정하는 지점 정리#129
d1ng1724 merged 2 commits into
developfrom
fix/unify-currently-active-reservation-checks

Conversation

@d1ng1724

@d1ng1724 d1ng1724 commented Sep 10, 2026

Copy link
Copy Markdown
Contributor

개요

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은 제거하였습니다.

조사 중 확인한 사항

이슈에 적힌 UpdateMachineStatusServiceImplDeleteMachineServiceImpl은 동작상으로는 이미 정상이었습니다. #114에서 ActiveReservationSelector.selectPrimary()가 후보를 isCurrentlyActive()로 거르게 되면서 만료 예약이 반환되지 않는 상태였습니다. 다만 만료 제외가 대표 예약 선택기의 부수 효과에 의존하는 구조는 그대로여서, 이번에 쿼리 레벨로 내렸습니다. 실제 버그가 남아 있던 곳은 나머지 세 곳입니다.

테스트

  • ReservationRepositoryCurrentlyActiveTest에 만료 예약만 남은 사용자와 기기 픽스처를 추가하고, 신규 쿼리 네 개와 대표 예약 선택 결과를 실제 DB 대상으로 검증하였습니다.
  • DeleteUserServiceTest에 만료 예약만 남은 사용자가 삭제되는 케이스를 추가하였습니다.
  • gradlew.bat test 전체 통과를 확인하였습니다.

범위에서 제외한 것

ReservationLifecycleProcessorForceStopMachineServiceImpl은 SmartThings가 보고한 실제 기기 상태를 함께 보므로 이슈에서 제외된 대로 두었습니다. 통세척 계열(RunWasherTubCleanServiceImpl, ReleaseFinishedWasherTubCleanServiceImpl, WasherTubCleanMachineGuard)도 이슈 목록에 없어 건드리지 않았습니다. 이들 역시 만료 예약을 활성으로 보며, 특히 점유 해제 경로는 기기가 CLEANING에 고정되는 문제가 있습니다. 후속 이슈 #131 로 분리하였습니다.

Closes #115

https://claude.ai/code/session_015e3wA7eCqrHBVCvcZ51yM2

기기 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
@d1ng1724 d1ng1724 added 버그 애플리케이션의 버그에 대응합니다. 리팩터링 코드를 개선합니다. labels Sep 10, 2026

@inryeok-bot inryeok-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

리뷰 결과

변경된 16개 파일을 검토했으며, 수정이 필요한 문제를 찾지 못했습니다.

심각도 개수
Critical 0
High 0
Medium 0
Low 0

완료

변경 사항을 검토했으며 게시할 인라인 코멘트가 없습니다.

검토한 head: 7d62dfba8023

@d1ng1724 d1ng1724 self-assigned this Sep 10, 2026
@d1ng1724
d1ng1724 requested a review from exijn September 10, 2026 03:19
@exijn

exijn commented Sep 10, 2026

Copy link
Copy Markdown
Member

/review

@d1ng1724
d1ng1724 merged commit 38f597e into develop Sep 10, 2026
1 check passed
@d1ng1724
d1ng1724 deleted the fix/unify-currently-active-reservation-checks branch September 10, 2026 07:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

리팩터링 코드를 개선합니다. 버그 애플리케이션의 버그에 대응합니다.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants