본문 바로가기
컨퍼런스 및 교육/slash25

현장결제 서비스 분산 트랜잭션 김학현님

by 백엔드 개발자 2025. 7. 27.

발표자: 토스코어 개발팀 김학현님 / 주제: 분산 환경에서의 트랜잭션 불일치 문제 해결을 위한 트리 기반 설계 모델


1. 발표 의도 및 구성

  • 기존의 투 페이즈 커밋(2PC)이나 사과 패턴(SAGA)처럼 널리 알려진 접근법이 아닌, 새로운 개론 수준의 트랜잭션 관리 접근을 제안하는 것이 목적이다.
  • ‘개론’이라는 명칭은 완성된 해결책이 아닌 새로운 개념과 방향을 제시하고자 하는 의도를 담고 있으며, 청중이 처음 접할 수 있는 관점을 쉽게 풀어내기 위해 선택됨.
  • 구현 세부보다는 아이디어와 구조 중심으로 설명

2. 문제 인식: 분산 트랜잭션의 불일치와 상태 정의의 복잡성

  • 단순한 API 두 번 호출 수준의 트랜잭션도, 실제 환경에서는 성공, 실패, 알 수 없음(Unknown) 세 가지 상태를 반드시 고려해야 함.
  • 예외 상황은 실무에서 매일 발생하고, 예를 들어:
    • 은행 점검
    • 지원 서비스 장애
    • 불안정한 네트워크 환경
      등으로 인해 짧게는 수 분, 길게는 수 시간 동안 상태 확인이 불가능한 경우가 발생함.
  • 트랜잭션이 1개만 추가되어도 가능한 경우의 수가 기하급수적으로 늘어난다.

트랜잭션이 3개일때의 경우의 수

 

 

  • 이처럼 분산 환경에서는 즉시 일관성을 보장할 수 없으며, 3가지가 필요하다고 판단함. 
    • 복잡한 상황을 나타낼 수 있는 표현 모델
    • 일관성을 보장할 방법
    • 일관성을 보장하는 시점

3. 해결 전략: 트리 기반 상태 표현 모델

3.1 트리 구조의 도입

  • 태스크(Task)를 서브 테스크와 하위 트랜잭션으로 구성된 계층적 트리 구조로 모델링.
  • 이 구조를 통해 다음이 가능해짐:
    • 각 단계의 명확한 상태 표현
    • 독립적/복합적 결제 수단의 유연한 모델링
    • 확장성 (새 수단, 새 절차 추가)

3.2 상태 정의와 리졸브

  • 리프 노드에는 트랜잭션 결과(API 응답 결과)가 위치.
  • 각 노드의 상태는 직계 하위 노드의 상태만으로 정의됨.
  • 이 상향식 상태 집계 과정을 **리졸브(resolve)**라 명명.
  • 트리 크기나 복잡도와 무관하게 2단계 하위 노드만 고려하면 되므로 계산 복잡도를 낮춤.

 

3.3 상태 불일치 

  • 만약 토스머니 사용의 상태가 성공으로 판명되었다면 토스머니는 성공 상태로 resolve 된다.
  • 결제 승인 노드입장에서는 하위노드의 상태가 일치하지 않으므로 여전히 알 수 없는 상태.
  • resolve는 현재 상태를 규명만 하고 근본적 불일치 해결이 어렵다. 그래서 불일치 해결 방법이 필요하다.

 

4. 상태 불일치의 해결: 보정(Correction)

4.1 보정 전략

  • 리졸브는 단순한 상태 판별일 뿐이며, 상태 불일치는 그대로 존재할 수 있음.
  • 이를 해결하기 위해 보정이 필요하며, 보정에는 다음 두 가지 방향이 존재:
    1. 성공으로 보정 – 실패한 트랜잭션 재시도 
       
      1. 실패로 보정 – 성공한 트랜잭션을 롤백

 

4.2 보정 주체와 정책 위임

  • 보정을 위해서는 성공,또는 실패등 보정 방향을 결정하고 실행할 주체가 필요하다.
  • 보정 방향과 실행은 각 노드가 자체적으로 판단하도록 설계.
  • 재시도 + 보상이라는 이중 보정 전략을 가짐.

 

5. 최종적 일관성 보장을 위한 운영 설계

  • API 응답 타이밍 내에서 완전한 일관성 확보는 불가능
  • 그래서 분산환경에서는 최종적 일관성을 보장하는 것이 필연적.
  • 이 시스템은 설계 레벨에서 자동으로 정합성을 회복할 수 있도록 구성됨.
    • 사람이 개입하여 조정하는 기존 방식과 달리, 자동화된 리졸브 + 보정 로직이 배치로 실행되어 운영 효율성 확보.

6. 실제 구현

6.1 테이블 설계

 

  • 트리 구조는 실제 DB 테이블로 구현.
    • 트리 레벨마다 개별 테이블 구성.
    • 이는 각 레벨의 관심사, 추상화 수준이 다르기 때문.

6.2 실행 주기

  • 분 단위 배치로 정기적인 리졸브 및 보정 수행.
  • 이후 특정 사건을 계기로, 트랜잭션 처리 시점(API 요청 응답 중)에도 최소한의 보상 트랜잭션을 함께 수행하도록 개선.

 

7. 정책 설계 기준

보정 정책은 다음 세 가지 기준을 기반으로 함:

  1. 심리적 가치 차이
    • 사용자가 현금 등 실질 가치 있는 수단에 민감하게 반응함.
    • 포인트/할인 실패보다 현금 환급 실패가 훨씬 큰 불만을 초래.
  2. 보상 트랜잭션의 난이도
    • 계좌로 돈을 입금하는 것이 출금하는 것보다 훨씬 쉬움.
    • 예: 환불보다 결제 차단이 더 어렵다.
  3. 내부 vs 외부 재화의 다룸 정도
    • 토스 포인트/할인(내부)보다 외부 계좌(토스머니 등)가 더 복잡하고 리스크 큼.

정책의 응용

  • 결제 수단마다 승인/환불 순서를 지정하거나, 필수 성공 대상 지정 가능.
  • 언론 상태의 전파 범위도 제어 가능 (정책 위임).

8. 트랜잭션의 상대성

  • 트랜잭션은 절대적인 물리적 단위가 아닌, 추상화 레벨에 따라 상대적으로 정의되는 논리 단위임.

예시:

관점트랜잭션 단위
결제 승인 할인, 포인트, 머니
토스 머니 충전, 사용
토스 머니 서버 더 하위 단계
사용자 주문 전체 (상품+결제+배송)
 
  • 서비스 간 관계는 자연스럽게 트리 구조를 이루고 있으며, 설계자가 명시하지 않더라도 모든 시스템은 거대한 트리의 일부로 동작하고 있었음을 역설적으로 설명함.

9. 결론

  • 트랜잭션의 불일치는 분산 환경에서 불가피하며, 이를 해결하기 위해 트리 구조, 리졸브, 보정, 최종적 일관성의 조합이 필요함.
  • 각 노드에 책임을 위임하고, 운영단에서 자동 정합성을 유지하도록 설계함으로써 사람 개입 없는 복구 가능 구조를 실현.
  • 트랜잭션의 본질을 상대적이고 계층적인 개념으로 재정의함으로써 보다 유연하고 확장 가능한 시스템 설계가 가능함.