빈페이로 결제하게 된 이유

BeanPay 구조

내부 결제 로직과 외부 API 충전 기능을 분리함으로써 외부 API 장애 시 영향을 최소화합니다.

결제를 진행하는 중에는 외부API를 연동하지 않기 때문에 사용자의 경험을 향상시키고 결제 프로세스를 간소화할 수 있습니다.

서비스 자체 포인트인 빈페이 관리 방법 비교

방안 1: 유저 MSA에 beanpay 컬럼 추가

결제 MSA에서 유저 MSA로 API 요청하여 관리.

문제점:

  • 단일 트랜잭션 구현의 어려움
  • 수동 롤백 처리 필요
  • 비관적 락을 사용하거나 분산락을 사용하게 되면 회원의 읽기 성능도 떨어지게 됩니다.

방안 2: 결제 MSA에 관리 (선택)

결제 MSA 내 BeanPay 테이블 및 상세 테이블로 관리.

선택 이유:

  • 회원 조회 처리량 보존
  • 데이터베이스 트랜잭션 활용 가능
  • 결제 파트에서 금액 관리로 응집성 향상
  • API 호출 최소화
  • 단일 트랜잭션 처리 가능, 높은 일관성 보장

데이터 정합성 유지 방법

Redis 분산락 활용

  • 단일 스레드 특성으로 동시성 문제 회피 가능
  • 다중 데이터베이스 환경에서도 구현 가능
  • 락 획득/해제 및 예외 처리는 수동 작성 필요

데이터베이스 Lock 선택지

방식적합성이유
비관적 락적합결제 파트에 적합 (높은 정합성 우선)
낙관적 락부적합동시 변경 빈도가 높아 부적합
DB 샤딩어려움수평 확장 시 락 구현 어려움

최종 선택: Redis 분산락

분산락 적용

분산환경일 때 분산락을 적용하면 각 서버가 동일한 락을 공유하고 상호 배제적으로 작업할 수 있기 때문입니다.

프로젝트: Team-Koreano/Koreano