📌 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

+ Recent posts