Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feat] 분산락을 이용한 중복 예약 방지 #25

Open
wants to merge 8 commits into
base: main
Choose a base branch
from

Conversation

uijin31
Copy link
Collaborator

@uijin31 uijin31 commented Jan 11, 2025

🔗 관련 이슈

Resolves #24

👩🏻‍💻 구현 내용

  • BookingSlot에 isBooked 필드 제거 (결제 하지 않은 예약도 DB에 남겨놓기로 하면서 isBooked 컬럼을 관리하기 더 어려워졌기 때문)
  • BookingSlot에 capacity 필드(수용할 테이블 갯수) 추가
    원래 BookingSlot은 같은 가게/날짜/시간에 테이블 식별자만 다른 레코드가 여러개 있을 수 있었습니다. 그런데 가게 입장에서 굳이 테이블별로 레코드를 만드는 것보다 날짜/시간에 몇자리(capacity)를 받을지만 정해도 될 것 같아서.. 그렇게 바꿨습니다!
  • 분산락을 위한 레디스 의존성 추가
  • 분산락을 통한 중복 예약 방지 로직 추가
  • 관련 테스트 코드 수정 및 추가

💬 PR 포인트 & 궁금한 점

중복 예약 방지를 위해 고려했던 해결책

1️⃣ MySQL 비관적락(레코드에 직접 락) / 낙관적락(버전 컬럼 추가)

레코드를 수정하면서 발생하는 동시성 문제가 아닌 새로운 레코드를 생성하면서 발생하는 동시성 문제라 적합한 해결책이 아님

2️⃣ MySQL 네임드락

추가적인 리소스가 필요하지 않다는 장점이 있지만, 레디스를 사용한 방식보다 성능이 낮고, 레디스보다 확장성이 좋지 않은 RDB에 부하를 주게 됨

3️⃣ 레디스 분산락

MySQL 네임드락 방식보다 성능이 좋고, 레디스가 MySQL 보다 확장성이 높다는 점에서 선택했습니다!

레디스를 사용하는 방식에도 (1) Lettuce를 이용한 스핀락 방식, (2) Redisson를 이용한 Pub/Sub 방식이 있었습니다! 락을 잡는 부분이 조금 복잡한 것 같기도 해서.. (2)번 Redisson 방식을 고려했다가 (2)번 Redisson 방식을 사용하기 위해서는 추가적인 라이브러리가 필요하고 이 라이브러리가 SpringBoot에서 버전 관리를 해주는 라이브러리가 아니라서.. (1)번 스핀락 방식을 선택했습니다!

@uijin31 uijin31 added 🚨 bugfix Something isn't working ✨ feature New feature or request labels Jan 11, 2025
@uijin31 uijin31 requested a review from f-lab-lyan January 11, 2025 17:07
@uijin31 uijin31 self-assigned this Jan 11, 2025
@uijin31 uijin31 changed the title 분산락을 이용한 중복 예약 방지 로직 추가 [Feat] 분산락을 이용한 중복 예약 방지 로직 추가 Jan 11, 2025
@uijin31 uijin31 changed the title [Feat] 분산락을 이용한 중복 예약 방지 로직 추가 [Feat] 분산락을 이용한 중복 예약 방지 Jan 11, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🚨 bugfix Something isn't working ✨ feature New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

🎟️ 중복 예약 처리
1 participant