Toss Payments Settlement Legacy System Overhaul: A Review
토스페이먼츠 정산 레거시 시스템 개편기 리뷰
토스페이먼츠 정산 레거시 시스템 개편기 리뷰: “쿼리의 시대”에서 “도메인의 시대”로
1) 🧭 개편의 출발점: “정산은 돈이므로, 틀리면 바로 사고입니다”
2) 🧱 20년 레거시의 가치와 한계: “돌아가지만, 바꾸기 어려운 시스템”
3) 🚨 한계 #1: 비즈니스 로직이 코드가 아니라 “거대한 SQL 한 방 쿼리”에 종속
4) 🔥 장애/리스크 시나리오: “한 방 쿼리의 작은 수정이 전체 정산을 흔듭니다”
5) 🧩 첫 번째 설계 결정: 쿼리를 ‘개선’이 아니라 ‘분해’한다 (분할정복)
6) 🧠 분할정복의 실무적 효과: “전면 교체”가 아니라 “점진 전환”이 가능해집니다
7) 🧱 신규 구조의 형태: “쿼리 하나가 하던 일”을 역할 객체로 분리
8) 🧾 (주석) “도메인 모델”이 중요한 이유
9) 🧨 한계 #2: 정산 데이터 모델링이 ‘집계 저장’ 중심이라 원인 추적이 어려움
10) 🔍 장애 분석 관점: “집계 결과 오류”는 디버깅 비용이 폭발합니다
11) 🧱 두 번째 설계 결정: 정산 결과를 “정규화(최소 단위)”로 저장
12) 🧷 운영 개선 #1: “계산 당시 설정값” 스냅샷 저장
13) 🧯 운영 개선 #2: 재처리(리트라이) 가능한 단위로 “실패를 기록”
14) 📈 부작용: 최소 단위 저장의 대가 = 데이터 폭증
15) 🗂️ 데이터 최적화 #1: 정산일자 기반 레인지 파티셔닝 + 인덱스 전략
16) 🧾 데이터 최적화 #2: 조회 전용 테이블(집계) 분리로 쓰기·읽기 충돌 제거
17) 🚨 한계 #3: 배치 성능 이슈 — 거래가 늘면 처리시간이 폭발
18) 🧰 스프링 배치로 개편했지만, 자동으로 해결되지 않는 2가지
19) 🧊 I/O 개선 #1: “계약/설정 정보” 배치 전처리 캐시
20) 📦 I/O 개선 #2: ItemProcessor로 “한 건씩” 전달되는 구조의 함정과 래퍼(Wrapper)
21) 🧾 I/O 개선 #3: JDBC 배치 인서트로 “N번 INSERT”를 “1번 INSERT(묶음)”로
22) ⚡ 병렬화 #1: 외부 API 호출은 “동시에” 하고 “나중에 조합”
23) 🧵 병렬화 #2: 멀티스레드 스텝의 현실 — “Thread-Safe하지 않은 Reader”가 가장 위험
24) 🧯 1차 대응: 동기화(Synchronization)는 정합성을 지키지만 성능을 죽입니다
25) 🧠 최종 해법: 모듈러(Modulo) 기반 파티셔닝으로 “처리 범위를 스레드별로 고정”
26) ✅ “이제 만들었으니 배포”가 불가능한 이유: 레거시와 동일 동작 증명이 필요
27) 🧪 검증 난이도: 경우의 수가 수만~수백만으로 터집니다
28) 🏗️ 테스트 자동화 플랫폼 + “계산 전용 API” 설계
29) 🐤 투입(Deploy) 전략의 조건: “빠른 복구” + “감당 가능한 영향 범위”
30) 🐦 배치 레이어 까나리(Canary): 레거시/신규를 동시에 돌리고, 결과가 같을 때만 신규를 채택
31) 🔬 투입 단위의 미세화: 가맹점 → 결제수단 → 결제권(트랜잭션)까지
32) 🧰 배치 운영의 또 다른 전쟁: “젠킨스 잡 1,781개”가 의미하는 것
33) 🏚️ 과거 운영: IDC 여러 서버에 흩어진 단일 인스턴스 배치 + 크론 관리
34) ☁️ 1차 개선: 쿠버네티스로 옮겼지만, 정산 배치에는 함정이 있었습니다
35) 🧭 배치 프레임워크 재선택: “정확히 한 번”과 “워크플로우 명세”가 최우선
36) 🏗️ 젠킨스의 강점: 파이프라인만으로 “의존관계가 있는 배치 흐름”을 단순하게 표현
37) 💸 운영 고도화 #1: 다이나믹 프로비저닝으로 배치 실행 노드를 탄력적으로 운영
38) 🧾 운영 고도화 #2: 잡 선언(Code)화 — UI 클릭에서 Git 기반 관리로
39) 🔭 운영 고도화 #3: 모니터링/분석 도구 체계화 (Thread Dump, Profiler, Prometheus, Pinpoint)
40) 🧠 정리: 이 개편이 “기술 부채 상환”이 아니라 “운영 가능한 정산 플랫폼” 재구축인 이유
41) 🧭 실무 교훈 1: “정산 시스템은 ‘정확성’이 기능이 아니라 운영 모델입니다”
42) 🧭 실무 교훈 2: “전환은 개발이 아니라, 검증·투입·관측의 총합입니다”
43) 🧭 실무 교훈 3: “대량 데이터 시스템은 읽기/쓰기/운영을 분리해서 설계해야 합니다”
44) 🧭 실무 교훈 4: 멀티스레딩은 “락을 어떻게 잡을지”가 아니라 “범위를 어떻게 나눌지”가 핵심입니다
45) 🧭 마무리: 레거시 개편의 정석은 “분해 → 증명 → 제한적 전환 → 운영 자동화”입니다
느낀점
Last updated