Skip to content

Supabase Edge Function 생성 패턴 ​

Claude Code로 Supabase Edge Function을 생성할 때, Deno 런타임 환경과 배포 방식을 명확히 명시하지 않으면 Node.js 스타일로 작성해버립니다. 제약 조건을 프롬프트에 명시하는 것이 핵심입니다.


Edge Function이란? ​

Supabase Edge Function은 Deno 런타임 위에서 실행되는 서버리스 함수입니다. Node.js와 다른 점이 있습니다.

Node.jsSupabase Edge Function (Deno)
import 방식require() 또는 ESMESM만 사용 (import)
패키지npmURL import 또는 npm: prefix
Supabase 클라이언트@supabase/supabase-jsnpm:@supabase/supabase-js
환경 변수process.envDeno.env.get()

📋 Prompt Template — 기본 Edge Function 생성 ​

Supabase Edge Function을 작성해줘.

[기능 설명]
- [여기에 기능 설명]

[기술 스택 및 제약 조건]
- Deno 런타임 환경 (Node.js가 아님)
- import는 ESM 방식만 사용
- Supabase 클라이언트: npm:@supabase/supabase-js
- 환경 변수 접근: Deno.env.get('변수명')
- 파일 위치: supabase/functions/[함수명]/index.ts
- CORS 헤더 포함 (OPTIONS 메서드 처리)
- 에러 응답은 항상 JSON 형태로 반환

[반환 형식]
- 성공: { data: ..., error: null }
- 실패: { data: null, error: "에러 메시지" }

📋 Prompt Template — OpenAI 연동 Edge Function (타이핑룸 기준) ​

OpenAI API를 호출하는 Supabase Edge Function을 작성해줘.

[기능 설명]
- [여기에 기능 설명]

[기술 스택 및 제약 조건]
- Deno 런타임, ESM import
- OpenAI 클라이언트: npm:openai
- OpenAI API 키: Deno.env.get('OPENAI_API_KEY')
- Supabase 클라이언트: npm:@supabase/supabase-js
- 인증: Authorization 헤더의 JWT를 Supabase로 검증
- 파일 위치: supabase/functions/[함수명]/index.ts
- 스트리밍 응답이 필요하면 ReadableStream 사용

✅ 좋은 예시 vs ❌ 나쁜 예시 ​

❌ 나쁜 예시 — Deno 환경 명시 없음

"유저 ID를 받아서 문장을 생성하는 Edge Function 만들어줘."

→ Claude가 process.env, require(), Node.js 스타일로 작성해서 배포 시 오류 발생

✅ 좋은 예시 — 환경 명시

"Deno 런타임 기반 Supabase Edge Function을 작성해줘.
- 요청 body에서 userId를 받아서 users 테이블에서 정보 조회
- Supabase 클라이언트: npm:@supabase/supabase-js
- 환경 변수: Deno.env.get('SUPABASE_URL'), Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')
- 파일 위치: supabase/functions/get-user/index.ts"

CORS 처리 (필수 보일러플레이트) ​

Claude에게 CORS를 포함하라고 하면 아래 구조로 작성해줍니다. 프리플라이트 요청(OPTIONS)을 놓치는 경우가 많으므로 반드시 명시하세요.

typescript
const corsHeaders = {
  'Access-Control-Allow-Origin': '*',
  'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type',
}

Deno.serve(async (req) => {
  // OPTIONS 요청 처리 (CORS preflight)
  if (req.method === 'OPTIONS') {
    return new Response('ok', { headers: corsHeaders })
  }

  // 실제 로직
  // ...
})

배포 & 테스트 ​

bash
# 로컬 테스트
supabase functions serve [함수명] --env-file .env.local

# 배포
supabase functions deploy [함수명]

# 로그 확인
supabase functions logs [함수명]

Claude Code에게 테스트까지 맡기려면:

"방금 만든 Edge Function을 로컬에서 테스트하는 curl 명령어도 같이 작성해줘."

CLAUDE.md에 공통 규칙 등록하기 ​

markdown
## Supabase Edge Function 규칙
- 런타임: Deno (Node.js가 아님)
- import: ESM 방식, npm: prefix 사용 (예: npm:@supabase/supabase-js)
- 환경 변수: Deno.env.get() 사용 (process.env 금지)
- 파일 위치: supabase/functions/[함수명]/index.ts
- 모든 함수에 CORS 처리 포함 (OPTIONS 메서드)
- 응답 형식: { data: ..., error: ... }

→ 프론트엔드 훅 패턴은 frontend-hooks.md 참고

PR 환영합니다 ✦