케이스 요약
저희는 IoT 통신 및 센서 기업의 전국 수자원 원격검침 시스템 운영 효율화를 위해 보고서 자동화 프로젝트를 진행했습니다. AppSheet에 누적된 데이터와 수천 건의 사진을 활용하여, 지역별 수백 페이지 분량의 보고서를 자동 생성하는 시스템을 구축했습니다. 퍼포먼스 테스트, 병렬 트리거, 로그/재시도 시스템을 적용한 결과, 5초 이내에 보고서 1페이지 생성이라는 혁신적인 속도를 달성했습니다.
클라이언트 소개
아이에스테크놀로지(주)는 IoT통신 및 센서 개발 및 전국적인 수자원 원격검침시스템을 사업화하는 기업으로 인천 연수구에 위치해있습니다. 1993년 설립된 이래로 30년 이상 사업을 영위하고 있는 60명 규모의 테크 기업입니다.
개발 니즈 및 목표
아이에스테크놀로지(주)(ISTEC)의 담당자님께서 2021년에 연락을 주셨을 때에, ISTEC에서는 앱시트를 도입해서 전국의 수자원 원격검침시스템을 운영하고 계셨습니다. 지역별로 수 천 건씩, 전체 수 만 건의 센서들을 앱을 통해서 리포트를 받고 있었는데, 문제는 취합한 데이터의 리포트화였습니다.
발주처에 정기적으로 보고서를 제출해야 했는데, 센서별 주소, 설치 정보, 그리고 여러 장의 이미지를 포함하는 수백 페이지 분량의 보고서를 템플릿에 맞춰 작성하는 것은 정규 직원에게는 버거운 일이었고, 매번 외부 인력을 고용해 수작업으로 처리해야 했습니다.
오토오피스는 이 비효율적인 수작업을 완전히 자동화하는 프로젝트를 맡았으며, 목표는 다음과 같았습니다.
주요 개발 목표
•
목표1: 지역별 원격수도검침기 사진 대지 자동 생성 (구글 슬라이드)
•
목표2: 유지보수 정기 점검표 및 점검 결과 보고서 자동 생성 (구글 슬라이드, 구글 시트)
적용 솔루션
앱시트에서 입력한 데이터와 사진이 구글 드라이브에 저장되고 있었고, 해당 데이터와 사진을 활용하여 보고서 생성을 고속으로 자동화하는 솔루션이 필요했습니다.
다음과 같은 주요 솔루션을 적용했습니다.
1.
구글 슬라이드, 구글 문서의 퍼포먼스 테스트
•
구글 워크스페이스에서 대량으로 보고서를 생성할 때에 선택할 수 있는 옵션은 구글 슬라이드 또는 구글 문서가 있습니다. 앱스 스크립트로 두 서비스 모두 제어할 수 있었기 때문에 수 백장의 보고서를 생성할 때에 퍼포먼스가 어떤지를 비교하고 더 적합한 것을 선택할 필요가 있었습니다.
•
페이지 추가 스트레스 테스트를 진행한 결과, 구글 문서는 800 ~ 900 페이지가 한도였고, 구글 슬라이드는 1,000 페이지 정도까지 생성이 가능했습니다. 이러한 차이가 나는 원인은 내부 데이터의 구조 차이 때문입니다. 구글 문서는 텍스트 노드 및 스타일이 문서 객체에 누적되는 방식이고, 슬라이드는 각 페이지별로 독립된 객체로 관리되기 때문에, 페이지 수가 늘어날 수록 구글 문서가 메모리의 압박이 심해집니다.
•
구글 슬라이드가 1,000 페이지까지 생성은 가능했으나, 이렇게 큰 파일을 여는데 10 ~ 15분까지도 소요되었기 때문에 현실적으로 1,000 페이지까지 생성해서는 안된다는 것을 알 수 있었습니다. 안정적으로 자동화를 운영하기 위해서 구글 슬라이드를 선택하고, 파일 당 페이지 수를 500 페이지로 제한하기로 협의하고 개발을 시작했습니다.
2.
지역별 구글 슬라이드 생성
•
앱시트에서 관리되는 센서별로 지역이 입력되어 있었기 때문에, 앱스 스크립트로 모든 데이터를 가져와서 지역별로 필터링하는 방법을 간단하게 적용했습니다. 지역은 겹치지 않았기 때문에 단순한 필터링으로도 충분하였습니다.
•
구글 슬라이드의 템플릿을 생성해두었습니다. 템플릿 안에는 제목, 목차, 콘텐츠 슬라이드를 구성했습니다. 자동 생성 스크립트를 실행하면 템플릿을 복사해서 지역 보고서를 생성하고, 템플릿 안에서 슬라이드를 연속해서 복제하고, 데이터와 사진을 입력하는 방식을 택했습니다.
•
구글 슬라이드 템플릿은 표로 만들어져있었는데, 스크립트로 표를 셀 별로 제어할 수 있습니다. 앱시트의 데이터를 셀별로 지정된 위치에 입력하고, 사진은 셀의 크기에 맞게 리사이즈해서 딱 맞도록 삽입했습니다. 사진의 경우에는 텍스트와는 달리 셀 안에 넣을 수는 없어서 X, Y축으로 위치를 지정했어야 하는데, 딱 맞도록 삽입할 수 있도록 여러 번의 테스트를 거쳐 성공했습니다.
•
센서의 슬라이드가 모두 추가가 되면 해당 정보들로 목차를 만들고, 보고서 하단에 슬라이드 번호를 추가해주었습니다.
•
자동화한 결과 1개 센서 데이터를 보고서화 하는데 1.2초 ~ 4.7초 정도가 소요되었습니다. 이미지가 없으면 텍스트만 작업하기 때문에 시간이 빨랐고, 이미지가 있는 만큼 시간이 더 소요되었습니다. 사람이 작업하는 것에 비해 매우 빠른 속도였는데, 페이지에 이미지를 리사이즈해서 4개 추가하고 텍스트를 모두 입력하는 작업을 사람이 한다면 한 페이지에 3 ~ 5분은 걸릴 작업이었습니다. 수작업 대비 시간을 1%로 줄인 자동화 결과에 만족스러워하셨습니다.
기술적 이슈: 여러 스크립트가 병렬로 하나의 슬라이드를 동시에 변경할 경우 작업이 저장되지 않아, 결국 속도 향상보다는 데이터 무결성을 위해 직렬 방식으로 진행해야 했습니다. 또한, 슬라이드 병합 방식은 복사/붙여넣기에 시간이 과도하게 소요되어 채택하지 않았습니다.
3.
대량 작업을 위한 병렬 트리거 적용
•
앱스 스크립트는 런타임이 6분으로 제한이 되어 있어서, 1번의 실행만으로 모든 작업을 완료할 수는 없었습니다. 유료 계정의 경우에는 30분 런타임이 주어지지만, 당시에 클라이언트에서는 무료 구글 계정을 사용할 수 있었기 때문에 6분 제한을 적용받고 있었습니다.
•
앱스 스크립트에서는 동시에 20개의 트리거를 생성할 수 있기 때문에 총 120분의 작업이 한 번에 가능합니다. 트리거를 통해서 대량 작업을 예약하는 방식으로 진행하도록 마련하였습니다.
•
트리거를 예약할 때에 중요한 점은 각 트리거가 작업하는 양을 설정하는 것입니다. 너무 많이 하면 6분을 초과하면서 중단되기 때문에, 적당한 양을 설정하여 5분 대에 필히 완료되도록 하는 것이 필요합니다. 이번 개발에서도 1페이지 생성 시간을 고려해서 적절히 안배하여 대량 작업을 효율적으로 분산 처리 했습니다.
4.
로그 및 재시도(Hot Fix) 기능
•
스크립트가 트리거로 실행되는 만큼, 실시간으로 스크립트가 완료되어 결과를 볼 수 없습니다. 각 트리거가 완료되는 것을 트래킹하고, 예기치 못한 오류에 대응하는 시스템이 필요했습니다.
•
트리거의 로그를 기록하면서 할당된 작업이 100% 완료되었는지 또는 오류가 발생했는지를 트래킹할 수 있는 시스템을 구글 시트로 만들었습니다.
•
예기치 못한 오류 발생 시, 오류가 발생한 부분만 선별적으로 재작업할 수 있는 Hot Fix 스크립트를 구현했습니다. 이 기능은 전체 작업을 처음부터 다시 실행할 필요가 없도록 하여 시간과 리소스를 크게 절약했습니다.
결과 및 효과
클라이언트의 요구사항에 맞춰 10가지 템플릿의 사진 대지 및 보고서 대량 생성 스크립트를 성공적으로 개발했습니다.
기존에 알바가 며칠 동안 수작업으로 진행해야 했던 보고서 작성 작업을 버튼 클릭 한 번으로 완료할 수 있게 되면서 운영 효율성을 극대화했습니다. 궁극적으로 5초 이내에 보고서 1페이지 생성을 달성하며 클라이언트의 업무 부담을 완전히 해소했습니다.