Skip to content

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

Description

@d1ng1724

버그 설명


#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 완료 이후에 착수하는 것을 권장합니다.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

버그애플리케이션의 버그에 대응합니다.

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions