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

경매 입찰 기능 구현 #163

Merged
merged 9 commits into from
Jun 6, 2024
Merged

Conversation

JadeKim042386
Copy link
Member

@JadeKim042386 JadeKim042386 commented Jun 6, 2024

🔍️ 이 PR을 통해 해결하려는 문제

  • 사용자가 특정 경매에 대해 입찰 요청할 수 있는 기능을 구현합니다. 요청 시 다음과 같은 조건을 고려해야합니다.

    • 요청한 입찰가는 이전 입찰가보다 높아야합니다.
    • 경매를 올린 사용자는 입찰이 불가능합니다.
    • 경매가 시작하기 전 또는 후에는 입찰이 불가능합니다.
  • 경매 입찰이 정상적으로 반영되었을 경우 입찰 기록을 DB에 저장해야합니다.

✨ 이 PR에서 핵심적으로 변경된 사항

  • BiddingHistory 엔티티 및 레포지토리 추가

  • Auction 엔티티에 @Version을 적용한 version 속성을 추가하여 낙관적 락 적용

  • 경매 입찰 기능 구현

    • 입찰 요청 시 방어 로직 추가

      • 요청한 입찰가는 이전 입찰가보다 높아야합니다.
      • 경매를 올린 사용자는 입찰이 불가능합니다.
      • 경매가 시작하기 전 또는 후에는 입찰이 불가능합니다.
    • 여러 사용자가 동시에 입찰을 시도할 경우 낙관적 락 OPTIMISTIC 옵션 적용

      • READ level에서 lock을 적용하여 잘못된 값을 조회하지 않도록 적용했습니다.
      • 낙관적 락 적용으로 인해 Exception(ObjectOptimisticLockingFailureException, CannotAcquireLockException)이 발생할 경우 Retry를 적용했습니다.
        • BackOff를 적용하여 1초 delay를 시작으로 최대 5초까지 delay를 적용했습니다.
        • 최대 3번 retry를 적용했습니다.
        • Spring RetrySpring AMQP에서 내부적으로 내부적으로 지원하기 때문에 따로 dependency를 추가하지 않았습니다.
    • 입찰 금액 업데이트 후 입찰 기록 저장

      • DB에서 출돌나지 않고 입찰 금액이 정상적으로 업데이트되었을 경우 입찰 기록(BiddingHistory)를 저장합니다.
      image
  • 테스트 코드 작성

    • 통합 테스트를 통해 입찰 요청에서 발생할 수 있는 동시성 문제 해결을 확인할 수 있습니다.

🔖 핵심 변경 사항 외에 추가적으로 변경된 부분

  • Auction의 최종 낙찰 금액에 해당하는 minBid -> finalBid로 직관적으로 수정했습니다.

  • BindException을 처리하기위한 ExceptionHandler를 추가했습니다.

  • 테스트에서도 lombok을 사용하기위해 dependency를 추가했습니다.

📌 PR 진행 시 이러한 점들을 참고해 주세요

  • Reviewer 분들은 코드 리뷰 시 좋은 코드의 방향을 제시하되, 코드 수정을 강제하지 말아 주세요.
  • Reviewer 분들은 좋은 코드를 발견한 경우, 칭찬과 격려를 아끼지 말아 주세요.
  • Review는 특수한 케이스가 아니면 Reviewer로 지정된 시점 기준으로 1일 이내에 진행해 주세요.

Issue Tags

- 최종 낙찰 금액에 해당하는 minBid -> finalBid로 직관적으로 수정
- 입찰 요청 시 방어 로직 추가
  - 요청한 입찰가는 이전 입찰가보다 높아야함
  - 경매를 올린 사용자는 입찰이 불가능
  - 경매가 시작하기 전 또는 후에는 입찰이 불가능
- 여러 사용자가 동시에 입찰을 시도할 경우 낙관적 락 OPTIMISTIC 옵션을 적용
  - READ level에서 lock을 적용하여 잘못된 값을 조회하지 않도록 적용
- 낙관적 락 적용으로 인해 Exception이 발생할 경우 Retry 적용
  - BackOff를 적용하여 1초 delay를 시작으로 max 5초까지 delay를 적용
  - 최대 3번 retry 적용
@JadeKim042386 JadeKim042386 added the enhancement New feature or request label Jun 6, 2024
@JadeKim042386 JadeKim042386 self-assigned this Jun 6, 2024
build.gradle Show resolved Hide resolved
- AuctionRequest의 finalBid -> minimumBid 수정
- AuctionApi의 requestBidding -> placeBidding 수정
- 입찰 시간에 대한 방어 로직 조건이 잘못되어 수정
- 방어 로직을 따로 메소드 분리
@JadeKim042386 JadeKim042386 merged commit ded106d into develop Jun 6, 2024
@JadeKim042386 JadeKim042386 deleted the feature/#162-auction-bidding branch June 6, 2024 05:51
@JadeKim042386 JadeKim042386 changed the title Feature/#162 auction bidding 경매 입찰 기능 구현 Jun 6, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

경매 입찰 기능
1 participant