배경
회원가입 후 계좌를 연동하면 해당 사용자의 미분류 거래내역에 대해 소비 여부, 소비 카테고리, 지출 유형 분류를 실행한다.
현재 계좌 연동 API가 소비 분류 완료까지 동기적으로 기다리기 때문에, 최초 계좌 연동 완료까지 약 4분이 소요되고 있다. 이로 인해 사용자가 계좌 연동 화면에서 장시간 대기해야 한다.
현재 처리 흐름
POST /api/accounts 호출
- 가상계좌 생성 또는 CODEF 계좌 및 최근 90일 거래 수집
- 사용자의 미분류 거래를 DB에서 최대 500건씩 조회
- Java 규칙으로 분류 가능한 거래를 사전 분류
- 남은 거래를 최대 100건 단위로 분할
- FastAPI
/api/v1/classify-transactions를 배치별로 순차 호출
- 분류 결과를
TXN_ANALYSIS에 저장
- 모든 분류가 끝난 후 계좌 연동 API 응답 반환
문제점
- FastAPI 100건 단위 요청이 순차적으로 실행된다.
- FastAPI 배치별 처리 시간이 전체 응답 시간에 누적된다.
- 계좌 연동, DB 조회, 규칙 분류, FastAPI 호출, DB 저장 시간이 분리 계측되지 않는다.
- FastAPI 클라이언트에 명시적인 connect/read timeout이 없다.
- 현재 로그만으로는 정확한 병목과 개선 전후 차이를 판단하기 어렵다.
- 계좌 연동 API가 소비 분류 완료까지 기다려 사용자 체감 지연이 크다.
예상 병목
예를 들어 FastAPI 대상 거래가 400건이고 100건 요청 하나가 50초 걸리는 경우, 현재 구조에서는 다음과 같이 누적될 수 있다.
여기에 계좌·거래 수집과 DB 처리 시간이 더해지면 전체 응답 시간이 약 4분까지 증가할 수 있다.
목표
- 동일한 거래 수를 기준으로 소비 분류 처리 시간을 단축한다.
- FastAPI 호출을 제한된 동시성으로 병렬 처리한다.
- 개선 전후를 비교할 수 있도록 단계별 성능 지표를 기록한다.
- FastAPI 지연 또는 장애가 계좌 연동 요청을 무기한 대기시키지 않도록 timeout을 설정한다.
- 기존 분류 결과 검증 및 fallback 정책을 유지한다.
측정 지표
개선 전후 동일한 테스트 데이터로 다음 지표를 비교한다.
주요 지표
-
계좌 연동 API 전체 응답 시간
-
소비 분류 전체 처리 시간
-
전체 분류 대상 거래 수
-
초당 처리 건수
-
FastAPI 호출 횟수
-
FastAPI 호출별 및 누적 처리 시간
-
p50, p95 처리 시간
안정성 지표
- 정상 분류 완료율
- FastAPI fallback 건수 및 비율
- 응답 누락·중복·유효하지 않은 결과 건수
- 분류 전후 카테고리 분포
- DB 저장 성공 건수
- 미분류 잔여 거래 수
세부 구간 지표
- 미분류 거래 DB 조회 시간
- Java 규칙 분류 건수 및 처리 시간
- FastAPI 전달 거래 수
- FastAPI 배치별 요청 건수 및 처리 시간
- TXN_ANALYSIS 저장 시간
구현 범위
병렬 처리 정책
- FastAPI의 요청 최대 크기인 100건은 유지한다.
- 여러 100건 배치를 제한된 스레드 풀에서 병렬 실행한다.
- 기본 동시성은 4로 설정하고 환경 설정으로 변경할 수 있도록 한다.
- 서버 및 FastAPI 부하를 고려해 최대 동시성 상한을 설정한다.
- 처리 결과는 기존 요청 순서대로 합쳐 저장한다.
설정 예시:
fastapi.classification.parallelism=4
fastapi.connect-timeout-ms=5000
fastapi.read-timeout-ms=120000
완료 조건
검증 방법
- 동일한 가상 사용자를 준비한다.
- 동일한 은행과 기준일로 가상계좌를 생성한다.
- 분류 전 대상 거래 수를 기록한다.
- 계좌 연동 또는 소비 분류 API의 전체 시간을 측정한다.
- 서버 로그에서 구간별 처리 시간을 수집한다.
- 분류 후 TXN_ANALYSIS 저장 건수와 미분류 잔여 건수를 확인한다.
- 개선 전후 결과를 다음 형식으로 비교한다.
항목 개선 전 개선 후
━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━ ━━━━━━━━━
분류 대상 거래 수
───────────────────── ───────── ─────────
계좌 연동 전체 시간
───────────────────── ───────── ─────────
소비 분류 전체 시간
───────────────────── ───────── ─────────
처리량(건/초)
───────────────────── ───────── ─────────
FastAPI 호출 횟수
───────────────────── ───────── ─────────
FastAPI 누적 시간
───────────────────── ───────── ─────────
fallback 건수
───────────────────── ───────── ─────────
미분류 잔여 건수
후속 검토
제한된 병렬 처리 이후에도 사용자 체감 시간이 충분히 개선되지 않으면 다음 작업을 별도 이슈로 검토한다.
- 계좌 연동과 소비 분류의 비동기 분리
- 소비 분류 진행 상태 조회 API
- 프론트엔드 분류 진행/완료 UI
- FastAPI 내부 추론 및 모델 호출 최적화
배경
회원가입 후 계좌를 연동하면 해당 사용자의 미분류 거래내역에 대해 소비 여부, 소비 카테고리, 지출 유형 분류를 실행한다.
현재 계좌 연동 API가 소비 분류 완료까지 동기적으로 기다리기 때문에, 최초 계좌 연동 완료까지 약 4분이 소요되고 있다. 이로 인해 사용자가 계좌 연동 화면에서 장시간 대기해야 한다.
현재 처리 흐름
POST /api/accounts호출/api/v1/classify-transactions를 배치별로 순차 호출TXN_ANALYSIS에 저장문제점
예상 병목
예를 들어 FastAPI 대상 거래가 400건이고 100건 요청 하나가 50초 걸리는 경우, 현재 구조에서는 다음과 같이 누적될 수 있다.
여기에 계좌·거래 수집과 DB 처리 시간이 더해지면 전체 응답 시간이 약 4분까지 증가할 수 있다.
목표
측정 지표
개선 전후 동일한 테스트 데이터로 다음 지표를 비교한다.
주요 지표
계좌 연동 API 전체 응답 시간
소비 분류 전체 처리 시간
전체 분류 대상 거래 수
초당 처리 건수
FastAPI 호출 횟수
FastAPI 호출별 및 누적 처리 시간
p50, p95 처리 시간
안정성 지표
세부 구간 지표
구현 범위
병렬 처리 정책
설정 예시:
fastapi.classification.parallelism=4
fastapi.connect-timeout-ms=5000
fastapi.read-timeout-ms=120000
완료 조건
검증 방법
항목 개선 전 개선 후
━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━ ━━━━━━━━━
분류 대상 거래 수
───────────────────── ───────── ─────────
계좌 연동 전체 시간
───────────────────── ───────── ─────────
소비 분류 전체 시간
───────────────────── ───────── ─────────
처리량(건/초)
───────────────────── ───────── ─────────
FastAPI 호출 횟수
───────────────────── ───────── ─────────
FastAPI 누적 시간
───────────────────── ───────── ─────────
fallback 건수
───────────────────── ───────── ─────────
미분류 잔여 건수
후속 검토
제한된 병렬 처리 이후에도 사용자 체감 시간이 충분히 개선되지 않으면 다음 작업을 별도 이슈로 검토한다.