개발자

영화관 처럼 좌석 예약 기능은 어떻게 구현하나요?

2023년 01월 16일조회 906

개인 프로젝트 중에 영화관 좌석 예약처럼 한 사용자가 고른 값을 다른 사용자가 동시간에 사용하지 못하게 하려면 백엔드를 어떻게 구현해야하나요? 단순히 좌석을 선택했을때 백엔드로 요청을 보내서 좌석 상태 (예약됨, 예약안됨)를 바꿔주면 되나요? 동시에 예약하기 페이지를 진입하면 사용자 A와 B 모두 a 좌석 상태가 예약 안됨일때인데, 사용자 A가 a 좌석 상태를 예약됨으로 변경하면 사용자 B에게는 여전히 a 좌석이 예약안됨으로 보일 것 같아서요. 제가 원하는건 사용자 A,B가 동시에 접속해서 좌석 a가 빈 자리여도 둘 중 아무나 a 좌석을 예약하면 나머지 한명에게는 a 좌석이 예약됨을 보여주고 싶습니다. 참고로 사용하고 있는 DB는 postgresql입니다. 서버는 노드구요. 이런 기능은 어떻게 구현하는지 궁금해서 질문 남깁니다.

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 2

인기 답변

손정현님의 프로필 사진

안녕하세요! 우선 DB에서 transaction 기능을 지원한다는 가정하에 답변드리겠습니다. | A, B가 동시에 접속해서 좌석 a가 빈자리 일 때, 둘 중 하나가 a 좌석을 예약하면 나머지 한명에게는 a 좌석이 예약됨을 보여주고 싶습니다 우선 질문을 이런식으로 조금 쪼개볼 수 있을 것 같아요. - A와 B가 동시에 접속해서 좌석 a가 빈자리 일때: 서버로 조회 요청을 함. 충분히 A와 B가 공석 a를 조회해올 수 있음 - 둘 중 하나가 a 좌석을 예약. B가 예약했다고 가정: 서버로 create 또는 update 요청을 조회함. - a 좌석의 예약 상태를 create/update 요청을 보낸 사용자 B에게 업데이트 해주고 동시에 사용자 A에게 보여주고 싶음: 이건 A에게 언제 정보를 노출하고 싶은가에 따라서 다름. 실시간 성이라면 사용자 A는 요청을 따로 하지 않더라도 서버 상태를 받아와야함. 실시간 성이 아니라면 사용자 A가 좌석을 예약하려고 할때 알려줄 수 있음. 우선 "a 좌석 예약"이라는 요청을 서버에서 처리할때 transaction을 거는 것이 하나의 방법이 될 수 있을 것 같아요. transaction 내에서 a 좌석의 상태를 요청하고, 좌석 상태에 따라서 "a좌석 예약"을 수행할지 말지 정할 수 있을 것 같네요. 만약 B가 먼저 a 좌석을 예약했다면, A의 "a 좌석 예약" 요청이 들어왔을때 해당 요청은 transaction 내의 a 좌석의 상태 조건에 걸리게 되어 예약이 실패 처리될 것 같아요. * 참고: transaction에는 여러 종류가 있으며, transaction이 모든 종류의 race condition (질문자님 하신 동시에 동일한 리소스에 대한 변경 요청이 들어오는 경우)을 방지하지는 않는다고 해요. a 좌석의 상태를 다시 보여주는건 실시간인지 아닌지에 따라서 다를 것 같아요. 만약 B가 좌석을 예약했을때 A가 별다른 액션을 취하지 않아도 a 좌석의 상태가 바뀌어야한다면 서버의 상태를 A에게 전해줄 수 있는 방법을 사용하셔야해요. ex) web socket, server-sent events 실시간성이 중요하지 않다면, 사용자 A가 a 좌석에 대한 요청을 추가적으로 할때 자연스럽게 업데이트된 상태를 받아볼 수 있을 것 같습니다. 보통 서버 상태를 실시간성으로 보여주지는 않고, UI/UX 상 좌석을 예약하고 최종 결제 또는 예약 완료하는 흐름까지 여러 단계가 있을 것 같아요. 그래서 중간에 예약한 좌석에 대한 상태를 요청해서 확인하고 선택된 좌석이 이미 예약되었음을 알려줄 수 있을 것 같습니다. 참고했던 링크들 첨부할게요. - https://untitledtblog.tistory.com/131 - https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events - https://blog.logrocket.com/using-fetch-event-source-server-sent-events-react/

김희망님의 프로필 사진

예약을 받는 좌석 테이블에도 예약 현황 필드를 넣어주면 될 것 같습니다 enum이나 boolean으로 말이죠 그리고 예약좌석이라는 테이블에 멤버와 좌석의 값을 매핑시킨뒤에 만약 좌석이 예약좌석에 올라가있다면 좌석의 상태 필드를 신청 불가로 띄워주면 될것같습니다.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!