반응형

현재 운영중인 서비스의 쿠폰 기능은 시스템/관리자 -> 특정 사용자들 에게 쿠폰을 발급해주는 기능이었다.
이번에 쿠폰 기능을 고도화하여, 상품 페이지에서 사용자들이 직접 쿠폰을 다운로드 받을 수 있도록 개선하였다. 관리자에서 쿠폰을 등록할 때 다운로드 가능한 수를 기재하고 상품에 매핑해두면 사용자들이 특정 상품 페이지에 접속했을 때 등록된 쿠폰이 노출된다.

이번 TF에서 기술적으로 제일 흥미로웠던 점은 재고 개념의 트랜잭션을 처리하는 것이었다. 그 전에는 이런 류의 로직을 다룰 일 없었는데 이번에 TF를 진행하면서 이 주제로 시니어 개발자분들과 대화를 나눴는데, 모든 의견이 인상적이었고 그 과정 자체가 즐거웠다.
그 대화 과정을 요약하면 아래와 같다.

예시 : 1개만 발급할 수 있는 쿠폰이 있을 때, 사용자 A와 사용자 B가 동시에! 0.000001초 이내에 쿠폰 다운로드 버튼을 누름
  1. Auto-commit
    가장 빠르고 간단한데, 쿠폰이 예상보다 몇 개 더 발급될 수 있음
  2. Transaction and Rollback
    쿠폰이 몇 개 더 발급된 경우, 발급된 쿠폰을 다시 취소할 수 있음. 하지만 완벽하제 제어할 수 없으며, row에 lock을 걸기 때문에 (어떻게 거냐에 따라 다르지만) 성능 저하가 발생할 수 있고, 영향도가 있을 수 있기 때문에 해당 테이블에 쿼리하는 다른 쿼리들도 살펴봐야함. (하지만 1번 방법 보다는 쿠폰 발급이 덜 함)
  3. Redis
    Redis에는 Java의 AtomicInteger처럼 동시성을 제어하기 위한 기능을 제공해줌
  4. Queue or Pub/Sub

(왼쪽) queue 출처 : 위키백과, (오른쪽) pub/sub 출처 : 구글 클라우드 플랫폼

나는 이런 처리를 위해 Redis, Queue, Pub/Sub을 사용해보지 않았기 때문에 '만약 이걸 도입한다면...'이라는 가정으로 이런저런 궁금한 점이 추가로 생겨났는데, 댓글로 물어볼 때 마다 동료 개발자분들께서 시원하게 대답도 해주셨고, 서로 토론도 하시는 걸 구경하니까 재미있었다.

회사 업무 중에 나누었던 대화를 상의없이 공유할 수는 없기 때문에 첫 업무일지는 여기서 정리!

반응형