레거시 결제 원장을 확장 가능한 시스템으로
박순현/양권성 · 토스 · 토스 기술 블로그
소개
약 20년간 운영되어 온 레거시 결제 시스템을 어떻게 확장성과 회복 탄력성을 갖춘 구조로 전환해 나갔는지, 그 과정에서 마주한 장애들과 해결 경험을 공유합니다.
AI 핵심 요약
20년 넘게 운영된 결제 원장은 결제수단마다 다른 데이터 구조와 도메인 간 강한 결합, 결제와 승인 관계의 제약으로 유지보수와 확장에 어려움이 있었습니다. 이를 해결하기 위해 MySQL 기반 신규 원장을 구축하고, 공통 승인 테이블과 결제수단별 테이블을 분리했으며 INSERT-only 기록, Kafka 이벤트 연동, 결제와 승인의 분리로 구조를 바꿨습니다. 기존 서비스를 멈추지 않도록 비동기 적재와 검증 배치로 점진적으로 전환하고, 대규모 이관은 전용 서버와 Bulk Insert로 실서비스 부하를 줄였습니다. 운영 중 풀스캔으로 DB 부하가 급증한 장애를 롤백과 쿼리 힌트로 해결했으며, 데이터 보정·망취소·타임아웃 조정·멱등키 등 복구 장치를 통해 설계뿐 아니라 운영 회복력도 중요하다는 교훈을 얻었습니다.
- 승인 내역은 공통 테이블에 두고 결제수단별 속성은 별도 테이블로 분리하면 데이터 구조를 일관되게 유지할 수 있습니다.
- 거래 상태를 UPDATE로 덮어쓰기보다 INSERT-only로 기록하면 변경 이력을 보존하고 추적하기 쉽습니다.
- 비동기 마이그레이션은 서비스 자원과 분리하고, 제한된 ThreadPool·검증 배치로 부하와 누락을 관리해야 합니다.
- 장애 대응을 위해 롤백 경로, 원장 간 정합성 보정, 외부 원천사 망취소 같은 복구 수단을 미리 마련해야 합니다.
- 이벤트 재발행으로 중복이 생길 수 있으므로 소비자가 중복을 판별할 멱등키를 제공해야 합니다.
비슷한 학습 자료
고객은 절대 기다려주지 않는다: 빠른 데이터 서빙으로 고객 만족도를 수직 상승 시키는 법
이세찬 · 토스 기술 블로그
레거시 정산 개편기: 신규 시스템 투입 여정부터 대규모 배치 운영 노하우까지
강민주/박진현 · 토스 기술 블로그
가맹점은 변함없이, 결제창 시스템 전면 재작성하기
황성우 · 토스 기술 블로그
20년 레거시를 넘어 미래를 준비하는 시스템 만들기
하태호 · 토스 기술 블로그
멈춰있던 PG의 시간, 토스페이먼츠가 다시 흐르게 합니다
하태호 · 토스 기술 블로그
토스페이먼츠 결제 시스템 연동을 돕는 MCP 서버 구현기
김용성 · 토스 기술 블로그