케이스 요약
100개 이상의 가맹점을 둔 빨래방 프랜차이즈 런드리익스프레스를 위해 월별 명세서 자동 생성 및 이메일 발송 시스템을 개발했습니다. 120개 지점 기준 15분에 발송을 완료할 수 있습니다.
클라이언트 소개
140개 이상의 런드리익스프레스 무인빨래방을 운영하고 있는 (주)더빌더스앤컴퍼니와는 2021년부터 인연이 되어서 프로젝트를 꾸준히 진행하고 있습니다.
처음 함께 일을 시작했을 때는 빨래방의 수가 20개 정도였던 것 같은데, 4년 사이에 140개 이상의 점포로 성장했고, 그 성장에 함께 할 수 있어 보람을 느끼고 있습니다.
개발 니즈 및 목표
2021년, 런드리익스프레스의 이용권 대표님께서는 작은 요청사항으로 오토오피스에 연락을 주셨습니다.
대표님은 개발능력이 있으셔서 직접 사업 운영에 필요한 시스템을 개발하고 계셨지만, 사업 확장을 고려하여 외주 개발을 맡기기로 하셨습니다.
첫 번째 요청사항:
매월 가맹점에 발송하는 결산 보고서를 자동화하고 싶다
런드리익스프레스의 결제 데이터를 API로 구글 시트에 받아, 이를 명세서 형태로 가공해 지점에 월별 보고서를 발송하는 시스템이 필요했습니다.
•
가맹점 수가 적을 때는 사람이 수작업으로 처리할 수 있지만, 50~100개 이상으로 늘어나면 매달 정산에 며칠이 소요되고 인력도 부족해집니다.
•
대표님은 장기적 성장과 효율성을 위해 결산 프로세스 자동화를 목표로 하셨습니다.
적용 솔루션
결제 데이터 가공과 이메일 발송 자체는 단순해 보이지만, 실제로는 몇 가지 난관이 있었습니다.
•
일부 데이터는 수기로 입력해야 했고, API 데이터에는 사람이 식별하기 어려운 코드가 포함되어 있었습니다.
•
이를 담당자가 쉽게 이해하고, 입력할 수 있도록 변환하는 과정이 필요했습니다.
그래서 구글 시트를 이용해서 마스터 파일을 하나 만들고, 거기에 여러 탭들을 만들면서 필요한 기능들을 추가해 나갔습니다. 사실상 맞춤형 ERP를 만들어가는 과정이었습니다.
1.
우선, 가맹점 정보를 관리하는 탭을 만들었습니다.
•
하나의 사업자가 하나의 가맹점을 운영하는 경우가 대부분이지만, 여러 가맹점을 운영하는 경우도 이 있기 때문에 계층구조를 갖도록 만들었습니다.
•
구글 시트에서 사용할 사업자별, 지점별 키(KEY)를 생성하였습니다. 구글 시트로 시스템을 개발하면서 중요한 요소입니다. 모든 것을 앱스 스크립트로 개발하지 않고 VLOOKUP과 같은 구글 시트 함수를 사용하기 때문에 필요한 부분은 키로 잘 만들어둘 필요가 있습니다. 이렇게 만든 키는 구글 시트와 앱스 스크립트에서 모두 유용하게 사용됩니다.
2.
결제 데이터는 가맹점별로 세탁머신별로 일별로 발생을 하는 구조였는데, 월별로 합산하도록 만들었습니다.
•
초기에는 일별데이터를 바로 가져와서 월별로 합산을 했으나, 지점이 늘어나면서 일별데이터가 너무 많아져서 QUERY를 사용해 월별로 먼저 합산한 데이터를 IMPORTRANGE로 가져오는 방식으로 변경했습니다.
IMPORTRANGE 는 구글 시트 간에 데이터를 참조하는 좋은 방법이기는 하지만, 행과 열이 늘어나면 어느 순간 INTERNAL ERROR 등의 오류를 표시하면서 작동하지 않습니다. 이 한계를 잘 알고, 선처리를 해서 데이터의 양을 최소화하는 것이 중요합니다.
3.
수기 지출 금액을 추가하는 탭을 만들었습니다.
•
가맹점을 운영하기 위해서는 소모품 등 여러 지출 항목이 발생하기 마련이지요. 결산 보고서에 얼만큼의 비용이 들었는지 표시하기 위해서 지점과 상품을 선택해서 입력하는 탭을 만들었습니다.
•
이런 탭에 필요한 것이 앞서 만든 가맹점 관련 키입니다. 나중에 가맹점별로 정산을 할 때에 해당 키를 식별자로 통합해줘야 하기 때문이지요. 이름이 지정된 범위 기능을 통해서 드롭다운으로 키를 선택할 수 있도록 세팅해주어야 합니다.
•
초기에는 1개의 수기 지출 탭이 있었지만, 후에는 3개 정도로 늘어났습니다. 지출의 카테고리도 세분화되고, 담당자도 여러 명이 되었기 때문에 관리의 용이성을 위해서 탭을 추가했습니다.
4.
명세서를 생성하고 PDF로 변환해서 이메일로 발송하는 코드를 작성했습니다.
•
명세서 템플릿은 별도의 구글 시트를 만들었습니다. 매출과 비용, 그리고 수수료가 명확하게 표시될 수 있도록 템플릿을 만들고, 필요한 수식들을 작성했습니다. 템플릿에는 구글 시트의 여러 수식들이 사용되었는데 수식이 적용되었기 때문에, 템플릿에서 특정 가맹점의 보고서를 미리 조회할 수 있었습니다.
•
이메일 내용은 HTML로 디자인을 하고 앱스 스크립트와 연동될 수 있도록 코드를 작성했습니다.
•
앱스 스크립트로 PDF를 만들고 이메일을 발송하는 코드 자체는 어려운 것이 아니었으나, 문제는 속도였습니다. 앱스 스크립트에서는 스크립트 런타임이 6분 (무료 계정) 또는 30분 (유료 계정)이 주어지는데, PDF를 만들고 이메일을 보내는 과정이 30초 정도 소요된다고 하면 30분이라고 해도 60개 가맹점만 처리할 수 있는 것이 문제였습니다.
◦
이 문제는 트리거로 해결을 했는데, 트리거는 앱스 스크립트를 예약해서 실행하는 기능입니다. 240개의 가맹점이 있다고 하면, 트리거 4개를 예약하면 해결할 수 있는 것이지요. 하지만 트리거 4개가 순차적으로 실행이 된다면, 보고서를 다 보내는데 2시간이나 걸립니다. 뭔가 잘못보냈다는 것을 알아서 다시 보내려고 하는데, 2시간이 또 걸려야 한다면 낭패이죠.
◦
그래서 트리거를 병렬로 처리하도록 개발 방향을 설정했습니다. 동시에 실행하면 30분이면 240개 가맹점을 모두 처리할 수 있는 것이지요. 이렇게 하기 위해서는 단지 트리거를 동일한 시간에 예약하는 것만으로는 해결되지 않았습니다.
◦
구글 시트는 API로 페이지를 액세스할 때에 너무 빈번하게 요청하는 것을 막기 때문인데요. PDF 변환을 하려고 할 때에 이 오류가 발생하게 됩니다. 병렬로 동시에 실행이 되면 한 번에 여러 건의 요청이 하나의 템플릿에 들어오면서 처리가 거부되는 현상이 생깁니다.
◦
이 문제를 해결하기 위해서 트리거를 예약할 때에 템플릿을 트리거의 수만큼 복사하고 각 트리거가 자신의 템플릿에 순차적으로 액세스하는 방법을 도입했습니다. 템플릿 파일에 부하가 없기 때문에 오류 없이 프로세스가 잘 실행됩니다.
•
직원에게 미리 테스트로 보내는 기능, 선택한 사업자만 보내는 기능, 보내기 전에 보낼 대상들을 미리보는 기능도 추가하여 완성도를 높였습니다.
5.
스크립트와 트리거의 실행 결과를 보여주는 로그 탭을 만들었습니다.
•
트리거에 따라서 여러 가맹점들이 정확한 내용으로 이메일 발송까지 완료가 되었는지 보여주는 구글 시트 탭을 하나 추가했습니다. 스크립트의 시작 시간, 종료 시간을 보여주고, 해당 스크립트의 성공률을 표시합니다. 
결과 및 효과
만약 사람이 한다면 얼마나 걸렸을까요? 정산부터 사람이 해야 한다면, 1개 업체에 15분 이상이 걸리지 않았을까요? PDF를 만들고 이메일 보내는 과정만 하더라도 1개 업체에 3분은 걸릴 작업이었습니다.
이 시스템은 2021년에 런드리익스프레스에 도입된 이래로 2025년 현재까지 만 4년이 넘도록 업그레이드를 거쳐가며 결산 시스템으로 자리를 잡고 있습니다.