보낼지 판단은 Supabase,
배송은 Firebase
스마트폰에 알림 하나 띄우려는데 DB, 스케줄러, 비밀값 금고, 푸시 배송 서버까지 여러 곳에 흩어져 있어 복잡하셨나요? 업무 장부와 알람 시계, 배송 기사의 비유로 파이프라인을 한눈에 정리합니다.
“핵심은 명확합니다.
보낼지 판단하는 건 Supabase, 스마트폰까지 전달하는 건 Firebase예요. 데이터를 Firebase로 옮긴 것이 아니라, 순수 푸시 배송망(FCM)만 연결한 것입니다.”
휴대폰 알림 하나 띄우는데 왜 여러 곳이 필요할까?
모바일 앱에서 푸시 알림을 구현할 때 가장 처음 맞닥뜨리는 혼란은 설정 파일과 서비스가 여러 곳에 파편화되어 있다는 점입니다. 앱 코드(Android), 데이터베이스(Supabase DB), 예약 실행 스케줄러(pg_cron), 서버리스 함수(Edge Function), 비밀값 저장소(Vault), 그리고 Firebase(FCM)까지 각각 무엇을 맡고 있는지 연결 고리를 이해하지 못하면 작은 설정 오류에도 길을 잃기 쉽습니다.
이 시스템은 실생활의 업무 처리 과정에 빗대어 보면 아주 자연스럽습니다. 업무 장부에 기록이 쌓이고, 매분 울리는 알람 시계가 직원을 깨우며, 직원은 지금 당장 알림을 보내도 되는지 4가지 조건을 꼼꼼히 따진 뒤, 최종 승인된 건만 전문 배송 기사에게 건네어 스마트폰으로 배달하는 흐름입니다.
푸시 알림 6대 구성 요소 & 아키텍처 맵
Edge Function
영역: Supabase 서버
주요 역할
지금 누구에게 어떤 알림을 보낼지 4대 조건(알림ON, 방해금지, 미완료, 일일한도)을 검사해 발송을 판단
관련 키 및 비밀값
NOTIFICATION_CRON_SECRET, Firebase 서비스 계정 키
실제로 알림이 날아가는 5단계 여정
예를 들어 상대방 가족 구성원이 WeRoutine 앱에서 나에게 '설거지'할 일을 배정했다고 해보겠습니다.
- 장부 적재: 상대방이 작업을 추가하면 Supabase DB에 작업 레코드와 알림 후보가 저장됩니다.
- 알람 시계 발동: pg_cron 자동 실행이 매분 알림 담당 직원(Edge Function)을 깨웁니다.
- 직원의 조건 검증: 알림을 켜둔 사용자인가? 지금 방해금지(수면) 시간은 아닌가? 이미 완료한 작업은 아닌가? 최근에 너무 자주 알렸거나 하루 한도를 넘지는 않았나?
- 배송 요청: 보낼 때가 되었다면 여러 작업을 묶어 Firebase FCM에 발송을 요청합니다.
- 스마트폰 도착: FCM이 등록된 휴대폰으로 신호를 전달하고 화면에 알림이 표시됩니다.
인터랙티브 파이프라인 시뮬레이터: 설거지 알림은 어떻게 도착할까?
시뮬레이션 조건 변경 (사용자 상태 가상 설정)
알림 ON
낮 14:00 (주간)
미완료 (할 일)
한도 여유 (정상)
DB 장부 기록
담당: Supabase DB
상대방이 나에게 '설거지' 할 일을 새로 등록했습니다. Supabase tasks 테이블에 작업 레코드가 생성되고 알림 후보가 대기합니다.
자동 실행 SQL은 무엇을 예약한 걸까?
배포 과정에서 실행했던 setup_household_notifications.sql은 데이터베이스에게 다음과 같은 정기 시간표를 등록한 것입니다.
-- 매분 household-notifications 함수를 호출하도록 예약
SELECT cron.schedule('household-notifications-every-minute', '* * * * *', ...);
여기서 pg_cron은 시간표를 지키는 스케줄러이고, pg_net은 Edge Function의 HTTP 인터넷 주소로 비동기 호출 요청을 쏘아주는 통신 도구입니다.
자주 묻는 질문: 매분 실행되면 사용자 휴대폰 배터리가 닳지 않나요?
전혀 그렇지 않습니다. 매분 실행된다는 것은 매분 휴대폰에 알림을 쏜다는 뜻이 아니라, 클라우드 서버 안에서 장부를 1분마다 살짝 훑어본다는 뜻입니다. 조건이 맞지 않으면(예: 밤 11시 30분 방해금지 시간이거나 완료된 일) 서버는 조용히 종료되며 휴대폰에는 아무런 통신도 일어나지 않습니다. 조건이 부합할 때만 단 한 번 FCM을 통해 푸시가 날아갑니다.
Vault는 왜 필요한가? (비밀값 금고)
Supabase Edge Function은 인터넷에 공개된 URL 주소를 가지고 있습니다. 만약 아무런 방어벽이 없다면, 악의적인 사용자가 해당 주소를 무한정 새로고침하여 우리 서버의 실행 요금을 낭비시키거나 비정상적인 푸시를 유발할 수 있습니다.
따라서 서버끼리만 아는 '비밀 암호(출입증)'를 주고받아야 합니다. 이번에 Supabase Vault 금고에 보관한 값은 두 가지입니다.
어디로 호출할지 지정하는 Edge Function의 배포 주소입니다.
정당한 내부 자동 실행인지 확인하는 비밀 토큰입니다. 이 값이 일치하지 않는 외부 호출은 즉시 차단됩니다.
자동 실행(Cron)은 DB 금고(Vault)에서 이 두 값을 안전하게 꺼내어 Edge Function을 호출하고, Edge Function은 들어온 요청 헤더의 비밀값이 맞는지 확인한 뒤에만 안심하고 조건 검사를 시작합니다.
왜 비밀키가 이렇게 여러 개일까?
개발을 진행하다 보면 google-services.json, FCM 기기 토큰, Firebase 서비스 계정 비밀키, NOTIFICATION_CRON_SECRET, Supabase 액세스 토큰까지 수많은 키가 등장합니다. 이것은 번거롭게 하려는 것이 아니라, 인증하는 구간과 책임이 서로 다르기 때문입니다.
왜 비밀키가 이렇게 여러 개일까? 인증 구간별 5대 키 지도
인증 구간: Android 앱 ↔ Firebase 프로젝트
보관 위치: Android 앱 코드베이스 (app/)
앱이 어느 Firebase 프로젝트에 연결되는지 알려주는 공개 구성 파일
인증 구간: 특정 휴대폰 단말 ↔ Firebase FCM
보관 위치: 휴대폰 발급 → Supabase DB fcm_tokens 저장
어느 스마트폰 앱 설치본으로 알림을 보낼지 지정하는 고유 배송 주소
인증 구간: Supabase Edge Function ↔ Google FCM API
보관 위치: Supabase Edge Function Secrets (서버 환경변수)
우리 알림 서버가 Google FCM에 '푸시 알림을 발송해줘'라고 명령할 수 있는 마스터 자격
인증 구간: pg_cron (DB Vault) ↔ Edge Function
보관 위치: Supabase Vault & Edge Function Secret
자동 실행이 Edge Function을 깨울 때 정당한 내부 호출인지 증명하는 출입증
인증 구간: 개발자 로컬 터미널 ↔ Supabase Cloud
보관 위치: 개발자 PC 환경변수 / CI 빌드 환경
개발자가 터미널에서 함수를 배포하고 데이터베이스 마이그레이션을 실행하는 자격
현재 상태와 최종 검증 로드맵
현재 WeRoutine의 알림 파이프라인은 데이터베이스 구조 설계와 Edge Function 배포를 완료하고, 서버 테스트 31개를 무사히 통과한 탄탄한 상태입니다. 이제 실제 스마트폰에서 팝업이 뜨는 마지막 단계까지 연결을 검증할 차례입니다.
실제 스마트폰 수신까지의 검증 단계
설정은 대부분 최초 1회만 진행하며, 아래 순서대로 검증을 마치면 전체 파이프라인이 완성됩니다.
오늘의 학습 정리
- 보낼지 판단하는 건 Supabase(장부 + 조건 검사 직원), 배달하는 건 Firebase(FCM 기사)다.
- 매분 실행(Cron)은 매분 알림을 보내는 것이 아니라 매분 조건을 검사할 뿐이다.
- Vault는 외부에 열린 함수 URL을 내부에서 안전하게 호출하기 위한 비밀값 금고다.
- 비밀키는 인증 구간마다 다르며, Firebase 서비스 계정 키는 절대 앱(APK)에 넣지 않는다.
- 설정은 최초 한 번이며, 이후에는 앱 알림 옵션과 일상 업무 등록만으로 매끄럽게 돌아간다.
읽으며 참고한 공식 기술 자료
- Firebase Cloud Messaging Architecture 공식 안내
앱 서버, FCM 백엔드, 클라이언트 기기 간의 3자 푸시 배송 아키텍처 및 HTTP v1 명세를 참고했습니다. - Supabase Schedule Functions (pg_cron + pg_net) 공식 가이드
PostgreSQL 데이터베이스 내에서 크론 스케줄로 Edge Function을 비동기 호출하는 모범 패턴을 확인했습니다. - Supabase Database Vault 공식 안내
환경 변수와 API 호출용 토큰을 암호화하여 DB 레벨에서 안전하게 주입하는 메커니즘을 참고했습니다.