Skip to content

Commit 499e662

Browse files
committed
Update SpringBoot Technology Post " 쿠폰 시스템 개선기 "
1 parent e34a9dd commit 499e662

File tree

1 file changed

+19
-6
lines changed

1 file changed

+19
-6
lines changed

_posts/2025-06-03-SpringBoot-Coupon-System-Redisson.md

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -375,16 +375,29 @@ public class CustomSpringELParser {
375375

376376
이제 락이 필요한 서비스 메서드에 `@DistributedLock` 어노테이션을 추가하기만 하면 됩니다
377377

378-
> CouponIssueService.class
378+
> IssuedCouponSaver.java (coupon-consumer 모듈에 위치)
379379
380380
```java
381-
@Service
382-
public class CouponIssueService {
381+
@Component
382+
public class IssuedCouponSaver {
383+
384+
private final IssuedCouponRepository issuedCouponRepository;
383385
// ... 생략 ...
384386

385-
@DistributedLock(key = "'couponIssue:' + #command.couponId() + ':' + #command.userId()", waitTime = 5, leaseTime = 30)
386-
public CouponIssueResult issue(final CouponIssueCommand command) {
387-
// ... 순수한 쿠폰 발급 비즈니스 로직 ...
387+
/**
388+
* DB에 쿠폰을 저장하는 구간만 분산 락으로 보호하여 동시성을 제어합니다.
389+
* 순서: Lock -> Transaction -> Unlock
390+
*/
391+
@DistributedLock(key = "'coupon:' + #couponId", waitTime = 5, leaseTime = 10)
392+
@Transactional
393+
public void save(final UUID userId, final UUID couponId) {
394+
if (issuedCouponRepository.existsByUserIdAndCouponId(userId, couponId)) {
395+
log.warn("DB에 이미 발급된 쿠폰입니다. - userId: {}", userId);
396+
return;
397+
}
398+
IssuedCoupon issuedCoupon = new IssuedCoupon(userId, couponId);
399+
issuedCouponRepository.save(issuedCoupon);
400+
log.info("쿠폰 발급 DB 저장 완료: {}", issuedCoupon);
388401
}
389402
}
390403
```

0 commit comments

Comments
 (0)