[Multiple Database Banking Simulation] 7. RDG

dbdbdeep·2025년 11월 6일

최근에 프로젝트에 Docker도 조금 문제가 있었고, server도 꺼지고 이런저런 일이 발생해서 처리했다. server가 실제 본가에 있는 pc라 직접가서 켜줘야했다.

그리고 최근에 취업활동을 조금하느라 조금 신경을 못썻다. 그래서 여유가 생겨 일주일정도 서버에 DB연결, Procedure, RDG 프로그램을 개발하였다. RDG는 이제 claude랑 GPT를 이용해서 개발을 하였다.

RDG

RDG는 MDBS의 핵심 프로그램이다. 각 DBMS 별로 BE에서 프로시저를 실행시키는 엔드포인트를 지정해놨다.

크게
1. hold 금액 update - 송금 금액 보류
2. 수금준비
3. 출금확정
4. 입금확정
5. 내부이체 확정

이체 프로세스

내부이체

내부이체의 경우 1->5로 끝난다. hold 금액을 잡고 난 이후에 같은 은행사이에 일어난 것이기에 바로 확정을 해준다.

외부이체( Mysql은행에서 Oracle은행으로 )

  1. Mysql은행에서 holds금액을 update
  2. Oracle은행에서 수금준비 (이과정에서 계좌가 없을 수도 있으니 체크)
  3. Mysql은행에서 출금확정
  4. Oracle은행에서 입금확정

여기까지 정리하고 테스트를 진행했다.

Docker 설정파일들이 port가 잘못적혀있어서 postgre가 Flask로 접근이 안되어서 관련파일들도 수정하고 server에 Docker관련 세팅도 조금 추가하였다.

RDG 기본 구조

내가 원하는 요구사항은 아래와같다. 원래 내가 가지고있던 생각에다가 MDBS를 예전에 조금 간략하게 진행했을 때 RDG를 만들다보니 종료했을 때 이체 루틴을 진행시키다가 강제로 종료가 되어 데이터가 안맞는 경우가 있었다. 그래서 관련처리도 요구사항이었다.

  1. 초당 몇개의 데이터를 생성할지 설정가능.
  2. 어떤 DBMS만 랜덤데이터를 발생시킬지
  • 현재 Mongo는 나중에 추가할 예정이다. 그래서 랜덤데이터를 만들 떄 Mongo는 생성하면안된다.
  1. 종료시 안전하게, 현재 진행하는 프로세스는 다하고 종료
  2. 통계 데이터
  3. 각 처리에 대한 값을 로깅

그래서 1차적으로 RDG를 만들었다. 그리고 데이터를 약 만개정도 생성하고 현재 문제가 무엇이 있는지 분석했다.

링크 : https://github.com/minu0897/MDBS/tree/main/BE/scripts

Hold_amount를 update한 후 실패시 처리

현재 step 1에서 hold_amount를 update한다. 그리고 step 2로 넘어간다.
그리고 RDG를 분석하니 대부분 step2에서 오류가 났고 Postgres에서 났다. 이유는 return을 내가 하지않아서 RDG에서는 얘를 실패처리를 했고 다음루틴으로 넘어가지않았다. 그러다보니 오류가났을 경우 Hold_amount의 금액은 점점 쌓여갔다. 그래서 실패를 했을 때 hold_amount를 다시 돌려주는 로직을 새롭게 작성했다. Step1 이후에 Step2에서 오류가 나면 Step1에서 update한 hold_amount를 다시 돌리는 Procedure이다. 그래서 Mongo를 제외한 DBMS에 작성을 한 후 RDG에 추가해줬다.

RDG 실행

초당 3개의 데이터를 생성하게 설정을 한 후 실행해보았다. 기초 데이터는 현재 mysql,postgre,oracle로 각 은행에 2명에게 1억원씩 넣었다.
그래서 아래 sql을 실행하면 모두 200,000,000 / 0 으로 나온다.

select sum(balance),sum(hold_amount) from MDBS.accounts
select sum(balance),sum(hold_amount) from accounts
select sum(balance),sum(hold_amount) from accounts

1차시도

2025-11-06 21:35:14 - [INFO] - 종료 시그널 수신: SIGINT
2025-11-06 21:35:14 - [INFO] - ============================================================
2025-11-06 21:35:14 - [INFO] - 경과 시간: 307.47초
2025-11-06 21:35:14 - [INFO] - 전송: 915 | 성공: 1 | 실패: 914
2025-11-06 21:35:14 - [INFO] - 실제 RPS: 2.98 | 성공률: 0.11%
2025-11-06 21:35:14 - [INFO] - ============================================================
2025-11-06 21:35:14 - [INFO] - Random Data Generator v1 종료
데이터는 900개 정도 생성을 하려했는데 성공은 1개를 했다.

성공한 프로세스의 멱등키는 "pp-d85cddf2-3ecb-4ab0-b4fa-326a49817f83"이다. 이걸로 데이터를 한번 확인을 해보면

데이터도 잘 들어갔고 금액도 잘 맞는다. 근데 hold가 2개가 잡혀있다. 그래서 통계 데이터를 확인을 해보니

출금확정이 실패했다. -> procedure에 return 순서가 달라서 조정해줬다.

2차시도

우선 데이터는 다 초기화하고 시작한다.
2025-11-07 03:28:51 - [INFO] - 종료 시그널 수신: SIGINT
2025-11-07 03:28:52 - [INFO] - ============================================================
2025-11-07 03:28:52 - [INFO] - 경과 시간: 1303.61초
2025-11-07 03:28:52 - [INFO] - 전송: 3705 | 성공: 10 | 실패: 3695
2025-11-07 03:28:52 - [INFO] - 실제 RPS: 2.84 | 성공률: 0.27%
2025-11-07 03:28:52 - [INFO] - ============================================================
2025-11-07 03:28:52 - [INFO] - Random Data Generator v1 종료

현재 약 4000명 중 1명에게 돈을 넣어놨다. 그래서 4000개의 데이터를 발생시켜야 10건이 나온다. 다만 1건이 이체 성공시 돈이 있는 사람이 점점 많아져 이체가 성공할수록 성공률은 올라간다. 그래서 3700개의 데이터를 생성하여 10개의 데이터를 성공적으로 만들었다.

로그를 체크하고 데이터를 검증해서 정리한 문제점은 아래와 같다.
1. PostgreSQL 타입 불일치 - 6회

  • return 순서 변경으로 해결
  1. Oracle 데이터 없음
  • random_num = random.randint(0, 795) 으로 계좌 끝을 만들었는데 계좌가 ~1부터시작한다. 그래서 random_num = random.randint(1, 795)로 수정.
  1. 타임아웃
  • 성능이슈같은데, 당장은 해줄게 없어보임. 그리고 DB관련으로 성능을 끌어올릴 수 있다면 이 프로젝트를 시작한 이유가되기에 우선은 나중에 해결
  1. 네트워크 연결 끊김
  • 인프라 이슈같음.

3차시도

대략 2차시도에서 3500개가 넘는 데이터를 발생시키며 에러를 모두 수정했다. 그래서 이제는 많은 데이터를 가지고 실험을 할 생각이다.

  1. 초기데이터 수정
    현재 돈을 갖고있는 사람이 1/350의 확률로 가지고 있다. 이것을 조금 높여 이체확률을 높인다.
    약 100 중 1명이 돈을 갖고있게 데이터를 수정했다.

  2. 많은 데이터 생성

위와 같은 전제로 실행을 해보면,

2025-11-07 05:32:44 - [INFO] - 종료 시그널 수신: SIGINT
2025-11-07 05:32:45 - [INFO] - ============================================================
2025-11-07 05:32:45 - [INFO] - 경과 시간: 3610.59초
2025-11-07 05:32:45 - [INFO] - 전송: 10275 | 성공: 188 | 실패: 10087
2025-11-07 05:32:45 - [INFO] - 실제 RPS: 2.85 | 성공률: 1.83%
2025-11-07 05:32:45 - [INFO] - ============================================================
2025-11-07 05:32:45 - [INFO] - Random Data Generator v1 종료

약 10,000개의 이체를 시도했고 Timeout을 제외한 오류는 없었다. 금액도 잘 맞는다.

RDG는 이제 lOCAL 환경에서는 제대로 돌아가는 것을 확인했다.

3-1차시도

에러랑 데이터자체는 문제가 없다고 생각해 4차를 서버에서 실행하는 쪽으로 테스트할 예정이었다. 근데 서버에서 실행하려면 가상 환경을 설치해야해서 그건 이따할 생각으로 RDG 켜놓고 운동이랑 러닝좀 하고오니 2.5만개의 데이터를 생성했다. 문제는 hold_amount가 발생하고 release procedure로 없애는 작업이 안 일어난 것 같다.

hold_amount 관련 수정

timeout이 원인이었다. hold_amount update,transaction까지 insert했는데 timeout이 나서 retunr을 None을 해버렸다. 현재 코드로는 None을 처리를 안해서 처리 후 다시 테스트해야할 것 같다.

코드 수정 후 강제로 release procedure를 실행해줬다.

4차시도(Server에서 작동)

우선 서버에서 작동시키기위해 venv를 설치하고 시작을 하였다.

AI가 venv 세팅하는 프로그램을 짜줬다. 그리고 실행하니 정상작동한다. 아마 네트워크를 안쓰고 local에서만 돌아가니 조금 더 효율적으로데이터를 생성할 수 있을 것 같다.

4차 시도(진행중)

간간히 데이터를 체크했는데 데이터의 오류나 결함이 1개 정도 빼고는 없었다. 그래서 계속 켜놓으니 하루에 약 25만 ~ 26만개의 이체 내역을 생성하는 시뮬레이션이 만들어졌다. 굉장히 성공적이다.

데이터는 잘 뽑고 있는데 문제는 이 결과를 현재는 나만 알 수 있다. FE단에 뿌려주고 있지않기에 그래서 남들이 보기엔 이 프로젝트는 아직 아무것도 이룬것이 없어보인다. 그래서 MongoDB는 나중에 하기로하고 우선은 FE를 조금 수정해야할 것 같다.

profile
DB관련 공부를 합니다.

0개의 댓글