lifecarelog
프론트엔드

Supabase Free 7일 잠듦과 무한 스피너, Cron keepalive

Supabase 무료 프로젝트는 7일 비활동이면 멈춰요. Cloudflare Workers Cron으로 깨워 두는 법과, 잠든 서버를 만난 화면이 무한 로딩 대신 보여줄 것을 정리했어요.

6분 읽기

주말에만 쓰는 앱을 만들어 본 적 있나요? 플랜비 같은 농구 동호회 매니저가 딱 그래요. 경기 있는 날만 회비랑 출전 명단을 확인하니까 평일엔 아무도 안 들어와요. 그런데 Supabase Free 프로젝트는 7일 동안 요청이 없으면 일시정지 상태로 들어가요. 월요일에 멈추고 다음 주 일요일에 열면 딱 걸리는 계산이죠.

이 문제를 저는 백엔드가 아니라 화면에서 먼저 알았어요. 로그인 버튼을 눌렀는데 스피너가 안 끝났거든요. 콘솔을 열어 보니 REST 요청이 응답 없이 매달려 있었고, 대시보드에 들어가 보니 프로젝트가 잠들어 있었어요. 잠든 프로젝트는 요청이 온다고 스스로 깨지 않아요. 대시보드에서 직접 복구를 눌러야 해요. 그러니까 화면 쪽 일과 인프라 쪽 일이 따로 있어요.

화면 먼저: 무한 스피너는 버그예요

잠든 서버를 만난 사용자가 보는 건 로딩 애니메이션 하나예요. 아무 정보도 없죠. 직접 고쳐 보니 세 가지면 충분했어요.

  • 8초 타임아웃
  • 상황→원인→해결 순서의 에러 문구
  • 재시도 버튼과 에러 리포트

fetch에 AbortSignal.timeout을 걸면 라이브러리 없이 끝나요.

const res = await fetch(url, { signal: AbortSignal.timeout(8_000) });

8초를 넘기면 TimeoutError가 던져지고, 그걸 잡아서 "지금 데이터를 불러오지 못했어요. 서버가 잠시 멈춰 있는 것 같아요. 잠시 후 다시 시도해 주세요" 같은 문구로 바꿔요. 상황, 원인, 해결 순서예요. 재시도 버튼 옆에는 에러 리포트를 붙여서 저한테 알림이 오게 했어요. 사용자는 못 깨워도 저는 깨울 수 있으니까요. 테스트해 보면 스피너 대신 문구가 뜨는 것만으로도 앱이 죽은 게 아니라는 인상을 줘요.

인프라: 하루 한 번 노크하는 Worker

근본 해결은 잠들지 않게 하는 거예요. Cloudflare Workers의 Cron Trigger로 하루 1번 가벼운 SELECT를 보내면 7일 타이머가 계속 리셋돼요.

Cron 발화Worker가 REST 한 번 호출Supabase에 활동 기록7일 타이머 리셋

파일은 2개예요. Worker 스크립트 하나, wrangler 설정 하나. keepalive는 행 하나짜리 테이블이고 RLS로 anon 읽기만 열어 뒀어요.

export default {
  async scheduled(_event, env, ctx) {
    ctx.waitUntil(
      fetch(`${env.SUPABASE_URL}/rest/v1/keepalive?select=id&limit=1`, {
        headers: { apikey: env.SUPABASE_ANON_KEY },
      }),
    );
  },
};
[triggers]
crons = ["0 18 * * *"]

키는 wrangler secret put으로 넣어요. 설정 파일에 적으면 저장소에 남으니까요. 18시인 건 Cron이 UTC 기준이라서예요. 한국 시간으로 새벽 3시에 돌아요. 처음 돌려 보니 이걸 몰라서 예상보다 9시간 늦게 발화해 잠깐 헷갈렸어요.

비용은 사실상 0이에요. Workers 무료 플랜이 하루 10만 회 요청, 호출당 CPU 10ms까지 허용하는데 우리는 하루 1번 쓰니까요. 적용해 봤더니 설정부터 첫 발화 확인까지 15분 정도 걸렸어요.

솔직한 한계

keepalive는 Supabase가 권하는 공식 방법이 아니에요. 사용자가 실제로 붙기 시작하면 유료 플랜이 맞고, 이건 사이드 프로젝트가 잠들어 첫 방문자를 놓치지 않게 하는 임시 장치예요. 그리고 Worker가 조용히 죽으면 아무도 몰라요. 그래서 성공했을 때만 별도 기록을 남기고, 하루 넘게 기록이 없으면 알림이 오게 해 뒀어요. 화면의 타임아웃 처리는 이 장치가 실패했을 때의 마지막 안전망이고요.

#Supabase#Cloudflare Workers#프론트엔드 에러 처리

라이프케어로그 서비스가 궁금하신가요?

AI 기반 건강·일정·재활 관리 앱을 직접 써보세요.

서비스 살펴보기

관련 글

댓글

아직 댓글이 없어요. 첫 댓글을 남겨주세요.