개발기초

DB Optimistick Lock : 쇼핑몰 서비스 개발시 발생할 수 있는 이슈

Veams 2023. 6. 23.

 

쇼핑몰 서비스를 제공할 때 개발자에게 발생할 수 있는 이슈가 있다. 쇼핑몰에는 상품이 있으며, 상품에 대한 재고가 존재할 것이다. 예를 들어 재고가 한 켤레만 존재하는 한정판 나이키 신발에 대해, 거의 동시에 두 고객이 신발을 구매하기 위해 접근을 한다고 하자. 이에 대해 아무런 조치를 취하지 않는다면 두 고객은 구매 처리를 모두 완료할 것이며, 수량은 -1이 되어 실제로 존재하는 재고와 일치하지 않는 상황이 발생할 것이다. 이처럼 동시에 같은 DB Table row를 업데이트 하는 상황을 방어하기 위해 어떻게 개발할 수 있을까?

이런 동시성 문제에 대비하기 위하여 일반적으로 처리하는 방식은 잠금(Lock) 방식이다. Locking은 DB에 접근하는 것을 방지하는 것으로, 서비스 유저의 데이터 접근 경쟁을 관리할 수 있다. 예를 들어 쇼핑몰 거래 시스템, 계좌이체 시스템, 수강신청, 기차 승차권 예매 등에서 활용할 수 있다.

 

짧은 시간 내 사용자들이 동시에 동일한 DB 테이블행을 업데이트하는 경우, 여러 사용자가 동시에 업데이트를 수행하면 데이터가 충돌하는 등 예상치 못한 결과가 발생할 수 있다.

  • 첫 째로 데이터 일관성(Consistency)에 문제가 생길 수 있다. 데이터 베이스에 저장된 데이터는 일정한 규칙과 제약조건을 준수할 때 일관성을 유지할 수 있다.
  • 둘 째로 데이터 무결성(Integrity)이 깨질 수 있다. 데이터 정확성과 유효성에 문제가 생겨 데이터가 불완전해져서 값이나 형식에 문제가 생길 수 있다. 데이터에 대한 신뢰성이 하락할 수 있는 것이다.

낙관적 락(VS 비관적 락)

데이터의 일관성, 무결성을 지키기 위해서 Lock은 낙관적 락(Optimistic Locking)과 비관적 락(Pessimistic Lock) 방식을 고려할 수 있다. 낙관적 락은 데이터 갱신시 충돌이 발생하지 않을 것이라고 가정한다. 특정 데이터에 대한 경쟁을 낙관적으로 바라보는 것이다. 자원에 먼저 lock을 걸어 선점하지 말고, 커밋 시에 문제가 발생하면 그때 처리하자는 방식이다. 낙관적 락의 특징은 '버전version'이다. 데이터 버전을 확인하며 데이터 접근에 대한 충돌을 방지한다. 쇼핑몰 상품 주문의 예시로 살펴보자. 낙관적 락의 방식은 구매 과정에 접근하는 처음, 재고에 대한 데이터 버전을 확인한다. 그리고 구매를 마치는 시점에서 커밋(commit)을 하면서 버전을 다시 확인한다. 이때 이전에 확인했던 버전과 동일하면 재고 데이터를 최신으로 업데이트 한다.

 

예를 다시 들어 보자. 치타와 나무늘보 두 고객 쇼핑몰에서 동일한 나이키 신발을 주문한다고 했을 때 주문을 동시에 시도할 수 있다. 이 경우 주문 시스템에 두 고객은 함께 접근이 가능하다. 역시 두 고객이 주문을 시도할 때 시스템은 데이터에 대한 버전을 확인한다. 치타 고객이 보다 빨라서, 거래 절차를 보다 빨리 마칠 수 있게 된다. 거래 완료 직전 시스템은 데이터 버전이 일치한 것을 확인한 뒤 커밋하고, 재고를 업데이트 된다. 그런데 나무늘보 고객은 주문이 느려서 데이터가 업데이트 된 이후에, 거래 처리를 완료를 시도하게 되는데, 이 때 데이터 버전을 확인할 때 이전 버전과 데이터가 다르다는 것을 시스템이 알아차리고 거래 실패 메시지(예외 처리)를 띄운다. 이로써 나무늘보 고객에게 동작했던 주문에 대한 쿼리는 롤백 된다.

 

정리하자면, 낙관적 락은 데이터 갱신시 충돌이 발생하지 않을 것이라고 가정한다. 특정 데이터에 대한 경쟁을 낙관적으로 바라보는 것이다. 자원에 먼저 잠금lock을 걸어 선점하는 처리는 하지 않고, 커밋 시에 문제가 발생하면 그때 처리하자는 방식이다. 일반적으로 락 전략이 필요한 경우, 낙관적인 락을 많이 사용한다. 대개 데이터 접근에 대한 경쟁이 적은 환경에서 사용하며, 충돌이 적은 환경에서 낙관적 락은 성능상 이점을 가진다. 충돌에 대한 예외처리에서도 사용할 수 있는 전략에 대해 유연성을 제공한다. 비관적 락의 경우 데이터 접근 경쟁시 누군가가 선점을 할 수 있고, 이로인해 선점한 사람이 데이터 업데이트를 모두 마칠 때까지 대기자가 발생하는 상황이 발생할 수 있는데, 이러한 상황을 피할 수 있다.

댓글