https://github.com/f-lab-edu/point-live-young
GitHub - f-lab-edu/point-live-young: 대규모 사용자와 대용량 트래픽을 안정적으로 처리하는 포인트 기반
대규모 사용자와 대용량 트래픽을 안정적으로 처리하는 포인트 기반 이커머스. Contribute to f-lab-edu/point-live-young development by creating an account on GitHub.
github.com
1편에서는 포인트를 단순한 숫자가 아니라
정책과 생명주기를 가진 자산 도메인으로 바라보게 된 배경을 정리했다.
이번 글에서는 그 도메인 위에서
“포인트를 어떤 순서로 차감할 것인가?”
라는 문제를 어떻게 고민했고,
왜 만료 우선 차감(Early Expiry First) 전략을 선택했는지를 정리해보려고 한다.
문제는 ‘차감’에서 시작된다
포인트를 여러 개의 묶음(Lot)으로 관리하기 시작하면서
다음 질문이 생겼다.
여러 포인트가 섞여 있을 때,
어떤 포인트부터 사용해야 하는가?
예를 들어 사용자가 아래와 같은 포인트를 가지고 있다고 가정해보자
- 회원가입 포인트: 10,000P (만료 없음)
- 이벤트 포인트: 5,000P (3일 후 만료)
- 출석 포인트: 1,000P (30일 후 만료)
이 상태에서 4,000P 결제를 시도한다면
어떤 포인트부터 차감하는 것이 합리적일까?
단순 합산 차감의 문제점
가장 단순한 방식은
모든 포인트를 합산한 뒤 한 번에 차감하는 것이다.
하지만 이 방식에는 아래와 같은 문제가 있다.
- 만료 임박 포인트가 사용되지 않고 소멸될 수 있다.
- 사용자 입장에서 "포인트가 사라졌다"는 불만이 생긴다.
- CS 대응이 어려워진다.
- 비즈니스적으로도 포인트 손실이 발생한다.
다시 말해서, 정합성은 맞지만 정책적으로는 틀린 결과가 나온다.
차감에도 '정책'이 필요하다
이 문제를 해결하귀 위해
포인트 차감에도 명확한 규칙이 필요하다고 판단했다.
내가 선택한 원칙은 다음과 같다.
가장 먼저 만료되는 포인트부터 사용한다.
이 방식은 일반적인 쿠폰/적립금 시스템에서도 자주 사용되고,
사용자 경험과 비즈니스 정책 양쪽에서 모두 합리적이다.
이 방식을
만료 우선 차감(Early Expiry First)라고 정의했다.
Early Expiry First 전략
- 사용자가 보유한 포인트 Lot을 조회한다.
- 만료일이 빠른 순으로 정렬한다.
- 앞에서부터 필요한 만큼 차감한다.
- 하나의 Lot이 부족하면 다음 Lot으로 이어서 차감한다.
핵심은
포인트를 한 번에 차감되지 않고, Lot 단위로 나누어 차감하는 것이다.
도메인 관점에서의 장점
이 전략을 도메인 로직으로 구현하면서 얻은 장점은 다음과 같다.
- 만료 정책이 코드에 자연스럽게 녹아든다.
- "왜 이 포인트가 먼저 차감되었는지" 설명이 가능하다.
- 포인트 사용 이력이 명확해진다.
- 정책 변경 시 알고리즘만 교체하면 된다.
차감 로직이
단순 계산이 아니라 도메인 규칙의 표현이 되었다.
구현 시 고려했던 포인트
구현 과정에서 특히 고려했던 부분은 아래와 같다.
- 만료일이 없는 포인트는 가장 마지막에 차감
- 부분 차감이 가능한 구조
- Lot 단위로 차감 이력 기록
- 이후 동시성 제어와 결합 가능하도록 설계
정리하며
이 글의 핵심은 이것이다.
차감 로직은 계산이 아니라 정책이다.
Early Expiry First는 단순한 알고리즘이지만,
포인트를 자산으로 모델링했기 때문에
자연스럽게 도출될 수 있었던 선택이었다.
다음 글에서는
이 결제 흐름이 실제 주문 상황에서 마주한
상품 재고 동시성 문제와,
이를 해결하기 위해 어떤 락 전략을 선택했는지를
정리해보려고 한다.
'나의 개발 이야기' 카테고리의 다른 글
| [Point-live-young (3)] 포인트 만료 전략 선택 – 배치인가, 조회 시 처리인가? (0) | 2026.02.11 |
|---|---|
| [Point-live-young (4)] 상품 재고 동시성 문제와 락 전략 선택 (0) | 2026.02.11 |
| [Point-live-young (1)] 포인트 기반 결제 도메인 설계 (0) | 2026.02.10 |
| 개발자로서의 가치관 - 함께, 그리고 긍정적인 영향 (3) | 2025.06.09 |
| 개발자로의 전향 (2) - 개발은 삶과 닮아 있다 (0) | 2025.06.02 |