어떤 기능인가요?
추가하려는 기능에 대해 간결하게 설명해주세요
대여 신청(POST /v1/app/billilge/histories)의 재고 차감에 낙관적 락을 적용한다.
508b16b에서 비관적 락을 뺀 뒤로는 재고 차감에 동시성 보호가 없어서, 같은 물품에 신청이 동시에 들어오면 재고가 음수가 되거나 차감 하나가 사라질 수 있다. 버전 컬럼 없는 낙관적 락(Hibernate OptimisticLockType.DIRTY)으로 충돌을 감지하고, core:common의 LockExecutor가 시도마다 새 트랜잭션을 열어 재시도한다.
feat/#74-billilge-rental-apply-return(PR #75) 위에서 이어간다.
📝 작업 상세 내용
📁 참고 자료 (선택)
- 계획서:
docs/plans/rental-stock-optimistic-lock.md (로컬, gitignore 대상)
어떤 기능인가요?
대여 신청(
POST /v1/app/billilge/histories)의 재고 차감에 낙관적 락을 적용한다.508b16b에서 비관적 락을 뺀 뒤로는 재고 차감에 동시성 보호가 없어서, 같은 물품에 신청이 동시에 들어오면 재고가 음수가 되거나 차감 하나가 사라질 수 있다. 버전 컬럼 없는 낙관적 락(HibernateOptimisticLockType.DIRTY)으로 충돌을 감지하고,core:common의LockExecutor가 시도마다 새 트랜잭션을 열어 재시도한다.feat/#74-billilge-rental-apply-return(PR #75) 위에서 이어간다.📝 작업 상세 내용
core:common에spring-context·spring-tx의존 허용,LockExecutor추가 (시도마다 새 트랜잭션, 낙관적 락 충돌만 최대 3회 재시도)CommonErrorCode.OPTIMISTIC_LOCK_CONFLICT(409) 추가ItemJpaEntity에@DynamicUpdate+@OptimisticLocking(type = DIRTY)적용RentalApplyUseCase의@Transactional을 떼고LockExecutor로 감싸기LockExecutor단위 테스트, 물품 낙관적 락 MySQL 통합 테스트(Testcontainers), 대여 신청 동시성 테스트architecture.md,coding-style.md,00-index.md)📁 참고 자료 (선택)
docs/plans/rental-stock-optimistic-lock.md(로컬, gitignore 대상)