선착순 랜덤 쿠폰 발급 시스템 구조

less than 1 minute read

MySQL 기반

  1. 관리자
  2. 쿠폰 생성 (TABLE c)
  3. 쿠폰 바구니에 쿠폰 넣기 (TABLE cb as cb1)
  4. A 쿠폰 98개 , B쿠폰 2개 = 총 100rows 삽입

  5. 사용자 
  6. 접근시 쿠폰 남은 갯수 체크 (TABLE cb)
  7. 남은것이 없다면 쿠폰 발급 불가 표시

  8. 쿠폰 발급
  9. 쿠폰 바구니에서 row 1개에 대해서 회원 번호를 넣는다. (TABLE cb) (update) (order by rand())(limit 1)
  10. 쿠폰이 남아있든 안 남아있든 실행한다.(밑의 발급 안된 쿠폰이 없으면 update되는게 없을 것이므로)
  11. update 쿼리에서 발급 안된 쿠폰만 사용하도록 한다.
  12. 목적 : 이미 발급된 쿠폰은 무시하게, 쿠폰 갯수 초과하지 않도록

  13. 필요하다면 중복 당첨 제어도 where에 넣어서 처리한다.
  14. not exists (select ‘x’ from cb cb2 wherec cb2.cb_idx = cb1.cb_idx and cb2.member_idx = {사용자번호} )
  15. 처럼 where에 추가.

  16. 쿠폰 바구니에서 사용자의 회원 번호로 select 한다.
  17. 없다면 쿠폰 발급이 안된 사용자
  18. 있다면 쿠폰 발급 완료된 사용자
  19. 쿠폰 후처리 


위처럼 만든 목적은

  1. 갯수 필드로만 할 경우 SELECT의 갭에 의한 과 발급 방지
  2. 랜덤 발급 가능
  3. 당첨자 명시화

등등 때문에… 아예 row를 뽑아내서 사용했음.


반성 갯수 필드 만으로도 가능할 것 같다. update처리할 때 조건으로 남은 갯수를 체크하면 될테니깐.(아마 락 잡겠지??) 다만 이럴 경우 당첨자 명시화가 힘들다. 즉, 다시 당첨자 row를 기록하는 테이블이 생겨야함. 즉, 미리 만들어 놓고 update 하는거나,  할 때 insert  하는거나.. 그리고 중복 당첨자 처리도… 


🔗original-link

Updated: