말로 요청(그대로) 1회차 · Claude Code · Opus 5.5 · 클로드의 마지막 답 원문 · 목록
아직 main에 합치면 안 됩니다. 새로 추가된 기능 3개(생일 2배, 하루 한도, 포인트 사용)에 모두 버그가 있습니다. 하나는 기존 코드에 원래 있던 버그입니다. 아래 결과는 전부 직접 실행해서 확인했습니다.
꼭 고쳐야 할 문제
1. 생일 배율이 영구 적용되고 계속 커짐 — points.py:34-36
self.rate = self.rate * 2가 지갑에 저장된 적립률 자체를 바꿔 버립니다.
- 생일에 1만 원씩 두 번 결제하면 1,000P → 2,000P(4배)가 쌓입니다.
- 생일 다음 날 결제도 2,000P(20%)입니다. 생일에 결제할 때마다 2배씩 계속 불어납니다.
- 고치는 방법: self.rate를 없애고 rate = POINT_RATE * 2 if self._is_birthday(today) else POINT_RATE처럼 이번 결제에서만 쓰는 지역 변수로 계산하면 됩니다.
2. 포인트를 쓰면 하루 한도가 다시 열림 — points.py:37
earned_today를 entries의 "남은 포인트"로 합산하는데, use()가 이 값을 깎습니다.
- 재현: 5,000P 적립 → 5,000P 사용 → 같은 날 또 5,000P가 적립됩니다. 하루 한도를 무한히 넘길 수 있습니다.
- 고치는 방법: entry에 처음 적립한 양을 따로 저장하고, 한도는 그 값으로 계산해야 합니다.
3. 만료된 포인트부터 차감됨 — points.py:54-59
"오래된 적립분부터" 깎다 보니 이미 만료된 적립분도 대상에 들어갑니다. 반면 잔액 검사(balance)는 유효한 포인트만 셉니다.
- 재현: 만료 500P와 유효 500P가 있을 때 500P를 쓰면 만료분만 깎이고 잔액은 그대로 500P입니다. 포인트를 써도 잔액이 줄지 않습니다.
- 고치는 방법: 차감할 때 balance()와 같은 유효기간 조건으로 만료분을 건너뛰어야 합니다.
4. 음수를 사용하면 포인트가 늘어남 — points.py:49
- 재현: use(-1000)을 호출하면 잔액이 500P에서 1,500P로 늘어납니다.
- 고치는 방법: points <= 0이면 ValueError를 내도록 입력 검사를 넣어야 합니다.
기존 코드(main)에 원래 있던 문제
5. 유효기간이 하루 짧음 — points.py:45
< EXPIRE_DAYS - 1 조건 때문에 364일째까지만 쓸 수 있고 365일째에는 0P가 됩니다. 사장님 메모의 규칙은 "365일째 되는 날까지"이므로 < EXPIRE_DAYS가 맞습니다. 이번 PR에서 생긴 버그는 아니지만, 3번을 고칠 때 같은 조건을 쓰게 되니 같이 고치는 게 좋습니다.
사소한 점
- 2월 29일 생일 손님은 윤년이 아닌 해에는 2배 적립을 못 받습니다. 정책을 정해야 합니다(예: 2월 28일로 처리).
- 하루 한도를 다 채운 뒤 결제하면 0P짜리 기록이 계속 쌓입니다.
from datetime import date는 쓰이지 않습니다.- 새 기능에 테스트가 하나도 없습니다. 위 재현 사례들을 테스트로 추가해 두면 다시 생기는 걸 막을 수 있습니다.
1~4번을 고치고 테스트를 추가한 뒤 머지하는 걸 권합니다.