개발 slecs

대시보드 순이익에 PG 실비용 차감 반영

목차

대시보드 netProfit에 PG 실비용을 차감하는 작업을 했다. 뷰·스타일 파일 2개가 전부라 커밋 diff는 작지만, 실제로는 SQL 집계부터 UI 표기까지 건드린 범위가 꽤 넓었다.

왜 이게 필요했나

기존 대시보드의 순이익 수치는 매출에서 원가성 항목을 단순 차감한 값이었다. 그런데 PG 수수료는 건별로 발생하는 실비용임에도 그게 반영되지 않아, 화면에 표시되는 netProfit과 실제 통장에 남는 금액 사이에 차이가 생기고 있었다. 소액처럼 보여도 거래량이 쌓이면 무시할 수 없는 차이가 된다.

운영 팀이 대시보드 숫자를 보고 판단을 내리는 상황에서 이 괴리가 계속 방치되면 안 됐다. 단순히 "UI에 표기가 좀 빠졌네" 수준이 아니라, 의사결정에 영향을 주는 KPI가 틀려 있다는 문제였다. 그래서 쿼리 레벨부터 다시 설계했다.

구현 흐름

SQL부터 시작했다. PG 비용은 결제 건마다 비율 또는 고정액으로 발생하기 때문에, 집계 시점에 주문 단위로 합산해서 차감해야 정확하다. 일별/월별/누적 집계를 각각 다루다 보면 동일한 차감 로직이 중복될 수 있는데, 이번에는 뷰나 서브쿼리로 한 번만 정의해두고 각 집계가 그걸 참조하는 방식으로 정리했다.

-- 예시: 주문별 PG 실비용 차감 후 net
SELECT
  order_id,
  revenue,
  pg_fee,
  (revenue - pg_fee) AS net_revenue
FROM orders
WHERE settled_at BETWEEN :start AND :end

집계 쿼리를 여러 곳에서 각자 작성하면 나중에 PG 수수료율이 바뀌거나 새 PG가 추가될 때 전부 찾아서 고쳐야 한다. 차감 기준이 한 군데에 있어야 정합성 유지가 쉽다.

UI 쪽은 기존 KPI 카드 구조를 그대로 따라갔다. 숫자 포맷은 이미 천단위 콤마와 원 단위를 공통 유틸로 처리하고 있어서 거기에 얹는 건 어렵지 않았다. 실시간 갱신은 5초 폴링을 유지했다. 이벤트 기반으로 전환하면 더 깔끔하겠지만, 현재 아키텍처에서 폴링 비용이 문제가 될 수준이 아니고 변경 범위를 최소화하는 게 우선이었다.

항목 변경 전 변경 후
netProfit 계산 매출 - 원가 매출 - 원가 - PG 실비용
PG 비용 표기 없음 KPI 카드에 별도 표시
갱신 주기 5초 폴링 5초 폴링 (유지)
숫자 포맷 혼재 천단위 콤마 + 원 단위 통일

금융 도메인에서 숫자를 다룰 때

결제·금융 도메인에서 "대충 맞는 것 같다"는 통하지 않는다는 걸 이 작업에서 다시 체감했다. 로직이 조금 달라도 거래 유형에 따라 특정 케이스에서만 틀리는 경우가 있고, 그게 운영 중에 발견되면 이미 신뢰 문제가 된다.

이번에 특히 신경 쓴 부분은 예외 케이스였다.

  • PG 비용이 null인 주문이 있을 때 COALESCE 처리 빠뜨리면 집계 전체가 null이 됨
  • 정산 완료된 건과 미정산 건이 섞이면 시점 기준 집계가 틀어짐
  • 화면에 권한 없는 사용자가 접근할 때 에러가 아닌 빈 화면을 보여줄 건지, 숫자 0으로 보여줄 건지

빈 데이터와 권한 없는 접근을 어떻게 처리하느냐는 "기능 구현"이 아니라 "운영에 안전한 구현"과 다른 레벨의 문제다. 귀찮더라도 쿼리 실행 계획을 미리 보고, NULL이 끼어들 수 있는 조인 경로를 확인하는 루틴을 가져가는 게 낫다.

구현 완료 후에는 직접 화면에서 동작 확인을 했다. 다른 화면에서 같은 지표를 보여주는 곳이 있으면 숫자가 일치하는지 cross-check한다. 이번에도 일별 합산과 누적 합산이 다른 뷰에서 동일하게 나오는지 확인하고 마무리했다.

작업 전에 현재 동작을 수치로 메모해두는 습관을 유지하고 있다. 변경 후 같은 케이스를 돌려보면 "맞다/아니다"를 판단하기가 훨씬 쉽다. 스크린샷 한 장이 긴 설명보다 낫다.

커밋은 논리적으로 독립된 단위로 쪼갰다. SQL 집계 변경, 뷰 바인딩, UI 표기 수정을 한 커밋에 다 때려넣으면 나중에 어느 변경에서 문제가 생겼는지 찾기 어렵다. 작은 커밋이 귀찮아 보여도 나중에 시간을 아껴준다. 커밋 메시지는 "무엇을 바꿨다"보다 "왜 바꿨는지"를 담으려고 하는데, 이번 커밋 메시지도 PG 실비용 누락으로 인한 수치 오차 해소라는 배경을 그대로 썼다.

사내 서비스를 만들다 보면 기능 하나가 결코 단순하지 않다는 걸 반복해서 체감한다. SQL 집계, 예외 처리, 화면 렌더링, 권한 체크가 전부 엮여 있어서 어느 하나만 빠뜨려도 특정 케이스에서 숫자가 틀리거나 이상한 화면이 나타난다. 이번 작업은 파일 두 개 변경으로 보이지만, 그 안에 그 과정이 다 들어 있다.

댓글 0

첫 댓글 달아줘.