왜 Redisson을 사용했나?
Redisson은 Redis의 기능을 자바 친화적인 인터페이스(Map, List, Lock 등)로 제공하는 클라이언트 라이브러리입니다.
- Pub/Sub 방식: 락을 획득하기 위해 계속 Redis에 요청을 보내는(Spin Lock) 대신, 락이 해제될 때 알림(Subscribe)을 받아 획득을 시도하므로 Redis 서버의 부하를 최소화합니다.
- 안전성: 락의 자동 만료(TTL) 기능을 제공하여, 서버 장애 시 락이 영원히 해제되지 않는 데드락(Deadlock) 상황을 방지합니다.
- 편의성: RLock 인터페이스를 통해 복잡한 타임아웃 및 재시도 로직을 간단하게 구현할 수 있습니다.
아키텍처 및 동작 원리
시스템은 AOP(Aspect Oriented Programming)를 사용하여 비즈니스 로직과 락 처리 로직을 분리하였습니다. 개발자는 어노테이션 하나로 손쉽게 동시성 제어를 적용할 수 있습니다.
동작 순서 (Flow)
데이터 정합성을 위해 "락 획득 → 트랜잭션 시작 → 커밋 → 락 해제" 순서를 엄격하게 준수합니다.
- 요청 진입: @DistributedLock이 선언된 메서드 호출 시 AOP가 가로챕니다.
- Lock 획득 (Redisson):
- 정해진 키(Key)로 락 획득을 시도합니다.
- 이미 누군가 락을 점유 중이라면 waitTime만큼 대기합니다.
- 트랜잭션 실행 (Requires New):
- 락을 획득한 스레드는 별도의 트랜잭션을 시작하여 비즈니스 로직을 수행합니다.
- 로직이 끝나면 트랜잭션을 커밋(Commit)합니다.
- Lock 해제:
- 트랜잭션 커밋이 완료된 후, 락을 해제하여 다음 대기자가 진입할 수 있게 합니다.
사용 방법 (Usage Guide)
비즈니스 로직 메서드 위에 @DistributedLock 어노테이션을 붙여 사용합니다.
기본 문법
@DistributedLock(key = "락_키_이름", waitTime = 5, leaseTime = 3)
public void businessMethod(Long id) {
// 동시성 제어가 필요한 로직
}
파라미터 설명