큐머니 유효기간 프로젝트

적립금 원장을 Lot과 Usage 모델로 재설계해 유효기간 도입

잔액을 거래 이력 합계로만 계산하던 원장을 적립 건별 잔액(Lot), 결제별 차감 내역(Usage), 증감 이력(원장)으로 나눈 구조

문제와 배경

  • 마케팅 용도로 큐머니를 더 적극적으로 지급하고 싶었지만 기한이 없어 지급할수록 미래 비용으로 쌓였음. 그래서 기획에서 아래 요구사항으로 유효기간 도입을 정함.
    1. 적립 유형별 정책에 따라 유효기간 부여
    2. 유효기간이 지난 큐머니는 사용 불가 + 소멸(내역에 소멸로 표시)
    3. 환불 시 결제에 쓴 큐머니 중 유효한 부분만 재적립하고 이미 만료된 부분은 소멸
  • 기존 원장은 부호 있는 금액만 쌓는 거래 이력이고 잔액은 전체 합계라, 적립 건별 잔액이 없어 유효기간을 관리할 단위 자체가 없음.
  • 환불도 기존 원장으로는 할 수 없었음. 결제에 쓴 큐머니 중 유효한 부분만 돌려주려면 결제가 어느 적립 건에서 빠졌는지 알아야 하는데, 원장에는 금액만 남고 그 연결이 없음. 환불액을 그냥 새 적립으로 돌려주면 결제에 쓴 적립이 그사이 만료됐어도 다시 쓸 수 있게 됨.

해결 과정

적립 건별 잔액과 만료일 관리 방식 비교

후보장점단점과 제약판단
원장의 적립 행에 만료일만 추가테이블 추가와 이관이 없음적립 건별 남은 금액을 저장하지 않으므로 그 값을 알려면 지금까지의 사용을 만료가 가까운 적립부터 차례로 다시 빼 봐야 함. 잔액 조회, 결제, 소멸 대상을 구할 때마다 이 계산이 반복됨
사용자별, 만료일별 잔액 1행행 수가 가장 적음같은 날 만료되는 적립 건의 원금과 적립 유형이 한 행에 합쳐짐. 원장의 적립 행이 가리킬 적립 건이 없어져 관리자가 어느 적립에서 얼마가 남았는지 확인하기 어려움
원장 없이 Lot과 Usage에만 기록기록할 곳이 한 곳Lot은 남은 금액을 덮어쓰므로 소멸로 0이 되면 언제 얼마가 소멸됐는지 남지 않음. 덮어쓰지 않고 증감을 행으로 쌓으면 남은 금액을 읽을 때마다 다시 합산해야 함
Lot과 Usage에 현재 잔액 + 원장에 지난 증감잔액과 소멸 대상을 Lot 행 조회로 바로 구함쓰기마다 두 곳에 기록해 둘 사이에 불일치가 생길 수 있음채택
  • 요구사항 대부분이 적립 건별 남은 금액과 만료일을 읽으므로 그 값은 Lot(남은 금액)과 Usage(환불 가능액)에 현재 값으로 둠. 덮어쓰면서 사라지는 지난 증감은 원장이 맡음.

[Lot] 적립 건별 잔액과 만료일

  • 적립 건마다 Lot 1행에 원금, 남은 금액, 적립 유형별 정책으로 정한 만료일을 둠.
  • 결제는 잔액이 있고 만료되지 않은 Lot만 만료가 가까운 것부터 차감함. 그래서 만료된 Lot의 잔액을 0으로 만들고 소멸 내역을 남기는 소멸 배치가 돌기 전에도 만료분은 쓸 수 없음.

[Usage] 결제별 차감 내역

  • 결제 한 건이 여러 Lot을 쓰면 Lot마다 Usage 1행에 주문, 차감액, 누적 환불액, 결제 당시 만료일을 남기고, 환불 때는 이 행의 남은 환불 가능액과 결제 당시 만료일로 돌려줄 금액을 정함.
  • 원장의 결제 행을 Lot별로 쪼개지 않고 Usage를 따로 둔 건 내역 화면이 원장을 그대로 읽어 결제 1건을 1줄로 보여 주기 때문.

[원장] 증감 이력

  • 기존 원장은 이미 행을 추가만 하는 거래 이력이라 새 테이블을 만들지 않고 그대로 씀. 소멸(EXPIRED) 유형을 더해 소멸된 금액도 내역에 보이게 함.

결과

  • 적립 유형별로 유효기간을 붙여 지급할 수 있게 되고, 만료분은 소멸(EXPIRED) 행으로 내역에 남음.
  • 부분/다회 환불도 결제 당시 만료일로 판단해 만료된 금액이 환불로 되살아나지 않음.

회고

  • 소멸은 Usage에 남지 않아 어느 적립 건에서 얼마가 소멸됐는지 알 수 없고, 결제도 원장 행에 lotId가 없어 원장만 봐서는 어느 적립 건에서 빠졌는지 알 수 없음. 다시 한다면 Usage를 결제, 소멸, 계정 통합까지 모든 차감의 기록으로 넓히고 Lot과 Usage 행이 원장 행을 가리키게 해, "내 큐머니가 왜 없어졌나"에 적립 건 단위까지 답하게 함.
  • 원장과 Lot은 같은 트랜잭션으로 함께 기록하지만, 한 경로에서 원장 쓰기를 빠뜨리거나 금액을 잘못 쓰면 둘 사이에 불일치가 생김. 다시 한다면 매일 배치로 사용자별 원장 합계와 Lot 잔액 합계(소멸 처리 전 만료분 포함)를 대조하고, 불일치가 있으면 알림을 보내 원장 기록을 믿을 수 있게 함.