database
개발을 하다 보면 여러 명의 사용자가 동시에 같은 데이터를 수정하거나 접근하는 경우를 자주 만날 수 있습니다. 특히나 요즘처럼 클라우드 기반의 분산 환경이 보편화되면서 동시성 제어(Concurrency Control)는 더욱 중요한 주제가 되었습니다.
여러 사람이 같은 자원을 동시에 사용할 때 발생하는 대표적인 문제로는 "중복 결제"나 "재고 초과 판매" 같은 심각한 이슈들이 있습니다. 이런 문제를 효율적으로 해결할 때 사용하는 기법 중 하나가 바로 분산 락(Distributed Lock)입니다.
오늘은 분산 락을 구현할 때 자주 사용되는 Redis의 Atomic Lock 기능, 특히 Redis의
분산 락(Distributed Lock)은 여러 대의 서버가 동일한 자원에 접근할 때 하나의 서버만 접근할 수 있도록 제한하는 기술입니다. 이를 통해 중요한 데이터를 동시에 수정하는 상황에서 발생할 수 있는 데이터 충돌이나 무결성 문제를 예방할 수 있습니다.
분산 락을 구현하는 방법은 여러 가지가 있지만, Redis를 사용하는 방법이 널리 활용됩니다. 그 이유는 Redis가 다음과 같은 장점을 갖고 있기 때문이죠.
특히 Redis는 하나의 명령어로 Atomic한 연산을 보장하기 때문에, 분산 환경에서도 경쟁 조건(Race Condition) 문제를 효과적으로 방지할 수 있습니다.
Redis에서 Atomic Lock을 구현할 때 사용하는 핵심 명령어가 바로
즉, 특정 자원에 대한 락을 얻으려 할 때 이 명령어를 사용하면, 누군가 먼저 락을 획득한 상태라면 두 번째 요청은 락을 얻지 못하게 됩니다. 이것이 바로 Atomic Lock의 핵심 원리입니다.
아래는 Redis로 간단히 Atomic Lock을 거는 예제입니다.
SET resource_lock "locked" NX EX 30
이 명령어가 성공하면 락을 획득한 것이고, 실패하면 이미 다른 서버에서 락을 보유하고 있다는 뜻입니다.
실제로 Redis Atomic Lock은 다양한 비즈니스 상황에서 효과적으로 사용됩니다.
쇼핑몰에서 인기 상품이 한정 수량으로 판매되는 경우, 동시 주문이 많으면 재고가 마이너스가 되거나 중복 구매 문제가 발생할 수 있습니다. 이때 Redis Atomic Lock을 사용하면 문제를 간단히 해결할 수 있습니다.
1. 락 획득 시도
SET item_stock_lock "user123" NX EX 5
2. 락 획득 성공 여부 확인 후 재고 차감 진행
락을 얻었다면 재고 차감 처리를 진행하고, 실패했다면 다른 사용자에게 락이 있는 상태이므로 잠시 후 재시도를 합니다.
결제 시스템에서도 Atomic Lock을 통해 중복 결제를 방지할 수 있습니다. 사용자가 동일한 결제 요청을 반복적으로 보낼 때 첫 요청만 처리하고, 나머지는 Redis 락으로 차단할 수 있습니다.
SET payment_lock:order123 "locked" NX EX 10
이렇게 락을 설정하면 같은 주문 번호로 오는 중복 요청을 손쉽게 차단할 수 있습니다.
Redis Atomic Lock을 실무에서 사용할 때 주의할 점도 있습니다.
오늘 소개한 방법을 잘 활용하면, 간단하면서도 강력한 동시성 제어 기능을 구현할 수 있습니다.