
풀필먼트 입고 서비스팀에서 분산락을 사용하는 방법 - Spring Redisson
두줄요약
Spring AOP와 Redisson으로 어노테이션 기반 분산락 컴포넌트를 구성했습니다. 트랜잭션 커밋 후 락을 해제해 재고 차감과 중복 등록의 정합성을 검증했습니다.
문제 상황
- Kafka 중복 발주 수신, 중복 요청, 동시 작업으로 인한 재고 트랜잭션 정합성 문제
- 멀티 인스턴스 환경에서 애플리케이션 예외 처리만으로 부족한 동시성 제어
선택 이유
- 기존 Redis 사용 환경 활용으로 추가 인프라 구축 불필요
- Lettuce 직접 구현 대비 Lock 인터페이스, timeout 설정, Pub/Sub 기반 락 획득 지원
- MySQL 락 운용 시 별도 커넥션 풀과 RDS 부하 고려
구조와 흐름
@DistributedLock어노테이션으로 key, waitTime, leaseTime 설정 분리- AOP에서 SpEL 기반 동적 락 키 생성,
RLock.tryLock수행, 종료 시 unlock 처리 - 별도
REQUIRES_NEW트랜잭션으로 비즈니스 로직 실행 후 커밋 뒤 락 해제
주의할 점
- 트랜잭션 커밋 전에 락을 해제하면 후속 요청이 이전 데이터를 읽어 재고 차감 누락 가능성
- 쿠폰 차감과 중복 발주 등록 동시성 테스트로 락 적용 시 정합성 검증


