목차
이 프로젝트의 호텔 예약 시스템은 좀 특별한 기능이 있다. 바로 “친구들과 함께 결제” 기능이다.
이 기능을 사용하면 사용자는 지금 당장 결제를 하지 않아도 30분 이내에 친구들과 함께 결제를 완료하면 예약이 확정된다. 이것을 처음에 구현했을 때는 재고 차감 시점으로 인한 UX 문제가 발생할 수 있다는 것을 고려하지 못했으나 팀원들의 피드팩을 받은 후 수정했다.
사용자가 예약을 완료했지만 결제를 안한 상태에서는 REDIS를 사용해서 예약할 방에 대한 정보를 (체크인, 체크아웃, 개수, 방id) DTO를 사용해 저장한다
그리고 30분 후에도 결제가 완료되지 않으면 자동으로 소멸한다
친구들 모두 결제를 완료했다면 redis에 저장되어 있는 dto를 reserved room entity와 reservation entity로 변환해 db에 저장한다.
임시 예약 DTO 만들고 REDIS에 저장하는 코드
결제 완료 후 예약 확정하는 코드
팀원들이 이렇게 되면 재고가 1개 일때 동시에 다른 사용자들이 같은 방과 같은 날짜를 선택하고, 한명이 먼저 결제를 하면 다른 한명은 무조건 실패하는 게 아니냐는 피드백을 들었다.
방 A 재고 1개 유저 A와 유저 B가 동시에 선택 둘 다 REDIS에 임시 예약 생성 A가 먼저 결제 → 재고 0 B는 결제 직전에 “재고 없음”으로 실패 → Bad UX
그래서 현재 흐름을 정리하고 문제점을 깨달았다
현재 흐름
사용자가 방 선택 → REDIS에 임시 예약 (TempReservationDto) 저장)
DB에는 아무 영향 없음 (재고 차감 X)
결제 성공 시에만 DB에 Reservation 엔티티와 ReservedRoom 엔티티를 생성, 저장, 재고 차감
REDIS에 있었던 임시 예약 데이터 삭제