포인트에 유효기간 추가 개념정리
요즘 쇼핑몰을 보게 되면 포인트나 마일리지에 유효기간이 있다. 게시판 솔루션에 사용되는 포인트에 유효기간을 추가하는 작업을 3일째 진행 중인데 처음에 생각했던 것보다 훨씬 복잡해지고 있다. 처음엔 단순히 유효기간이 지났느냐? 그렇지 않느냐? 만 체크하면 될 것이라 생각했는데.. 하다보니까 포인트를 사용할 경우가 문제가 된다. 받은 포인트에서 쓴 포인트를 뺀 값이 포인트의 합인데 유효기간이 들어가면 만료됐다고 체크된 것은 포인트 계산에서 빼려고 했는데 이렇게 할 경우 유효기간때문에 포인트가 정확하게 계산이 안될 수가 있다.
예를 들어 파일을 다운로드 했을 때 포인트를 차감한다고 하고 게시판에 글을 써서 받은 여러 개의 포인트는 각각 다른 유효기간을 가진다고 생각해보자. 만약 다운로드 포인트의 유효기간이 이미 지났고 글을 써서 받은 포인트의 유효기간들은 아직 지나지 않았다면 다운로드 포인트는 계산에서 빠질 것이다. 반대로 아직 지나지 않았다면 계산에 포함될 것이다. 이런 경우 포인트의 합은 달라진다. 사용한 포인트에 유효기간을 설정한다는 것이 현실적으로 불가능해보이는 것이다. 그래서 아래의 방법을 구상했다.
사용한 포인트 내역은 그대로 기록을 한다. 여기에 추가로 사용한 내역을 입력할 때 기존에 받은 포인트 내역 각각에 사용한 포인트를 기록하는 것이다. 게시글을 작성해 20, 10, 30 포인트를 받았다면 파일을 다운로드 할 때 50포인트를 차감하면서 각각 사용한 포인트를 20, 10, 20 이라고 기록하는 것이다. 각 내역에는 받은 포인트 보다 많은 값을 사용할 수 없기 때문에 기록되는 값이 위와 같은 것이다. 이런 식으로 php 코드를 작성하는 것은 어려운 일은 아니다. 받은 포인트 내역 중에서 만료되지 않은 것만 골라서 값을 넣어주는 것은 간단하게 작성할 수 있다. 이것을 위해 추가한 필드는 아래와 같다.
use_point
expired
expire_date
여기까지는 간단하지만.. 포인트 내역을 삭제할 경우가 있다. 삭제하면서 포인트를 다시 계산해야 하는데 사용한 내역을 삭제하는 것이라면 그만큼 포인트를 더해줘야 한다. 그런데 위에서 포인트의 계산을 받은 포인트 내역 각각에서 받은 값과 사용한 값을 빼는 것으로 하는데 단순히 사용한 내역을 삭제만 한다고 해서 포인트가 추가 되는 것은 아니다. 즉 각 내역에서 다시 삭제한 내역 만큼 사용한 값에서 빼줘야만 한다. 즉 위와 같은 경우라면 사용한 포인트에 0, 0, 0 이라고 변경해줘야 하는 것이다. 이게 말은 쉬운데 DB에 기록되는 것이기 때문에 DB 서버에서 에러가 발생한 경우가 충분히 있다.
그래서 사용한 내역을 삭제할 때는 그만큼 새로운 포인트를 지급하는 방법도 고려를 했다. 그런데 이 방법이 가장 쉽지만 내역이 지저분해지는 것 같아 사용한 내역에서 값을 빼주는 것으로 코드를 작성했다. 테스트 환경에서는 문제가 없어 보이지만 아직 충분한 테스트를 한 것이 아니기 때문에 문제가 발생한 소지는 충분히 있다고 보여진다. 운영하면서 포인트 유효기간을 없애거나 추가하거나 하면 포인트 계산에서 문제가 생길 수 있다고 생각이 되어진다.