📌 1. 문제 정의
정산 시스템은 단순 CRUD가 아닌
금액의 최종 확정 상태를 관리하는 시스템입니다.
실무에서 다음과 같은 문제가 발생합니다.
- 결제/환불/정산 로직이 혼재되어 데이터 정합성 붕괴
- 부분 환불 처리 시 금액 계산 오류
- 동시 요청으로 인한 중복 정산
- 배치 실패 시 데이터 불일치
- PG 데이터와 내부 데이터 불일치
📌 2. 설계 의사결정
2.1 결제 / 환불 / 정산 분리
- Payment, Refund, Settlement를 독립 Aggregate로 설계
- “음수 금액 처리” 대신 환불을 별도 이벤트로 모델링
👉 효과
- 회계 처리 명확화
- 데이터 추적 가능
- 정산 로직 단순화
2.2 상태 기반 정산 모델
정산을 이벤트가 아닌 상태로 관리
- READY
- SETTLED
- ADJUSTED
👉 효과
- 재정산 가능
- 장애 복구 용이
- 배치 실패 대응 가능
2.3 멱등성 설계
- idempotency key 기반 중복 요청 방지
- (orderId + actionType) unique constraint 적용
👉 효과
- 중복 환불/정산 방지
- 외부 PG 재시도 대응
2.4 동시성 제어
- JPA Optimistic Lock 적용
- Retry 로직 구현
👉 효과
- 동시 환불 요청 충돌 해결
- 데이터 무결성 확보
2.5 이벤트 기반 처리
- @TransactionalEventListener 기반 이벤트 발행
- 결제 → 정산 비동기 분리
👉 효과
- 시스템 결합도 감소
- 확장성 확보
2.6 배치 및 재처리 구조
- T+1 정산 배치 설계
- 재정산 가능한 구조 구현
- 실패 데이터 재처리 로직 구축
👉 효과
- 운영 안정성 확보
- 장애 대응 시간 단축
📌 3. 기술 스택 선정 이유
Backend
- Java + Spring Boot
- JPA (Transaction 관리)
👉 안정성과 검증된 생태계
Database
- PostgreSQL
👉 ACID 보장 + 복잡한 집계 처리
Messaging
- Kafka (또는 이벤트 기반 구조)
👉 정산 비동기 처리
Infra
- Docker 기반 배포
👉 운영 환경 일관성 확보
📌 4. 핵심 성과
- 동시 주문/환불 처리 시 데이터 충돌 제거
- 부분 환불 구조 개선으로 정산 오류 제거
- 배치 실패 시 재처리 가능 구조 구축
- 정산 데이터 정합성 확보
- 운영 장애 대응 시간 단축
📌 5. 핵심 인사이트
- 정산 시스템은 “금액 계산” 문제가 아니라 “상태 관리 문제”
- 데이터 정합성은 기능이 아니라 시스템 설계의 결과
- 장애는 반드시 발생하며, 복구 가능하도록 설계해야 함
📌 한 줄 요약
정산 시스템은 정확한 계산보다 “틀리지 않는 구조”를 만드는 것이 핵심입니다
LIST
'Software > Maker(Spring & Python & node)' 카테고리의 다른 글
| Claude Mythos는 언제 우리 손에 오는가 — 공개 시점과 오픈소스 생태계에 미칠 영향에 대한 고찰 (6) | 2026.04.23 |
|---|---|
| Claude Opus 4.7, 4.6과 무엇이 달라졌나 — 실사용자 관점 마이그레이션 노트 (0) | 2026.04.23 |
| 정산 시스템 기술 스택의 진화 — 왜 Java/Spring은 여전히 살아남고, AI 시대에도 바뀌지 않는 핵심 문제들 (0) | 2026.04.22 |
| 결제와 정산은 왜 분리해야 하는가 – 실무에서 터지는 구조적 문제와 해결 (0) | 2026.04.22 |
| 에이전트가 나 대신 토론할 때 — ASAT에서 만난 파이프라인의 진짜 가치 (0) | 2026.04.22 |