업무 데이터 파이프라인
“시트에서 DB로, 손 안 대고”
02이 차시를 마치면
- 1.시트와 데이터베이스 사이의 동기화 스크립트를 설계할 수 있다.
- 2.대량 데이터를 배치로 나눠 처리하는 방식을 구현할 수 있다.
- 3.API 호출이 실패했을 때 레이트 리밋을 지키며 재시도하는 로직을 만들 수 있다.
- 4.시트나 DB의 스키마가 바뀌었을 때 파이프라인이 조용히 깨지지 않게 대응할 수 있다.
- 5.파이프라인이 실패했을 때 알림을 받도록 설정할 수 있다.
03왜 필요한가
기본과정 04차시에서 만든 Apps Script 자동화는 시트 안에서는 잘 돌아갔다. 그런데 데이터가 몇천 행을 넘어가고 외부 API까지 함께 쓰기 시작하면서 문제가 생긴다. 한 번에 다 처리하려다 실행 시간 한도를 넘겨 중간에 멈추고, 외부 API가 순간적으로 느려지면 스크립트가 그대로 죽어버린다. 그리고 아무도 실패를 알지 못한 채 다음 날 아침에야 리포트가 비어 있는 걸 발견한다.
- 데이터가 늘어나면 한 번에 처리하던 방식이 실행 시간 한도에 걸려 중간에 멈춘다.
- 외부 API가 일시적으로 응답하지 않으면 스크립트가 재시도 없이 그대로 실패한다.
- 시트에 열이 하나 추가되거나 이름이 바뀌면 파이프라인이 예고 없이 조용히 깨진다.
- 실패해도 알림이 없어, 사람이 우연히 발견하기 전까지 데이터가 계속 비어 있는 상태로 방치된다.
04개념 설명
동기화 설계 — 무엇을 기준으로, 어느 방향으로
시트↔DB 동기화는 먼저 '어느 쪽이 원본(source of truth)인가'를 정해야 한다. 시트가 원본이고 DB는 조회용 사본인지, 아니면 DB가 원본이고 시트는 사람이 보는 창구인지에 따라 데이터가 양쪽에서 동시에 바뀌었을 때의 처리 방식이 완전히 달라진다.
또한 실행할 때마다 전체를 다시 옮길지(풀 동기화), 마지막 이후 바뀐 것만 옮길지(증분 동기화)를 정해야 한다. 데이터가 적을 때는 풀 동기화로 충분하지만, 많아질수록 증분 동기화가 필요해진다.
매번 전체를 다시 옮긴다
데이터가 적을 때 충분
마지막 이후 바뀐 것만 옮긴다
데이터가 많아지면 필요
- 원본(source of truth)을 먼저 정한다
- 풀 동기화 vs 증분 동기화
- 증분 동기화를 하려면 마지막 동기화 시점을 기록해둬야 한다
배치 처리 — 한입에 다 넣지 않는다
기본과정에서는 데이터가 적어 한 번에 처리해도 괜찮았지만, 대량 데이터는 정해진 크기(배치)로 나눠 처리해야 한다. 한 번에 처리할 양을 제한하면 실행 시간 한도를 넘기지 않고, 중간에 실패해도 어디까지 처리했는지 파악하기 쉽다.
배치마다 처리한 위치(커서)를 기록해두면, 다음 실행에서 처음부터 다시 시작하지 않고 멈춘 지점부터 이어갈 수 있다.
- 배치 크기는 실행 시간 한도를 기준으로 정한다
- 처리한 위치(커서)를 기록해 이어서 처리할 수 있게 한다
- 배치마다 결과를 확인하고 다음 배치로 넘어간다
레이트 리밋과 재시도 — 실패를 전제로 설계한다
외부 API는 일정 시간 안에 너무 많이 호출하면 요청을 거절한다(레이트 리밋). 재시도 로직은 실패했을 때 곧바로 다시 시도하지 않고, 간격을 점점 늘려가며(지수 백오프) 다시 시도한다.
몇 번을 시도해도 안 되면 포기하고 실패를 기록해야 한다. 최대 재시도 횟수가 없으면 무한정 반복하며 시간과 API 호출량을 낭비하게 된다.
- 레이트 리밋 응답을 구분해서 처리한다
- 재시도 간격을 점점 늘린다(지수 백오프)
- 최대 재시도 횟수를 정해 포기할 지점을 만든다
스키마 변경과 실패 알림 — 깨질 것을 가정하고 대비한다
시트의 열 이름이나 순서, DB 테이블의 컬럼은 언젠가 바뀐다. 파이프라인이 열 이름 대신 열 위치(A열, B열)에 의존하면, 순서가 바뀌는 순간 에러도 없이 조용히 잘못된 값을 옮긴다.
실행 전에 기대한 구조와 실제 구조가 같은지 확인하는 점검 단계를 넣고, 다르면 조용히 넘어가지 말고 실패로 처리해 알림을 보내야 한다.
A열, B열 기준
순서가 바뀌면 에러 없이 잘못된 값을 옮긴다
이름 기준으로 읽고 실행 전 검증
다르면 조용히 넘어가지 않고 알림을 보낸다
- 열 이름 기준으로 읽어 순서 변경에 강하게 만든다
- 실행 전 구조 점검(스키마 검증) 단계를 둔다
- 실패하면 조용히 넘어가지 않고 알림을 보낸다
05실습 가이드
1. 동기화 방향과 원본 정하기
- 동기화할 구글 시트와 Supabase(또는 사용 중인 DB) 테이블의 열/컬럼 구조를 정리한다.
- P4-1 프롬프트로 어느 쪽을 원본으로 볼지, 풀 동기화와 증분 동기화 중 무엇을 쓸지 AI와 함께 결정한다.
예상 결과 — 원본(source of truth), 동기화 방식, 충돌 처리 원칙이 문서로 정리된다.
안 될 때 — 시트나 DB 구조를 정확히 모르면 먼저 시트 헤더와 DB 테이블 스키마를 각각 내보내(export) 확인한 뒤 다시 요청한다.
2. 소량 데이터로 동기화 스크립트 첫 실행
- 실습 시트에서 20행 내외의 소량 데이터만 골라 동기화 스크립트를 실행한다.
- Supabase 테이블에 해당 데이터가 정상적으로 반영됐는지 확인한다.
예상 결과 — 소량 데이터가 오류 없이 DB에 반영되고, 값이 시트 내용과 일치한다.
안 될 때 — 연결 자체가 안 되면 API 키나 DB 연결 문자열(connection string)이 올바른지, 환경변수로 제대로 분리됐는지 먼저 확인한다.
3. 대량 데이터를 배치로 나눠 처리하기
- P4-2 프롬프트로 전체 데이터를 정해진 크기로 나눠 처리하는 배치 로직을 추가 요청한다.
- 처리 위치(커서)를 어딘가(시트의 별도 셀 또는 DB의 별도 테이블)에 저장하도록 함께 요청한다.
- 전체 데이터로 실행해 여러 배치가 순차적으로 처리되는지 확인한다.
예상 결과 — 전체 데이터가 여러 배치로 나뉘어 순차 처리되고, 마지막에 처리 완료 로그가 남는다.
안 될 때 — 중간에 멈추면 저장된 커서 값을 확인하고, 그 값부터 이어서 실행되는지 별도로 테스트한다.
4. API 실패에 대비한 재시도 로직 넣기
- P4-3 프롬프트로 지수 백오프 방식의 재시도 로직을 추가 요청한다.
- 일시적으로 잘못된 API 주소를 사용하는 등 의도적으로 실패 상황을 만들어 재시도 동작을 테스트한다.
예상 결과 — 실패 시 간격을 늘려가며 자동 재시도한 로그가 남고, 정해진 횟수 이후에는 포기하고 실패로 기록된다.
안 될 때 — 재시도가 멈추지 않고 계속된다면 최대 재시도 횟수 설정이 빠진 것이다. AI에게 최대 횟수를 명시해 다시 요청한다.
5. 스키마 변경 시나리오 테스트하기
- 테스트용 사본 시트에서 열 하나를 추가하거나 이름을 바꿔본다.
- P4-4 프롬프트로 실행 전 스키마 검증 단계와 열 이름 기준 매핑을 추가 요청한다.
- 구조를 바꾼 상태에서 파이프라인을 다시 실행해 반응을 확인한다.
예상 결과 — 구조가 예상과 다르면 데이터를 처리하지 않고 멈추며, 어떤 열이 문제인지 명확한 메시지가 나온다.
안 될 때 — 구조가 바뀌었는데도 조용히 통과해 잘못된 값이 들어간다면 열 이름 기준 매핑이 제대로 안 된 것이다. 해당 부분을 짚어 다시 수정 요청한다.
6. 실패 알림 연결하기
- P4-5 프롬프트로 실패 시에만 이메일(또는 슬랙)로 알림을 보내는 코드를 추가 요청한다.
- 정상 실행 한 번, 의도적 실패 한 번을 각각 만들어 알림이 원하는 경우에만 오는지 확인한다.
예상 결과 — 실패했을 때만 실패 시각·단계·에러 요약이 담긴 알림이 도착하고, 성공 시에는 알림이 오지 않는다.
안 될 때 — 알림이 안 오면 성공/실패 판단 조건이 잘못 걸려 있을 수 있다. 실행 로그를 먼저 확인하고 조건문을 AI와 함께 점검한다.
7. 자동 실행 트리거 등록하기
- 기본과정 04차시와 같은 방식으로 시간 기반 트리거(또는 사용 환경에 맞는 스케줄러)를 등록한다.
- 등록된 트리거 목록에 방금 만든 항목이 있는지 확인한다.
예상 결과 — 트리거가 등록되고, 정해진 시간에 파이프라인이 자동으로 실행된 로그가 남는다.
안 될 때 — 트리거 저장이 안 되면 스크립트 실행 권한 승인이 아직 끝나지 않은 것이다. 권한 승인부터 다시 진행한다.
8. 전체 파이프라인 통합 점검
- 동기화 → 배치 처리 → 재시도 → 스키마 검증 → 실패 알림까지 전체 흐름을 처음부터 한 번에 실행한다.
- 특정 단계에서 막히면 P4-6(복구) 프롬프트로 그 단계만 따로 진단받는다.
예상 결과 — 전체 흐름이 에러 없이 끝까지 완료되고, 각 단계가 로그에 순서대로 기록된다.
안 될 때 — 특정 단계에서 반복적으로 막힌다면 그 단계만 별도 스크립트로 떼어내 재현한 뒤, P4-6으로 원인을 좁혀 복구한다.
06실전 프롬프트
07이것만은 주의
무슨 일이 생기나 — 재시도 로직에 최대 횟수나 간격 제한이 없으면, 계속 실패하는 요청을 무한정 다시 시도하며 API 호출 수와 비용이 순식간에 늘어난다.
대처 — 최대 재시도 횟수와 재시도 간 최소 간격을 반드시 정해두고, 사용량 알림을 함께 설정한다(13절 공통 유의사항 '비용 방치' 참조).
무슨 일이 생기나 — 배치 3개 중 2개까지 DB에 반영된 상태에서 스크립트가 멈추면, 시트와 DB가 서로 다른 상태로 남아 다음 실행에서 어디까지 됐는지 헷갈린다.
대처 — 처리한 위치(커서)를 매 배치가 끝날 때마다 기록해, 재실행 시 그 지점부터 이어가게 만든다. 커서 없이 처음부터 다시 돌리면 데이터가 중복 반영될 수 있다.
무슨 일이 생기나 — 시트에 열이 하나 추가되거나 순서가 바뀌면, 열 위치(A열, B열)로 데이터를 읽는 코드는 에러도 없이 조용히 잘못된 값을 옮긴다. 한참 뒤에야 데이터가 이상하다는 걸 알게 된다.
대처 — 열 이름 기준으로 데이터를 찾도록 만들고, 실행 전 구조 점검 단계에서 기대한 열이 모두 있는지 확인한다.
무슨 일이 생기나 — 성공/실패 판단 조건을 잘못 설정하면 정상 실행에도 실패 알림이 계속 오거나, 반대로 진짜 실패했을 때도 알림이 안 와 무용지물이 된다.
대처 — 알림 연결 직후 성공 케이스와 실패 케이스를 각각 한 번씩 의도적으로 만들어보고, 원하는 경우에만 알림이 오는지 눈으로 확인한다.
무슨 일이 생기나 — 배치·재시도·스키마 검증 로직을 실제 업무 시트나 운영 DB에 바로 테스트하면, 로직에 버그가 있을 때 실제 데이터가 중복되거나 훼손될 수 있다.
대처 — 사본 시트와 테스트용 DB 테이블(또는 별도 스키마)에서 먼저 전체 흐름을 검증한 뒤 운영 데이터에 연결한다(13절 공통 유의사항 '원본 데이터 파괴' 참조).
08자가 점검
09과제
자신의 실제 업무 시트(또는 03차시에서 다룬 프로젝트의 데이터)와 데이터베이스 테이블 하나를 골라, 이번 실습과 같은 흐름(동기화 설계 → 배치 처리 → 재시도 → 스키마 검증 → 실패 알림)을 갖춘 파이프라인을 만든다. 실제로 붙일 DB가 없다면 Supabase에 테스트용 테이블을 새로 만들어 실습해도 된다.
제출 형식 — ① 파이프라인 코드가 담긴 저장소 링크 ② 대량 데이터 처리(배치) 실행 로그 캡처 ③ 강제로 실패시켜 알림이 도착한 스크린샷 ④ 스키마 변경 시나리오 테스트 결과를 하나의 문서로 정리해 제출한다.
10더 알아보기
- Supabase 배치/벌크 삽입 문서 — 대량 행을 한 번에 삽입·업서트하는 방법 확인용
- 사용 중인 외부 API의 레이트 리밋 정책 문서 — 재시도 간격과 최대 호출 수를 정할 때 기준으로 확인
- 증분 동기화(Incremental Sync)
- — 전체 데이터를 매번 다시 옮기지 않고, 마지막 동기화 이후 바뀐 데이터만 옮기는 방식.
- 지수 백오프(Exponential Backoff)
- — 재시도할 때마다 대기 시간을 점점 늘려가며 다시 시도하는 재시도 전략.
- 스키마 검증(Schema Validation)
- — 데이터를 처리하기 전에 기대한 구조(열 이름, 컬럼 등)와 실제 구조가 일치하는지 확인하는 단계.
다음 차시 예고 — 다음 차시에서는 오늘처럼 반복해서 쓰는 작업 흐름을 커스텀 슬래시 커맨드와 스킬로 패키징해, 다음에는 매번 프롬프트를 새로 쓰지 않고도 같은 품질로 재사용하는 법을 다룹니다.