Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
🔗 관련 이슈
Resolves #24
👩🏻💻 구현 내용
isBooked
필드 제거 (결제 하지 않은 예약도 DB에 남겨놓기로 하면서 isBooked 컬럼을 관리하기 더 어려워졌기 때문)원래 BookingSlot은 같은 가게/날짜/시간에 테이블 식별자만 다른 레코드가 여러개 있을 수 있었습니다. 그런데 가게 입장에서 굳이 테이블별로 레코드를 만드는 것보다 날짜/시간에 몇자리(capacity)를 받을지만 정해도 될 것 같아서.. 그렇게 바꿨습니다!
💬 PR 포인트 & 궁금한 점
중복 예약 방지를 위해 고려했던 해결책
1️⃣ MySQL 비관적락(레코드에 직접 락) / 낙관적락(버전 컬럼 추가)
레코드를 수정하면서 발생하는 동시성 문제가 아닌 새로운 레코드를 생성하면서 발생하는 동시성 문제라 적합한 해결책이 아님
2️⃣ MySQL 네임드락
추가적인 리소스가 필요하지 않다는 장점이 있지만, 레디스를 사용한 방식보다 성능이 낮고, 레디스보다 확장성이 좋지 않은 RDB에 부하를 주게 됨
3️⃣ 레디스 분산락
MySQL 네임드락 방식보다 성능이 좋고, 레디스가 MySQL 보다 확장성이 높다는 점에서 선택했습니다!
레디스를 사용하는 방식에도 (1) Lettuce를 이용한 스핀락 방식, (2) Redisson를 이용한 Pub/Sub 방식이 있었습니다! 락을 잡는 부분이 조금 복잡한 것 같기도 해서.. (2)번 Redisson 방식을 고려했다가 (2)번 Redisson 방식을 사용하기 위해서는 추가적인 라이브러리가 필요하고 이 라이브러리가 SpringBoot에서 버전 관리를 해주는 라이브러리가 아니라서.. (1)번 스핀락 방식을 선택했습니다!