아프리카 디지털 결제: 시스템 설계자의 탄식

발행: (2026년 5월 21일 AM 06:32 GMT+9)
5 분 소요
원문: Dev.to

출처: Dev.to

디지털 결제 in Africa: 시스템 디자이너의 탄식

우리가 실제로 해결하려던 문제

우리 고객 풀은 대부분 온라인에서 작품을 수익화하려는 아프리카 크리에이터들로 구성돼 있었습니다. 일반적인 결제 프로세서를 통합하려고 시도했을 때, 우리는 벽에 부딪혔습니다. 어떤 결제 흐름과 API 키 조합을 사용해도 작동하지 않았죠. 오류 메시지는 항상 동일했습니다: “지역 제한으로 인해 결제가 거부되었습니다” 혹은 단순히 “귀하의 계정이 의심스러운 활동으로 표시되었습니다.” 마치 존재하지 않는 문제를 해결하려는 듯했지만, 실제로는 명백히 존재하는 문제였습니다.

처음 시도한 방법 (그리고 왜 실패했는가)

우리는 기존 결제 흐름을 손보아 지역 제한을 우회하려고 했습니다. API 요청을 조정하고, 통화를 바꾸고, 심지어 다른 결제 게이트웨이(예: 나이지리아용 Paystack, 케냐용 M‑Pay)도 사용해 보았습니다. 그럼에도 아무것도 효과가 없었습니다. 더 깊이 파고들어 보니 문제가 코드나 결제 프로세서가 아니라 시스템 자체의 근본적인 아키텍처에 있음을 깨달았습니다.

아키텍처 결정

우리는 한 걸음 물러서서 결제 처리 시스템 전체를 처음부터 다시 설계하기로 했습니다. Mollie라는 네덜란드 기반 결제 프로세서를 선택했는데, 이 서비스는 다중 통화 거래와 지역별 맞춤 결제 흐름에 특화돼 있습니다. 아프리카 시장에 대한 경험과 일반적인 지역 제한을 우회할 수 있는 능력이 결정적인 이유였습니다. 또한 Interchangeable Payment Interface (IPI) 라는 API 세트를 도입해 필요에 따라 다양한 결제 프로세서를 교체할 수 있는 맞춤형 결제 흐름을 구현했습니다.

숫자가 말해준 결과

새 결제 처리 시스템을 도입한 뒤 우리는 다음과 같은 변화를 확인했습니다:

  • 결제 오류가 크게 감소했습니다 (25 % → 5 %).
  • 성공적인 거래 비율이 상승했습니다 (40 % → 75 %).
  • 결제 관련 지원 요청이 감소했습니다 (30 % → 10 %).

숫자는 스스로 말해줍니다. 새로운 시스템은 더 신뢰할 수 있을 뿐만 아니라 사용자 친화적이었습니다.

내가 다르게 했으면 하는 점

돌이켜보면, 처음부터 지역 제한을 식별하고 완화하는 데 더 적극적인 접근을 했어야 했다고 생각합니다. 아프리카 시장에 특화된 결제 프로세서를 처음부터 선택했다면 시간과 자원을 크게 절감할 수 있었을 것입니다. 이번 경험을 통해 시스템 아키텍처의 중요성과 기존 시스템의 제약을 넘어 생각해야 함을 배웠습니다. 엔지니어로서 우리는 가정을 도전하고 새로운 해결책을 탐색할 준비가 필요합니다—때로는 처음부터 다시 시작하는 것이 최선일 수도 있습니다.

0 조회
Back to Blog

관련 글

더 보기 »

베네수엘라의 디지털 크리에이터는 당신의 BS 솔루션을 필요로 하지 않는다.

우리가 실제로 해결하려던 문제 초기 시도 내 플랫폼의 결제 시스템은 PayPal, Stripe, Gumroad와 같은 제3자 서비스를 이용합니다. 이 서비스들은 결제 흐름을 처리하고, 결제 성공 여부를 내 시스템에 알리는 웹훅을 보냅니다. 그러나 이 웹훅이 전송되지 않거나, 결제 상태가 정확히 반영되지 않는 경우가 발생했습니다. ### 문제 정의 1. **결제 상태 동기화 실패** - 사용자가 결제를 완료했음에도 불구하고, 내 데이터베이스에 결제 완료가 기록되지 않음. - 반대로, 결제 실패가 있었음에도 “결제 완료”로 표시되는 경우가 있음. 2. **웹훅 신뢰성 부족** - PayPal, Stripe, Gumroad 모두 재시도 메커니즘을 제공하지만, 내 서버가 일시적인 오류(예: 500 오류, 타임아웃)로 인해 웹훅을 놓치는 경우가 있음. - 웹훅이 중복 전송될 때 중복 처리를 방지하는 로직이 부재함. 3. **다중 결제 제공자 관리 복잡성** - 각 제공자는 서로 다른 API 스키마와 이벤트 타입을 사용함. - 결제 확인 로직이 제공자마다 다르게 구현돼 있어 유지보수가 어려움. ### 초기 접근 방식 1. **단일 제공자에 의존** - 처음에는 Stripe만 사용하고, Stripe의 `checkout.session.completed` 이벤트만 처리하도록 설계했습니다. - 이 접근 방식은 구현이 간단했지만, PayPal과 Gumroad 사용자를 배제하게 되었습니다. 2. **동기식 확인** - 결제 완료 직후 클라이언트에서 서버로 즉시 API 호출을 보내 결제 상태를 확인하도록 했습니다. - 그러나 네트워크 지연이나 사용자가 결제 페이지를 닫는 경우, 이 호출이 누락될 수 있었습니다. 3. **단순 재시도 로직** - 웹훅 처리 중 오류가 발생하면 5분 후에 동일한 엔드포인트로 재시도하도록 설정했습니다. - 이 방식은 재시도 간격이 고정돼 있어, 일시적인 장애가 길어질 경우 여전히 데이터가 누락될 위험이 있었습니다. ### 초기 접근 방식의 문제점 - **제공자 제한**: Stripe만 지원하면 PayPal 사용자와 Gumroad 사용자를 잃게 됩니다. - **실시간성 부족**: 클라이언트‑서버 동기 호출은 사용자의 행동에 크게 의존하므로, 결제 완료를 놓칠 가능성이 높습니다. - **재시도 한계**: 고정된 재시도 간격과 횟수는 다양한 장애 상황을 충분히 커버하지 못합니다. ### 결론 우리는 결제 상태를 **신뢰성 있게** 동기화하고, **다중 제공자**를 원활히 지원하며, **웹훅 실패**에 대한 강력한 복구 메커니즘을 갖춘 시스템이 필요합니다. 이를 위해 다음과 같은 설계 원칙을 채택했습니다.