토스페이먼츠의 결제 시나리오

  • 원장: 회계에서 원장은 기업의 모든 거래 내역을 기록하는 공식적인 장부
  • 결제 원장: 고객이 결제하거나 취소한 거래내역을 보관하는 DB(테이블)

문제 1: 일관성 없는 구조

카드 취소/부분 취소는 각각의 테이블에 저장되고 있었고 계좌이체 취소/부분취소는 한 테이블에 저장되고 있었다.

문제 2: 다양한 도메인 사이의 강한 의존성

하나의 카드 테이블을 각각 다른 도메인 팀들이 각자 다르게 컬럼에 의미를 부여해 쓰고 있었음

문제 3: 비즈니스 확장을 가로막는 구조

결제 - 결제수단 1:1 여러번 나누어 결제가 불가한 구조. 더치페이, 분리결제 등

왜 MySQL로 전환했는가?

기존 오라클에서 테이블을 추가한다거나 하는것도 되지만 신규 원장을 새롭게 구축하기로함. 다음과 같은 이유

  1. 이미 다른팀 쓴다. 시스템 안정을 위해서임
  2. 유지보수. 기존에는 오라클, 마이바티스로 관리. 디버깅 오래걸리고 오라클 전용함수, 동적쿼리 많았다. 마이는 JPA 라서 유지보수 용이
  3. 유연한 확장과 실험. 오픈소스와 도구 연동 부담없었고 이미 내부에 테스트환경이 있어 부담이 없다.

해결 1: 일관성 있는 구조

인서트만 허용

해결 2: 도메인 간 결합도 낯추기

신규 결제원장은 API를 제공시도했으나 배치작업시 API 과부하 생길수있다. 결국 카프카 도입 도메인간 의존성 제거, 각 팀 각자 개발 가능

해결 3: 확장성 있는 구조

핵심

신규원장 전환: 비동기 쓰레드풀 설정

  • 7분
  • 이파트에서 여러 설정나오고 비동기 세팅도 나옴 적용해볼만한 주제다!!!

신규원장 마이그레이션: 서버 분리

병렬로 처리해도 병목이 있으면 그래로다.

신규원장 마이그레이션: bulk insert

신규원장 마이그레이션: 캐시