EP26. Supabase Edge Functions Batch
1. 배치 작업이란
배치 작업은 대량의 데이터를 일정한 간격으로 자동 처리하거나 주기적으로 실행되는 작업을 말합니다. 이 작업은 보통 사용자 개입 없이 예약된 시간에 실행되며, 데이터 변환, 보고서 생성, 시스템 백업, 정기적인 데이터베이스 정리 같은 작업에 사용됩니다. 배치 작업은 시스템 성능 최적화와 일관된 데이터 처리, 반복 작업의 자동화를 목적으로 합니다.
1.
데이터 백업: 매일 자정에 데이터베이스의 모든 데이터를 백업하여 외부 저장소에 저장합니다.
2.
보고서 생성: 매주 월요일 아침에 지난 주의 판매 데이터를 분석하여 보고서를 생성하고 이메일로 전송합니다.
3.
시스템 로그 정리: 매일 새벽에 시스템 로그 파일을 압축하고 오래된 로그 파일을 삭제합니다.
4.
데이터베이스 정리: 매월 말에 중복 데이터나 불필요한 데이터를 정리하여 데이터베이스의 성능을 유지합니다.
2. Supabase Edge Functions에서의 배치
아쉽게도(?) Supbase Edge Functions에서 자체적으로 배치 기능을 제공하지 않습니다만. PostgreSQL 플러그인을 활용해 배치 기능을 구현할 수 있습니다.
•
pg_cron: 주기적으로 PostgreSQL 함수를 호출합니다
•
pg_net: PostgreSQL에서 네트워크 요청을 할 수 있도록 지원합니다.
•
Edge functions: 주기적으로 실행할 함수를 구현합니다.
위 3가지 기능을 조합하면?
주기적으로 호출하는 PostgreSQL에서 Edge Functions로 네트워크 요청을 보낼 수 있다 ⇒ Edge Functions 함수를 주기적으로 실행시킬 수 있다 ️
3. 배치 function 추가
supabase functions new batch
Bash
복사
batch라는 이름의 functions를 추가합니다.
앞으로 배치 작업이 필요한 내용들은 batch function 내에 추가합니다.
supabase/functions/batch 디렉토리가 생성되며 기본 index.ts 파일도 함께 생성됩니다.
index.ts 파일을 수정하겠습니다.
import { Hono } from "https://deno.land/x/hono/mod.ts";
import { enqueuePushNotification } from "../push/enqueuePushNotification.ts";
// Hono 인스턴스를 생성하여 애플리케이션을 설정합니다.
const app = new Hono();
// 스케줄 작업을 등록합니다. 작업은 endpoint로 구분됩니다.
app.get("/job-a", async (c) => {
// TODO: 배치 작업을 수행합니다. 예시) 푸시 알림 발송
await enqueuePushNotification({
userId: "",
title: "배치작업",
body: "job-a",
});
return c.json("ok");
});
app.get("/job-b", async (c) => {
// TODO: 배치 작업을 수행합니다. 예시) 푸시 알림 발송
await enqueuePushNotification({
userId: "",
title: "배치작업",
body: "job-b",
});
return c.json("ok");
});
// 애플리케이션을 시작하여 요청을 수신합니다.
Deno.serve(app.fetch);
TypeScript
복사
index.ts에는 다양한 배치작업을 추가할 수 있으며, 작업은 endpoint로 구분합니다. 추후 postgreSQL에서 주기적으로 위 endpoint로 API를 호출하여 작업이 수행되도록 합니다.
예시로 이전 강의에서 구현했던 푸시 알림 기능을 이용해 주기적으로 푸시알림을 발송해보도록 하겠습니다.
userId에는 푸시 수신할 유저의 userId로 변경해서 사용해주세요.
4. Batch 함수 배포
bash deploy.sh
TypeScript
복사
배포 스크립트로 batch function 을 배포합니다.
supabase 콘솔에서 배포된 함수 정보를 확인할 수 있습니다.
5. pg_net extension 설정
4번 과정에서 2개의 배치작업을 생성했으며 각각의 작업은 API 호출을 통해 실행시킬 수 있습니다.