본문 바로가기

Local Oriented/HTML CSS JS

jQueryRotate 를 사용한 룰렛

원본 : http://serpiko.tistory.com/382

참조 : http://beneposto.pl/jqueryrotate/


상기 원본에 담긴 내용은 룰렛을 돌려서 화면에 뿌려주는 것인데.. easing 옵션은 jqueryUI 와 충돌할 수 있으니까 주석처리.

룰렛을 돌린 다음에 DB 에 해당 경품을 등록해 준다고 하면,

룰렛이 돌고 결과는 나왔는데.. DB 에 넣지 못할 때 고객 항의가 들어오겠죠.


그러니까, DB 작업으로 먼저 난수를 발생하여 추첨을 하고..

추첨 결과를 가지고, 룰렛을 돌리는 것이 나은 방법 같네요.

그리고, 자신이 당첨된 내역을 보여주는 화면도 필요.


또, 룰렛의 조건이 있어요.

확보된 경품 갯수가 제한적이다 보니, 하루에 어떤 경품은 1개만 당첨되고.. 어떤 것은 10개, ...

이런식으로 경품마다 하루에 당첨되는 건수가 이미 정해져 있고..

개인별로 하루에 최대 몇 회 까지만 룰렛을 돌릴 수 있다는 조건도 있고..

A 가 경품에 당첨 되면 하루에 당첨되는 최대 회수가 차기 까지 계속 '꽝' 이 나와야 하고..

경품을 되도록이면 많은 사람에게 나눠 주도록 하려면,

특정인에게는 여러 경품들 중 하나라도 당첨되었을 때 더이상 당첨되지 않게도 하고..

특정 회원인 경우 하루에 참여할 수 있는 횟수도 달라지는 등등.. 에고 머리야.


룰렛 화면을 여러개 열어 놓고,

각 화면별로 start 를 눌러서 거의 무한 대로 경품을 타가려는 까만 마음도 원천봉쇄 하려면..

select 로 해당 조건을 점검하고, insert 하는 문장으로는 안 되고..

'insert ... select ...' 방식을 사용해야 하겠네요.


미리 하루에 당첨될 수 있는 경품을 DB 에 insert 해 두고,

난수를 발생하여 상기 경품 DB 에 update 를 하는 방법을 생각해 보았는데..

그런다고 DB 를 미리 세팅하기에는 아깝다는 생각.

그리고, 매번 이걸 세팅해야 하는 번거로움도 장난 아니죠.


그렇다면..

경품별 제한수를 별도의 DB Table 에 담고,

insert 시킬때 해당 조건을 체크해서 넣는 방식으로 구현하는 거죠.

where 조건절에 동시성 문제를 해결하는 코드도 넣고요.


그런데, insert 시키고 나니까 어떤 경품이 당첨되었다고 보여줘야 하는데..

난수를 발생하여 경품을 세팅하고 insert 시,

case when .. then .. else .. end 문으로 조건에 따라 경품이 바뀔 수가 있는데..

이걸 해결하려면..?


결국.. 이렇게 하게 되었네요.

1. 난수를 발생하여 경품 코드 생성

2. select ...nextval from dual 문으로 insert 될 DB table 의 sequence 값 추출

3. insert ... select .. 문으로 각종 조건에 따른 최종 경품 세팅. 조건이 복잡하면 decode 보다는 case when 문 사용

   이 때, 상기 1에서 생성한 경품 코드가 바뀔 수 있죠. 이래서 아래 4가 필요해요.

4. select where <상기 2에서 추출한 sequence> 를 통해 상기 3에서 최종 세팅된 경품 코드 추출

5. 상기 원문에 있는 룰렛 코드를 변형한 룰렛에 상기 4에서 체크한 경품 코드 적용

6. 상기 2 ~ 4 사이에 필요하다면 Transaction 세팅

   이를 때면, 특정 경품에는 어떤 포인트를 추가로 해 줄수도 있어서..


실제 코딩은 직접 해 보시기를.. 이정도 얘기하면 감이 오시져..?

상기 1 에서 java.util.Random.nextInt() 함수를 통해 수치를 추출. 꽝을 많게 하려면 어떻게 해야 할 지 생각해 보세요.



---------------------------------------------------------------------------

난수 범위를 조정하면 꽝의 비율을 높일 수는 있겠는데..

간혹, 당첨 확률이 너무 낮아져서 당첨된 사람이 몇 안 될 때도 있어서 어떻게 할까 고민하다가..

- 난수 발생시, 이미 해당 일자에 당첨이 완료된 경품은 제외하고 다시 난수 발생

- 상기와 같이 난수를 재발생 하다 보면 무한 루프가 돌거나 부하를 줄 수도 있겠다 싶어서,

  난수 발생 횟수 상한을 두어서 그 수치에 다다르면.. 그냥 꽝을 줄까 하다가..

- 난수 발생 횟수 상한 도달시, 일별 당첨 제한 수치가 커서 많이 줘도 되는 경품이 있다면..

  이들 목록 중 가장 수치가 큰 것을 하나 뽑거나 아무거나 뽑아서 할당

- 생각해 보니, 시간대 별로 어느 특정 시간 대에는 전부 꽝으로 한다거나 하는 로직을 넣을 수도 있겠네요..

- 1등 경품은 몇 시 이전은 꽝, 2등 경품, 3등 경품.. 뭐 이런식도 괜찮고..

- 일정 시간 이상 되면 아직 당첨되지 않은 경품을 떨이하는 로직도 필요



.Fine.


'Local Oriented > HTML CSS JS' 카테고리의 다른 글

자바스크립트 난독화  (0) 2015.10.15
반응형 UI 프레임웍 13가지  (0) 2015.10.12
form 배열  (0) 2015.09.17
cursor:hand 버리고 cursor:pointer 로 전환..  (0) 2014.11.06
자바스크립트로 이미지 다운로드  (0) 2014.11.05