[금융 IT] 보상 트랜잭션으로 분산 환경에서도 안전하게 환전하기

한강섭·2025년 9월 8일
0

금융 IT

목록 보기
4/6
post-thumbnail

이 글은 토스|SLASH 24 - 보상 트랜잭션으로 분산 환경에서도 안전하게 환전하기 를 보고 정리한 글입니다.

분산환경


왜 분산환경을 사용해야 할까?

기존 모놀리틱 구조에서는 거대한 단일 서버가 단일 Database를 바라보고 있는 시스템이다.

하지만 이런 구조는 시스템과 개발 팀의 규모가 커질수록 배포 및 개발 경험, 확장성, 단일 장애점등 다양한 문제가 발생되어 MSA 구조를 도입하고 있습니다.

기존 Corebanking 서비스에 존재하던 원화 계좌는 같은 DB를 바라보도록 분리,
존재하지 않던 외화 계좌와 같은 경우는 새로운 DB와 함께 분리되어 존재

따라서 환전같은 경우는 DB와 서버가 모두 분리된 상황에서 구현해야 했다.

만약 같은 Database를 가리키고 있다면 트랜잭션을 열고 각 계좌를 업데이트 한 후 커밋을 하여 장애가 발생해도 같이 롤백이 되어서 문제가 없다.

하지만, 다른 서버와, 다른 DB를 가리키고 있을 때 한쪽이 commit 되고 한쪽이 장애가 발생한다면 은행과 사용자에게 큰 피해를 가져다 줄 수 있다. 분산 트랜잭션이 필요한 이유!

분산 트랜잭션


2PC (Two Phase Commit)

Two Phase Commit은 두 단계에 나눠서 Commit을 진행하는 방법이다.

Phase 1 : Voting
각각의 트랜잭션 참여자들에게 Commit 가능 여부를 질의한다.
참여자들은 트랜잭션을 열고 Yes/No 응답을 하게 된다.

Phase 2 : Commit
모든 참여자가 Yes를 주었을 때 Commit 요청을 보내 트랜잭션을 처리한다.
단 한곳이라도 No를 준다면 모두 Rollback을 보내 실패로 처리한다.

Saga Pattern

각 참여자들이 순서대로 트랜잭션을 실행하면서 진행한 후, 특정 단계에서 실패하면 보상 트랜잭션을 실행합니다. 크게 두가지 방식으로 구현할 수 있다.

Choreography-based saga : 각 로컬 트랜잭션이 다른 서비스의 로컬 트랜잭션을 이벤트 트리거 하는 방식이다. 중앙 집중된 지점 없이 이벤트를 교환하며, 모든 서비스가 메시지 브로커를 통해 이벤트를 Publish/Response 한다.

Orchestration-based saga : Orchestrator가 중앙 집중식 컨트롤러 역할을 하고, 각 서비스에 실행할 트랜잭션을 알려주는 방법이다.
Orchestrator는 요청을 실행, 각 서비스의 상태를 확인, 실패에 대한 복구 처리한다.

간단하게 정리하자면
2PC는 구현이 간단하고 효과가 강력하지만, 작동 방식이 비효율적이다.
Saga는 구현이 어렵지만 (보상 트랜잭션) , 효율적이고 확장성이 좋다.

SAGA를 통한 환전 구현


출금부터 하는 SAGA

Saga Pattern은 중간 상태가 노출된다는 특징이 있는데, 만약에 중간 상태에 입금된 돈이 빠져나간다면 보상 트랜잭션이 발동하지 못 할수도 있다.

HTTP vs Messaging

동기 vs 비동기
입금, 출금과 같은 유저가 즉시 완료되기를 기대하는 부분에서는 HTTP를 활용
환전실패와 같은 유저가 기다릴 필요가 없는 부분에서는 비동기 처리, 결과적 정합성 보장만 하면 된다.

에러 핸들링


HTTP Error Handling

만약 출금 요청이 (5xx 에러, timeout) 에러가 발생했을 경우에 실패를 확인하는 메세지까지 에러가 발생할 확률이 높다.. 이럴 때 어떻게 해야할까?

Kafka MessageScheduler

지연시간이 없으면 바로 Consumer에게 지연시간을 넣으면 스케줄러에게 전해주고 상대 입출금 계좌가 회복할 시간을 준다.
30초 지연시키고 요청하고, 1분 지연하고 재시도 하여 계속 회복할 시간을 줄 수 있고, 무한히 에러가 난다면 수동으로도 요청 가능한 구조이다.

결론


  1. 외화 예금을 MSA 서버에 구축하면서 분산된 환경 생성
  2. SAGA를 사용하여 높은 가용성을 유지하면서도 분산 트랜잭션을 보장
  3. 계좌 입출금 서버에 문제가 생겨도 자동으로 회복
  4. 기존 계정계 시스템과 연결 및 확장 가능한 구조

감상평


현재 Fintech 프로젝트를 진행 중 기존 서비스에 증권 서비스를 추가해야 하는 상황에서 MSA구조를 도입해서 분산된 DB에서 일관성과 트랜잭션 처리에 대해 고민이 많았는데 영상을 통해서 프로젝트의 아키텍처를 어떻게 구성할 지 설계를 할 수 있었다.

Reference


[Saga 패턴] 마이크로서비스에서 Saga 패턴이란?
토스|SLASH 24 - 보상 트랜잭션으로 분산 환경에서도 안전하게 환전하기

profile
기록하고 공유하는 개발자

0개의 댓글