호두랩스 플랫폼팀

호두랩스

PG와 인앱 결제를 하나의 API 흐름으로 처리하고 외부 승인과 내부 재화 제공 상태를 분리했습니다. PURCHASED 상태와 Redis 정보가 남아 있는 미완료 주문을 식별해 다시 처리하는 복구 배치를 구현했습니다.

회사 코드와 실제 결제 데이터는 포함하지 않고 공개 가능한 범위에서 처리 구조를 재구성했습니다.

30초 요약

맥락
PG와 Google Play·Apple 인앱 결제를 하나의 서비스 흐름으로 연결한 운영 결제 시스템입니다.
문제
외부 결제 승인과 내부 재화 제공이 한 번에 끝나지 않을 수 있어, 승인 이후 내부 처리가 완료되지 않은 주문을 구분할 필요가 있었습니다.
판단
주문을 REQUESTED·PURCHASED·COMPLETED로 나누고, PURCHASED 상태와 Redis 정보가 남은 주문만 복구 배치가 재처리하도록 했습니다.
역할
PG·인앱 결제 API와 상태 흐름, 복구 배치를 구현했고 Stored Procedure와 DB 처리 구조는 DBA와 협업했습니다.
결과
미완료 PURCHASED 주문을 Redis TTL 안에서 식별·재처리하고, 여러 WAS에서 복구 스케줄러가 동시에 실행되는 것을 ShedLock으로 제한했습니다.
검증
주문 상태, Redis TTL과 DB 제약이 담당하는 범위를 대조해 정상 처리와 재처리 조건, 처리하지 못하는 실패를 구분했습니다.
한계
PG 승인 후 PURCHASED 저장 자체가 실패하거나 Redis 정보가 유실·만료되면 이 복구 흐름만으로 처리할 수 없습니다.
증명하는 역량
외부 승인과 내부 완료를 상태로 분리하고, 복구 가능한 실패와 남는 복구 공백을 함께 설명하는 역량을 보여줍니다.

검증과 근거

확인 가능한 근거

주장의 적용 범위와 측정 조건을 함께 표시합니다.

  1. 사용자 확인결제 상태 흐름

    주문 상태를 REQUESTED, PURCHASED, COMPLETED로 구분했다.

    외부 승인과 내부 재화 제공 완료를 분리해 추적하기 위한 상태다.
  2. 사용자 확인중복 승인 반영·재화 지급 방지

    DB 주문 상태 검증과 결제 트랜잭션 식별키 UNIQUE 제약을 중복 방어선으로 사용했다.

    synchronized(this)는 단일 JVM 범위이며 완전한 분산 동시성 제어가 아니다.
  3. 사용자 확인미완료 주문 복구 배치

    Redis의 PURCHASED 정보를 약 300초 TTL로 관리하고 약 130초 이하로 남은 미완료 주문을 복구 배치 대상으로 조회했다.

    ShedLock은 여러 WAS의 복구 스케줄러 중복 실행을 방지하는 범위다.

사용 기술

구현에 직접 연결된 기술

보조 기술 보기
  • JPA
  • Stored Procedure

내부 코드와 결제 데이터는 포함하지 않았으며, 공개 가능한 범위에서 당시 처리 구조와 책임 경계를 재구성했습니다.

경력 정보와 역할 경계

통합 결제 시스템에 직접 관여한 인원은 백엔드 개발자 1명과 DBA 1명이었습니다. 애플리케이션 흐름과 DB 처리 구조의 책임을 다음과 같이 구분합니다.

직접 담당

  • PG 결제 API와 Google Play·Apple 인앱 결제 구현
  • REQUESTED·PURCHASED·COMPLETED 상태 흐름 구현
  • Redis TTL 기반 미완료 주문 복구 배치 구현
  • ShedLock을 이용한 복구 스케줄러 중복 실행 방지

  • DBA와 Stored Procedure 기반 결제 처리 흐름 협업

외부 구성

  • Stored Procedure와 DB 처리 구조는 DBA가 설계
  • PG사의 중복 승인 방어 동작
  • Google Play·Apple 영수증 검증 API

Case 2. 호두잉글리쉬 결제 리팩터링

PG사별로 결합돼 있던 결제 로직을 공통 인터페이스와 개별 구현체로 분리했습니다.

기존 구조와 변경 범위

기존 결제 코드는 PG사별 동작이 결제 흐름에 결합돼 있었습니다. 공통 결제 인터페이스를 정의하고 PG별 로직을 개별 구현체로 분리했으며, 사내 어드민 시스템의 결제 관련 레거시 기능을 유지보수했습니다.

이 작업은 땅콩스쿨 신규 통합 결제 API와 별도 사례입니다. 전체 결제 시스템의 완전한 재설계나 대규모 구조 전환으로 표현하지 않습니다.

근거