1.
A 유저와 B 유저가 같은 숙소를 같은 날짜에 또는 겹치는 날짜에 예약하려 한다. 당연히 겹치면 안 되기에 이를 막아야 한다.
웹에서 소켓 통신으로 실시간 감지하거나 kafka 와 같은 pub/sub 시스템을 도입하는 방안을 고려했으나 주어진 시간에 이를 학습하고 적용하기에는 리소스가 부족하다. DB 컨트롤 말고 답이 없다.
사용자가 예약을 하면 해당 날짜를 DB에 모두 집어 넣는다. 예를들어 2023년 1월 1일 부터 2023년 1월 5일 까지 예약을 했다면 아래과 같이 모든 날짜를 풀어서 넣는다.
[
20230101, 20230102, 20230103, 20230104, 20230105
]
그리고 다른 사용자가 예약을 할 때 마찬가지로 예약한 날짜를 풀어서 DB를 조회해 본다.
where reserveDay in (20230105, 20230106, 20230107)
값이 있으면 예약 에러, 없으면 저장한다.
2.
A 유저가 1박 2일을 예약했다. 1박 2일이면 캘린더에 어떻게 표시하고 어떻게 다른 유저의 예약을 막아야 하는가?
예를들어 A 유저가 1, 2, 3, 4, 5 일 중 3일 부터 1박 2일을 예약했다. 그러면 3일 오후부터 4일 오전까지이다. 4일 오후부터는 다른 유저가 체크인을 할 수 있어야 한다. 캘린더에서 3일은 예약을 할 수 없고 4일은 예약을 할 수 있어야 한다.
1박 2일이라고 3, 4일을 모두 disable 처리하면 안 된다. 4일은 다른 유저가 예약할 수 있어야 하고 캘린더에서 클릭도 되어야 한다.
4.
위와 같은 상황으로 A 유저가 3, 4일을 예약했다. B 유저가 1박 2일로 2, 3일을 예약하려고 하면 3일은 어떻게 표시되어야 하는가?
A 유저는 3일 오후에 체크인을 하기 때문에 그 날에 체크아웃은 할 수 있어야 한다. 그러니까 다른 유저가 2일에 체크인을 하고 3일에 체크아웃을 하려면 캘린더에서 3일을 무조건 disable 처리하면 안 된다.
5.
위와 같은 상황으로 A 유저가 3, 4일을 예약했다. B 유저가 2, 3일, C 유저가 4, 5일을 예약하려고 하면 어떻게 해야 하는가?
B 유저: 2일 오후 체크인, 3일 오전 체크아웃
A 유저: 3일 오후 체크인, 4일 오전 체크아웃
C 유저: 4일 오후 체크인, 5일 오후 체크아웃
뭔가 애매해 보이는 상황이지만 겹치는 시간대가 없으므로 문제가 없고 캘린더에서도 예약이 다 가능해야 한다.
6.
위와 같은 상황을 대응하려고 하루 마다 데이터를 두 개로 나눴다. 20230101 일 경우 오전, 오후 데이터를 나눠서 관리한다. 예를들어 20230101 데이터에 am, pm 과 같은 구분자를 붙여서 체크인, 체크아웃이 표현 가능하도록 한다.
7.
4번과 같은 상황으로 A 유저가 3, 4일을 예약했고 B 유저가 2, 3일을 예약하려고 캘린더에서 2일을 클릭하면 3일에는 체크 아웃만 되도록 표시를 해 주어야 한다. 캘린더에서 db의 값으로 캘린더에 disable 같은 처리를 하지만 사용자의 클릭 값에 따라 액션과 뷰를 계속 변경해 줘야 한다.