Skip to content

v202609010.0 - #130

Merged
d1ng1724 merged 3 commits into
masterfrom
develop
Sep 11, 2026
Merged

v202609010.0#130
d1ng1724 merged 3 commits into
masterfrom
develop

Conversation

@d1ng1724

Copy link
Copy Markdown
Contributor

개요

#129 의 내용을 상용환경에 배포합니다.

기기 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] 만료 예약을 활성으로 판정하는 지점 정리

@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개 파일을 검토했으며, 수정이 필요한 문제 1개를 발견했습니다.

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

주요 내용

  • MEDIUM · DATA_INTEGRITY — 만료 예약을 정리하지 않고 사용자를 삭제합니다

검토한 head: 38f597ea5403

final var activeStatuses = List.of(ReservationStatus.RESERVED, ReservationStatus.RUNNING);
final boolean hasActiveReservations = reservationRepository.existsByUserAndStatusIn(user, activeStatuses);
// 만료되지 않은 활성 예약이 있는지 확인. 만료 예약만 남은 사용자는 본인 탈퇴와 동일하게 삭제할 수 있어야 한다
final boolean hasActiveReservations = reservationRepository.existsCurrentlyActiveByUser(user);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟠 MEDIUM · DATA_INTEGRITY

만료 예약을 정리하지 않고 사용자를 삭제합니다

existsCurrentlyActiveByUser()는 스케줄러가 아직 정리하지 않은 만료 RESERVED 행이 있어도 false를 반환하므로 서비스가 곧바로 userRepository.delete(user)를 실행합니다. 그러나 해당 예약의 만료 처리와 연결된 기기의 availability 복구는 수행하지 않습니다.

예약 FK가 사용자 삭제를 제한하면 탈퇴가 무결성 제약 위반으로 실패하고, cascade로 예약이 삭제되면 스케줄러가 더 이상 그 예약을 발견할 수 없어 기기가 예약 당시의 비가용 상태로 남을 수 있습니다. 사용자를 삭제하기 전에 만료 예약을 정상적인 만료 경로로 처리하여 기기를 해제해야 합니다.

@d1ng1724

Copy link
Copy Markdown
Contributor Author

DeleteUserServiceImpl 관련 리뷰 지적은 확인하였습니다. 다만 이 PR은 developmaster로 반영하는 배포 PR이라 여기서 코드를 수정하기 어려워, 후속 이슈 #132 로 분리하였습니다.

지적하신 대로 만료 예약을 정리하지 않고 사용자를 삭제하는 공백이 맞습니다. 본인 탈퇴(WithdrawUserServiceImpl)는 cancel()machine.releaseIfHeld()로 기기를 해제하는데, 관리자 삭제에는 이 과정이 없습니다.

다만 우려하신 두 가지 결과는 현재 코드베이스에서는 발생하지 않아, 이슈에 함께 적어두었습니다.

  • FK 제약 위반: User.reservationscascade = ALL, orphanRemoval = true이므로 예약 행이 함께 삭제되어 무결성 위반은 발생하지 않습니다.
  • 기기 비가용 상태 잔존: [reservation] 만료 예약 활성 기준 통일 #110 에서 추가된 ReservationCreationSupport.canReuseStaleReservedSlot()availability = RESERVED이면서 활성 예약이 없는 기기의 재사용을 허용하고, QueryAllMachinesStatusServiceImpl.computeAvailability()도 활성 예약이 없으면 SmartThings 실제 상태로 계산하므로 화면과 예약 생성 양쪽에서 복구됩니다.

실제로 남는 문제는 DB의 machine.availabilityRESERVED로 굳는다는 점입니다. 이 값을 직접 읽는 통세척 경로(WasherTubCleanMachineGuard.occupyIfAvailable(), RunWasherTubCleanServiceImpl)가 해당 기기를 대상에서 제외하게 됩니다. 여기에 만료 처리에 딸린 후속 동작 누락과 본인 탈퇴와의 동작 비대칭이 더해집니다.

배포 자체를 막을 심각도는 아니라고 판단하여 이 PR은 그대로 진행하고, 수정은 #132 에서 다루겠습니다.

@d1ng1724
d1ng1724 merged commit 46b5c96 into master Sep 11, 2026
2 of 3 checks passed
@d1ng1724
d1ng1724 deleted the develop branch September 11, 2026 05:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants