-
DB 락 전쟁의 서막: 쿠폰 시스템, 비관이냐 낙관이냐 그것이 문제로다Develop 2025. 8. 8. 08:44

상품 주문 시 쿠폰 사용, 어떤 락(Lock)이 현명한 선택일까?
온라인 쇼핑몰에서 상품을 주문할 때, 많은 사용자들이 할인 쿠폰을 사용합니다. 만약 인기 있는 쿠폰이라 동시에 여러 사용자가 사용하려고 한다면 어떻게 될까요? 혹은 한정된 수량의 쿠폰이라면? 이때 동시성 문제가 발생할 수 있으며, 이를 해결하기 위해 데이터베이스 락(Lock)을 사용해야 합니다.
이번 글에서는 상품 주문 시 쿠폰 사용과 같이 동시성 제어가 중요한 상황에서 어떤 락 전략을 사용하는 것이 적절한지, **비관적 락(Pessimistic Lock)**과 **낙관적 락(Optimistic Lock)**을 중심으로 비교하고 분석해 보겠습니다.
비관적 락 (Pessimistic Lock) 이란?
비관적 락은 이름에서 알 수 있듯이, 동시에 여러 트랜잭션이 같은 데이터를 수정할 것이라고 비관적으로 가정하고, 데이터에 접근하는 시점부터 락을 거는 방식입니다. 즉, 하나의 트랜잭션이 데이터 수정을 마칠 때까지 다른 트랜잭션은 해당 데이터에 접근하여 수정하는 것이 불가능합니다.
이는 전통적인 관계형 데이터베이스에서 많이 사용하는 방식으로, SELECT ... FOR UPDATE 구문을 통해 구현할 수 있습니다.
장점:
- 데이터 무결성을 확실하게 보장합니다. 락을 선점하므로 다른 트랜잭션이 동시에 수정할 가능성 자체가 차단됩니다.
- 구현이 비교적 간단하고 직관적입니다.
단점:
- 성능 저하의 원인이 될 수 있습니다. 락이 걸린 동안 다른 트랜잭션은 대기해야 하므로, 동시 사용자가 많을 경우 시스템 전체의 처리량이 감소할 수 있습니다.
- 데드락(Deadlock) 발생 가능성이 있습니다. 여러 트랜잭션이 서로의 락이 해제되기를 기다리는 교착 상태에 빠질 수 있습니다.
낙관적 락 (Optimistic Lock) 이란?
낙관적 락은 동시에 데이터 충돌이 거의 발생하지 않을 것이라고 낙관적으로 가정하는 방식입니다. 일단 트랜잭션이 데이터 수정을 허용한 뒤, 최종적으로 데이터를 반영(COMMIT)하는 시점에 다른 트랜잭션에 의해 데이터가 변경되었는지 확인합니다.
일반적으로 데이터베이스 테이블에 version과 같은 버전 관리 컬럼을 추가하여 구현합니다. 데이터를 읽을 때 버전 정보를 함께 가져오고, 업데이트할 때 읽었던 버전과 현재 데이터베이스의 버전이 일치하는지 확인하는 방식입니다.
장점:
- 별도의 락을 잡지 않으므로 높은 동시성 처리 성능을 기대할 수 있습니다. 읽기 작업이 대부분인 환경에서 특히 유리합니다.
- 데드락 발생 가능성이 거의 없습니다.
단점:
- 충돌 발생 시 처리 로직이 추가로 필요합니다. 버전이 일치하지 않을 경우, 업데이트를 실패 처리하고 재시도를 유도하거나 사용자에게 알리는 등의 후속 조치가 필요합니다.
- 롤백(Rollback)이 잦아질 수 있습니다. 충돌이 빈번하게 발생하는 환경이라면, 재시도 비용이 비관적 락의 대기 비용보다 커질 수 있습니다.
결론: 어떤 락을 선택해야 할까?
상황에 따라 다르다가 정답이지만, 일반적인 이커머스 쿠폰 사용 시나리오에서는 낙관적 락을 우선적으로 고려하는 것이 좋습니다.
대부분의 경우, 특정 쿠폰 하나에 극심한 동시 요청이 발생하는 경우는 드뭅니다. 예를 들어, 수만 명의 사용자가 동시에 단 하나의 '선착순 10명' 쿠폰을 사용하는 블랙 프라이데이 이벤트와 같은 특수한 상황이 아니라면, 데이터 충돌 가능성은 비교적 낮습니다.
따라서 평상시에는 낙관적 락을 사용하여 높은 동시성 처리 성능을 확보하고, 만약 충돌이 발생하더라도 사용자에게 "쿠폰이 모두 소진되었거나, 다른 주문에 사용되었습니다. 다시 시도해 주세요."와 같이 안내하는 것이 사용자 경험과 시스템 성능 모두에 유리한 접근 방식일 수 있습니다.
반면, 재고 차감과 같이 데이터 정합성이 매우 중요하고, 재시도 로직이 복잡하거나 비용이 큰 경우에는 비관적 락이 더 적합할 수 있습니다. 예를 들어, 결제와 직접적으로 연관된 재고는 한번의 실수도 용납되지 않으므로, 비관적 락을 통해 안전하게 처리하는 것이 현명합니다.
최종적으로는 서비스의 특성, 예상되는 트래픽, 데이터의 중요도 등을 종합적으로 고려하여 가장 적절한 락 전략을 선택해야 합니다.