Supabase Edge Functions와 PostgreSQL 트리거를 활용한 실시간 알림 파이프라인 구축 가이드
비동기 데이터 변경 감지부터 슬랙·웹훅 전송까지, 엔터프라이즈 급 실무 아키텍처 완전 정복
이지웍스랩 AI리서치 · 2026-08-16 · B2B 업무 자동화 · 읽는 데 8분
현대 B2B SaaS 환경에서 실시간 알림은 고객 경험과 운영 효율성을 좌우하는 핵심 기능입니다. 전통적인 주기적 조회(Polling) 방식은 불필요한 DB 부하를 유발하고 응답 지연을 야기합니다. 본 아티클에서는 Supabase Edge Functions와 PostgreSQL 트리거를 완벽하게 연동하여 이벤트 발생 즉시 외부 웹훅으로 데이터를 밀어넣는(Push) 차세대 실무 파이프라인 구축법을 제시합니다.
1. 실시간 아키텍처 설계와 pg_net 확장 활용
PostgreSQL 데이터베이스 내부에서 직접 외부 HTTP 요청을 발생시키기 위해서는 `pg_net` 확장이 필수적입니다. 데이터의 변경(INSERT, UPDATE 등)이 감지되면 트리거 함수가 실행되고, 이 함수 내부에서 `pg_net`을 통해 Supabase Edge Functions의 엔드포인트를 비동기로 호출합니다.
이 방식은 별도의 미들웨어 서버를 구축·유지보수할 필요가 없으며, DB 트랜잭션과 밀접하게 연동되어 데이터 유실 없는 안정적인 알림 전송을 보장합니다. 특히 MSA 구조에서 각 마이크로서비스 간 느슨한 결합(Loose Coupling)을 유지하는 데 탁월한 효과를 발휘합니다.
2. PostgreSQL 트리거와 Deno 기반 Edge Functions 구현
실제 구현을 위해 먼저 데이터베이스에 트리거 함수를 생성하고, 이를 받아 처리할 Deno 런타임 기반의 Supabase Edge Function을 작성합니다. 아래 코드는 주문 상태 변경 시 슬랙(Slack)으로 알림을 전송하는 파이프라인의 핵심 로직입니다.
TypeScript로 작성된 Edge Function은 전달받은 페이로드의 무결성을 검증하고, 필요한 서식을 갖추어 외부 웹훅 API로 안전하게 포워딩합니다.
import { serve } from "https://deno.land/std@0.168.0/http/server.ts"
interface WebhookPayload {
type: 'INSERT' | 'UPDATE';
table: string;
record: Record<string, any>;
old_record?: Record<string, any>;
}
serve(async (req) => {
try {
const payload: WebhookPayload = await req.json();
const { table, record, type } = payload;
if (table === 'orders' && type === 'INSERT') {
const slackWebhookUrl = Deno.env.get('SLACK_WEBHOOK_URL');
if (!slackWebhookUrl) throw new Error('Slack Webhook URL is not configured');
const message = {
text: `[신규 주문 접수] 주문번호: ${record.id}, 금액: ${record.total_amount}원`
};
const response = await fetch(slackWebhookUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(message),
});
if (!response.ok) {
throw new Error(`Failed to send slack notification: ${response.statusText}`);
}
}
return new Response(JSON.stringify({ success: true }), { headers: { 'Content-Type': 'application/json' } });
} catch (error) {
return new Response(JSON.stringify({ error: error.message }), { status: 400, headers: { 'Content-Type': 'application/json' } });
}
});
3. 전통적 폴링 방식과의 성능 비교 및 기대 효과
기존의 클라이언트 폴링 방식이나 별도 데몬 서버 방식과 비교했을 때, Supabase Edge Functions + PostgreSQL 트리거 조합은 인프라 비용과 응답 속도 면에서 압도적인 우위를 점합니다. 서버리스 아키텍처를 활용하므로 트래픽이 없을 때는 비용이 발생하지 않으며, 이벤트 주도형(Event-Driven) 구조로 인해 실시간성이 극대화됩니다.
| 비교 항목 | 전통적 폴링 방식 | Supabase 실시간 파이프라인 |
|---|---|---|
| 서버 유지비용 | 24시간 인스턴스 상시 가동 비용 발생 | 서버리스 기반 사용량 과금 (비용 최소화) |
| 알림 지연 시간 | 수 초 ~ 수 분 (폴링 주기에 종속) | 150ms 이내 실시간 전송 |
| DB 부하 | 주기적인 SELECT 쿼리로 인한 부하 가중 | 이벤트 발생 시에만 트리거 작동 |
자주 막히는 지점
PostgreSQL 트리거 실행 시 네트워크 타임아웃 오류(pg_net timeout) 발생
원인: 외부 웹훅 서버의 응답 지연이나 불안정한 네트워크 상태로 인해 pg_net이 기본 대기 시간을 초과함
해결: pg_net 호출 시 타임아웃 파라미터를 명시적으로 설정하고, 실패한 요청을 처리할 수 있는 Dead Letter Queue(DLQ) 테이블 구조를 함께 설계합니다.
Edge Function에서 인증되지 않은 임의의 HTTP 요청을 수신하는 보안 이슈
원인: Supabase 기능 엔드포인트가 공개되어 있어 시크릿 토큰 검증 로직이 누락된 경우
해결: Authorization 헤더에 Supabase 서비스 롤 키 또는 커스텀 HMAC 서명을 검증하는 미들웨어 로직을 추가하여 방어합니다.
핵심 요약
- PostgreSQL의 pg_net 확장을 이용하면 미들웨어 서버 없이 DB 내부에서 직접 비동기 외부 API 호출이 가능합니다.
- Supabase Edge Functions(Deno)는 뛰어난 확장성과 빠른 콜드스타트 성능을 제공하여 실시간 알림 처리에 최적화되어 있습니다.
- 프로덕션 환경 구축 시 토큰 검증, 타임아웃 제어, 실패 대응(DLQ) 가드레일을 반드시 함께 구현해야 합니다.
자주 묻는 질문
Q1. Supabase 무료 플랜에서도 pg_net과 Edge Functions를 사용할 수 있나요?
A1. 네, Supabase 무료 플랜(Free Tier)에서도 기본적으로 Edge Functions와 pg_net 확장을 지원하여 소규모 프로젝트나 PoC 단계에서 충분히 테스트할 수 있습니다.
Q2. 대량의 데이터가 한 번에 변경될 때(Bulk Update) 알림 폭탄이 발생하지 않나요?
A2. 대량 변경 시에는 개별 레코드마다 트리거가 호출되어 웹훅이 급증할 수 있습니다. 이를 방지하려면 DB 레벨에서 큐 테이블을 두고 일정 단위로 묶어서 처리(Batching)하거나 엣지 함수 내에서 레이트 리미팅을 구현해야 합니다.
Q3. 슬랙 외에 잔디(Jandi), 네이버웍스, 팀즈 등 다른 협업 툴 연동도 동일한 방식으로 가능한가요?
A3. 네, 그렇습니다. Edge Function 내부에서 각 메신저 서비스가 요구하는 페이로드 규격(JSON 스키마)에 맞춰 변환만 해주면 슬랙뿐만 아니라 사내 메신저나 외부 CRM API 어디든 손쉽게 연동할 수 있습니다.