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 ํธ์ถ์ ํตํด ์คํ์ํฌ ์ ์์ต๋๋ค.