[feat] Stock 도메인 Redisson 분산 락 기반 재고 감소 동시성 처리 적용#2
Merged
Conversation
9 tasks
Contributor
There was a problem hiding this comment.
Pull request overview
Stock 도메인의 decreaseStock 동시성 문제를 재현하는 테스트를 추가하고, Redisson 분산 락을 통해 상품별 재고 감소를 직렬화하여 분산 환경에서도 정합성을 보장하려는 PR입니다. 또한 락 해제 시점이 트랜잭션 커밋보다 앞설 수 있는 구조를 피하기 위해 실제 감소 로직을 별도 트랜잭션 컴포넌트로 분리했습니다.
Changes:
- 재고 감소 단일/동시 요청(100 threads) 테스트 및 테스트용 픽스처 추가
- RedissonClient 구성 및
StockLockManager포트/구현체 추가로 분산 락 기반 직렬화 적용 - 재고 감소 트랜잭션을
StockDecreaseProcessor로 분리하고 락-트랜잭션-락해제 흐름으로 변경
Reviewed changes
Copilot reviewed 14 out of 14 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| product/src/test/resources/application-test.yml | 테스트 프로파일에서 DB/Redis 및 config/eureka 비활성 설정 추가 |
| product/src/test/java/com/hubEleven/product/stock/application/service/StockServiceImplTest.java | 단일 재고 감소 성공 케이스 테스트 추가 |
| product/src/test/java/com/hubEleven/product/stock/application/service/StockConcurrencyTest.java | 100개 동시 재고 감소 정합성 검증 테스트 추가 |
| product/src/test/java/com/hubEleven/product/stock/application/fixtures/StockFixture.java | 테스트용 Stock 생성/요청 생성 헬퍼 추가 |
| product/src/test/java/com/hubEleven/product/stock/application/fixtures/ProductFixture.java | 테스트용 Product 생성 헬퍼 추가 |
| product/src/main/resources/application.yml | Redis host/port 설정 추가 및 config import 변경 |
| product/src/main/java/com/hubEleven/stock/infrastructure/lock/RedissonStockLockManager.java | Redisson 기반 분산 락 실행 유틸 구현 추가 |
| product/src/main/java/com/hubEleven/stock/infrastructure/configuration/RedissonConfig.java | RedissonClient 빈 구성 추가 |
| product/src/main/java/com/hubEleven/stock/domain/exception/StockErrorCode.java | 락 타임아웃 에러 코드 추가 |
| product/src/main/java/com/hubEleven/stock/application/service/StockServiceImpl.java | decreaseStock에 분산 락 + Processor 호출 적용 |
| product/src/main/java/com/hubEleven/stock/application/service/StockDecreaseProcessor.java | 재고 감소 트랜잭션 로직 분리 컴포넌트 추가 |
| product/src/main/java/com/hubEleven/stock/application/port/StockLockManager.java | 락 실행을 위한 포트 인터페이스 추가 |
| product/build.gradle | Redisson 의존성 추가 |
| config/src/main/resources/config-repo/product-service.yml | product-service 중앙 설정에 Redis host/port 추가 |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- Redisson 의존성 추가 - Redis host/port 설정 추가
- RedissonClient Bean 등록
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
📍 PR 타입 (하나 이상 선택)
❗️ 관련 이슈 링크
Close #1
📌 개요
decreaseStock)에서 동시 주문 요청 시 발생할 수 있는 재고 정합성 문제를 테스트로 재현하고, Redisson 기반 분산 락을 적용했습니다.🔁 변경 사항
재고 감소 동시 요청 테스트 추가
CountDownLatch를 사용해 다수의 스레드가 최대한 동시에 요청을 시작하도록 구성했습니다.Redisson 기반 분산 락 적용
RedissonClient설정을 추가하고 Redis host/port를 설정값으로 분리했습니다.StockLockManager인터페이스를 추가해 재고 서비스가 Redisson 구현체에 직접 의존하지 않도록 분리했습니다.RedissonStockLockManager를 통해 상품별 lock key 기반 분산 락을 적용했습니다.stock:decrease:{productId}재고 감소 트랜잭션 분리
@Transactional메서드 내부에서 락을 획득/해제하여, 락 해제가 DB commit보다 먼저 일어날 수 있는 문제가 있었습니다.StockDecreaseProcessor로 분리했습니다.락 획득 → 재고 감소 트랜잭션 실행/커밋 → 락 해제구조로 개선했습니다.락 획득 실패 처리 개선
STOCK_LOCK_TIMEOUT예외를 반환합니다.📸 스크린샷
테스트 통과