← 목록
기타 2026-06-14 4KB 읽기 4분

요청: 정산재연동-강화

  • 날짜: 2026-06-14 10:27:09
  • 작업 경로: /Users/ef/crowny-ays

요청 본문

정산재연동.한선 강화 재작성 — 멱등키(거래id+ts) / 지수백오프 / DLQ판정(시도>=5) / 3상태(pending/settled/failed) / 헬스확인(curl -m2) / 5회초과 DLQ이관 / 4상출력(전송>0[티]/대상다운[옴]/미전송0[옴])

관련 산출

(클로드가 작업 결과를 이어 기록)

작업 결과

1. 강화 완료 ✓

파일: /Users/ef/crowny-ays/정산재연동.한선 (재작성, v2) 컴파일: /Users/ef/crowny-ays/정산재연동.toau (114KB, 4171 큐브)

2. 강화점 구현

멱등키 (idempotency key)

  • 형식: 거래id + "_" + 입력문자열의16글자prefix
  • 함수: 멱등키(거래id, 타임스탐프)
  • 테스트: 동일 입력에 대해 일관된 키 생성 확인 ✓

지수백오프 (exponential backoff)

  • 공식: 2^시도횟수 (상한 32초)
  • 함수: 백오프초(시도횟수)
  • 테스트: 0→1, 1→2, 2→4, 3→8, 4→16, 5→32, 6→32 ✓
  • 예시: 첫 재시도 1초, 다음 2초, 다음 4초, ... 32초 상한

DLQ 판정 (Dead Letter Queue)

  • 조건: 시도횟수 >= 5 이면 DLQ 이관
  • 함수: DLQ여부(시도횟수)
  • 테스트: 4회→0(미해당), 5회→1(DLQ이관) ✓
  • 적용: 5회 초과 항목은 data/정산DLQ.jsonl로 이관 마킹

3상태 관리

  • "pending": 초기 미전송
  • "settled": 전송 성공 (posted:true)
  • "failed": DLQ 이관 (시도 5회 이상)

4상 의사결정 (quaternary logic)

  1. [티] 전송 성공 (전송건수 > 0):
- 양쪽 서비스 200 OK 응답 - 미전송 항목 있음 - → 적립/쿠폰 원장 posted:false → posted:true, status:pending → status:settled로 갱신

  1. [옴] 대상 다운 (헬스체크 실패):
- reward(9738) 또는 pay(9866) 200 아님 - → reward:코드 pay:코드 출력, 다음 재연동 지수백오프 대기

  1. [옴] 처리 대상 없음 (미전송 = 0):
- 양쪽 서비스 UP이지만 posted:false 항목 0건 - → "재연동 대상 없음" 출력

3. 자가검증 테스트 (단위 테스트 포함)

=== 함수 자가검증 ===
멱등키 일관: TRADE_001_...✓ (입력 동일 시 키 일관성 확인)
백오프초: 1,2,4,8,16,32,32 (기대값 일치)
DLQ판정(4회): 0 (기대: 0) ✓
DLQ판정(5회): 1 (기대: 1) ✓

4. 실행 검증

케이스1: 서비스 DOWN [옴]

리워드헬스: 200
페이헬스: 000000

[옴] 대상 대기: reward:200 pay:000000
    → 다음 재연동 시 재시도 (지수백오프 적용)

케이스2: 서비스 UP + 미전송분 있음 [티]

리워드헬스: 200
페이헬스: 200
적립원장: 1건 미전송
쿠폰원장: 1건 미전송

[티] 재연동 2건 전송 성공
    ✓ 적립원장: 1건 posted:true / status:settled로 갱신
    ✓ 쿠폰원장: 1건 posted:true / status:settled로 갱신

케이스3: 서비스 UP + 미전송분 없음 [옴]

적립원장: 0건 미전송
쿠폰원장: 0건 미전송

[옴] 재연동 대상 없음

5. 파일 구조

정산재연동.한선       (고수준, 이미 작성함)
정산재연동.toau       (컴파일된 바이너리, 114KB)
정산재연동.rpn.한선   (RPN 정통 버전 — 스택형 로직 표현)

6. 잔여 이슈

  • 실제 SHA256 멱등키: 현재는 간이 해시(문자열 길이 기반). 실장 시 sha256sum 외부 호출 필요 (stdout 캡처 불가 → /tmp 리다이렉트 패턴 사용).
  • DLQ 이관 로직: 프로토타입은 마킹만. 실장 시 data/정산DLQ.jsonl에 레코드 append 필요 (현재는 sed 치환으로 status:failed 마킹).
  • 헬스체크 엔드포인트: 테스트는 /health 경로 사용. 실 서비스에서 엔드포인트 확인 필요 (기본값: root / 또는 /api/health).

7. 크래시 테스트

✓ 빈 파일 읽기: 글자수 가드로 안전 ✓ 미존재 파일: 파일읽기안전() 처리 ✓ 무한루프: 백오프 루프 정확한 횟수 계산 (7회) ✓ 4상 분기: 모든 경로 정상 완료


다음 단계

  1. 국세청 API 검증 (사업자검증.한선과 연동): CROWNY_NTS_API_KEY 환경변수로 선택적 활성화
  2. 담합탐지 (담합탐지.한선): 동일 (고객id, 사업자id) 3건+ 감지
  3. 단계 페널티 (단계페널티.한선): 90일 rolling window, 누적 위반 3회 시 퇴출
  4. 집사 통합: 정산재연동.toau를 집사.한선 배치 도구로 10분마다 호출 → 자동 복구