(대표 이미지는 실제 앱의 설정 시트 화면입니다. 쿠팡이츠 광고료가 이번 달 기준인 0.05, 즉 5%로 들어가 있습니다.)
배달 전문 음식점을 위한 매출 기록 앱을 만들었습니다. 구조는 단순합니다. 앱스크립트로 화면을 만들고 데이터는 구글 시트 DB에 저장합니다. 구글 시트에 배달 플랫폼별 설정값을 입력해 두고, 그날그날 플랫폼별 매출액만 입력하면 앱이 자동으로 수익과 수익률을 계산해 주는 방식입니다.
설정 시트에는 쿠팡이츠, 배민, 요기요, 땡겨요 같은 플랫폼마다 수수료율, 배달비, 기준 원가율, 광고료 같은 값을 하나씩 적어둡니다. 매출이 들어오면 앱은 이 표를 참고해서 “이 매출에서 실제로 손에 남는 돈이 얼마인지”를 계산합니다.
몇 달 동안은 아무 문제 없이 잘 돌아갔습니다. 매일 숫자를 넣으면 대시보드에 월 매출, 예상 정산액, 순익, 수익률이 착착 그려졌습니다.

두 달 전 설정값이 틀렸다
문제는 몇 달이 지나서 드러났습니다. 데이터를 다시 들여다보다가, 두 달 전 설정값이 잘못 들어가 있었다는 걸 알게 된 겁니다.
두 달 전에는 광고료율이 15%였습니다. 그런데 이번 달은 5%로 내려가 있었습니다. 광고료가 10%포인트나 줄었으니, 당연히 이번 달 수익률이 두 달 전보다 눈에 띄게 좋아야 합니다. 그런데 장부상 숫자는 그렇게 나오지 않았습니다. 두 달 전 기간이 실제 조건과 다른 설정값으로 계산되어 있었던 겁니다.
“전체 적용”을 눌렀더니
두 달 전 데이터를 바로잡으려고 설정 시트를 15%로 고쳤습니다. 그런데 이미 기록된 과거 데이터에는 고친 값이 적용되지 않았습니다. 과거 매출은 입력하던 그 시점의 설정값으로 이미 계산이 끝나 있었기 때문입니다.
그래서 앱스크립트에 만들어 둔 “전체 적용” 기능을 실행했습니다. 지금 설정값으로 모든 매출 기록을 다시 계산해 주는 기능입니다.
결과는 예상과 달랐습니다. 두 달 전 데이터만 바뀐 게 아니라, 이번 달 데이터까지 싹 15%로 다시 계산되어 버린 겁니다. 5%로 잘 계산되어 있던 이번 달 수익률이 하루아침에 뚝 떨어졌습니다.
솔직히 그 순간은 멘붕이었습니다.
그래서 어떻게 했냐면
당시 제가 찾은 해결책은 이랬습니다.
- 설정값을 15%로 둔 채 “전체 적용”을 실행해서 두 달 전 데이터를 15% 기준으로 맞춘다.
- 설정값을 다시 5%로 내린다.
- 이번 달 데이터를 하루씩 열어서 한 번씩 새로고침해, 5% 기준으로 다시 계산되게 한다.
결과적으로 숫자는 맞췄습니다. 하지만 이번 달 날짜 수만큼 새로고침을 반복하면서 “이게 맞는 방법인가” 싶었습니다. 그때는 더 좋은 방법이 있는지 몰랐습니다. 나중에 원인을 정리하고 나서야, 이 방법이 임시방편일 뿐이라는 걸 알게 됐습니다. 설정이 또 바뀌면 같은 수작업을 또 해야 하니까요.
무엇이 문제였나: 설정값에 “날짜”가 없었다
원인을 따라가 보니 문제는 계산 로직이 아니라 데이터 구조에 있었습니다.
설정 시트에는 플랫폼마다 값이 딱 한 줄씩만 있었습니다. 다시 말해 앱은 “지금의 설정값”만 알고 있었고, “두 달 전에는 15%, 이번 달은 5%”라는 사실은 전혀 몰랐습니다. 그러니 다시 계산하라고 하면, 앱이 쓸 수 있는 값은 오직 하나, 지금 시트에 적힌 값뿐이었습니다. 제가 했던 수작업은 결국 앱이 모르는 “기간별 설정값”을 제 손으로 하나씩 대신 넣어준 셈이었습니다.
수수료율이나 광고료 같은 설정값은 시간이 지나면 바뀝니다. 플랫폼 정책이 바뀌기도 하고, 계약 조건이 달라지기도 하고, 이번 경우처럼 입력 실수를 나중에 바로잡기도 합니다. 그런데 설정값이 바뀔 때마다 기존 값을 덮어써 버리면, 과거의 기준이 기록에서 사라집니다. 기준이 사라진 과거 데이터는 제대로 다시 계산할 방법이 없습니다.
데이터 관리 분야에서는 이런 문제를 “천천히 변하는 기준 정보“를 어떻게 다룰 것인가의 문제로 봅니다. 고객 주소, 상품 가격, 거래 조건처럼 자주는 아니지만 분명히 바뀌는 기준 정보는, 바뀔 때 덮어쓰지 않고 이력을 남기는 방식으로 관리해야 한다는 것이 기본 원칙입니다.
더 나은 방법: 구글 시트 DB 설정값에 “적용 시작일”을 붙이기
이 원칙을 구글 시트에 적용하면 구조는 이렇게 바뀝니다. 플랫폼마다 한 줄이 아니라, 설정이 바뀔 때마다 새 줄을 추가하고 각 줄에 적용 시작일을 붙이는 겁니다.
| 플랫폼 | 적용 시작일 | 중개수수료율 | 배달비 | 광고료 |
|---|---|---|---|---|
| 쿠팡이츠 | 2026-07-01 | 0.078 | 3,400 | 0.15 |
| 쿠팡이츠 | 2026-10-01 | 0.078 | 3,400 | 0.05 |
(적용 시작일은 구조를 보여주기 위한 예시입니다.)
이렇게 해두면 앱은 매출 기록의 날짜를 보고, 그 날짜에 유효했던 설정값을 골라서 계산할 수 있습니다.
javascript
// 매출 날짜에 유효했던 설정값을 찾는 함수
// settings: [{ platform, startDate, adRate, ... }, ...] 적용 시작일 오름차순 정렬
function getSettingAt(settings, platform, saleDate) {
let found = null;
for (const s of settings) {
if (s.platform !== platform) continue;
if (s.startDate <= saleDate) {
found = s; // 매출 날짜 이전에 시작된 설정 중 가장 최근 것
} else {
break; // 이후 설정은 볼 필요 없음
}
}
return found;
}
이 구조라면 “전체 적용”을 한 번만 눌러도 끝납니다. 두 달 전 매출은 15%로, 이번 달 매출은 5%로 각자 맞는 기준으로 다시 계산되기 때문입니다. 날짜 수만큼 새로고침을 누를 필요도 없고, 나중에 설정이 또 바뀌어도 새 줄 하나만 추가하면 됩니다.
이 경험이 알려준 것
돌이켜보면 계산 코드는 처음부터 잘못한 게 없었습니다. 코드는 시킨 대로 정확하게 “지금의 설정값”으로 계산했을 뿐입니다. 문제는 그 설정값에 시간이라는 차원을 담지 않은 데이터 설계였습니다.
구글 시트 DB는 개발이 빠르고 편하지만, 그만큼 “값을 그냥 고쳐 쓰는” 습관이 들기 쉽습니다. 셀 하나를 고치는 게 너무 쉬우니까요. 하지만 계산의 기준이 되는 값일수록, 고치는 대신 새로 쌓는 방식으로 관리해야 합니다. 기준이 바뀐 기록이 남아 있어야, 나중에 과거를 다시 들여다볼 수 있습니다.
작은 매출 기록 앱 하나에서 배운 교훈이지만, 이건 기업의 기준 정보 관리에서도 똑같이 적용되는 원칙입니다. 데이터는 지금 값만큼이나, 그 값이 언제부터 그랬는지가 중요합니다.
경기도 하남 미사에서 부동산 중개 비즈니스를 운영하며 G2B 공공입찰 데이터 파이프라인을 직접 설계한 데이터 엔지니어입니다. 18년간 수학 교육 현장에서 다져온 논리적 사고력으로 데이터 거버넌스와 MDM을 다룹니다.
https://jjubis.com/about-jjubis/