Supabase는 Firebase에 대한 강력한 오픈 소스 대안으로 급속히 자리 잡았으며, PostgreSQL 데이터베이스를 기반으로 한 도구 모음을 개발자에게 제공합니다. Supabase의 핵심은 데이터베이스 위에 즉각적이고 실시간 API 레이어를 제공하여 백엔드 개발을 크게 가속화하는 것입니다. 이 가이드는 Supabase API를 활용하는 방법에 대한 포괄적인 개요를 제공하며, 초기 설정 및 기본 작업부터 보안, 사용자 정의 및 타입 안전성까지 모든 것을 다룹니다.
개발 팀이 함께 협력할 수 있는 통합된 올인원 플랫폼이 필요하신가요? 최대 생산성를 위해요?
Apidog는 모든 요구를 충족시키고, Postman을 훨씬 저렴한 가격에 대체합니다!

1. 소개: Supabase API란 무엇인가요?
전통적인 백엔드 개발에서는 데이터베이스와 상호작용하기 위해 REST 또는 GraphQL 엔드포인트를 구축하는 데 상당한 시간을 소모할 수 있지만, Supabase는 안전하고 성능이 뛰어난 API를 자동으로 생성해 줍니다. Supabase PostgreSQL 데이터베이스에 테이블을 생성할 때, Supabase는 오픈 소스 도구인 PostgREST를 사용하여 데이터베이스 스키마를 탐색하고 해당하는 RESTful 엔드포인트를 제공합니다.
주요 이점:
- 즉각적인 백엔드: 데이터베이스 스키마를 정의하는 즉시 기능적인 API 엔드포인트를 받을 수 있습니다.
- 실시간 기능: WebSockets를 통해 데이터베이스 변경 사항을 구독할 수 있습니다.
- PostgreSQL 기반: Row Level Security (RLS)와 같은 기능을 포함해 PostgreSQL의 힘, 유연성 및 성숙함을 활용할 수 있습니다.
- 여러 상호작용 방법: REST, GraphQL(커뮤니티 지원) 또는 Supabase의 클라이언트 라이브러리(JavaScript, Python, Dart 등)를 통해 상호작용할 수 있습니다.
- 확장성: 복잡한 논리나 통합을 위해 사용자 정의 서버리스 함수(Edge Functions)를 생성할 수 있습니다.
이 가이드는 주로 REST API와 클라이언트 라이브러리를 통한 상호작용 및 Supabase Edge Functions에 중점을 둡니다.
2. Supabase API 시작하기
Supabase API를 이해하는 가장 쉬운 방법은 직접 해보는 것입니다. Supabase 프로젝트가 설정되어 있다고 가정해 보겠습니다(설정되지 않았다면, supabase.com에 방문하여 무료로 하나 생성하세요) 그리고 간단한 테이블, 예를 들어 profiles
를 생성했을 것입니다:
-- 공개 프로필을 위한 테이블 생성
create table profiles (
id uuid references auth.users not null primary key,
updated_at timestamp with time zone,
username text unique,
avatar_url text,
website text,
constraint username_length check (char_length(username) >= 3)
);
-- Row Level Security (RLS) 설정
-- 더 많은 세부사항은 https://supabase.com/docs/guides/auth/row-level-security 를 참조하세요.
alter table profiles
enable row level security;
create policy "모든 사람이 공개 프로필을 볼 수 있습니다." on profiles
for select using (true);
create policy "사용자는 자신의 프로필을 삽입할 수 있습니다." on profiles
for insert with check (auth.uid() = id);
create policy "사용자는 자신의 프로필을 업데이트할 수 있습니다." on profiles
for update using (auth.uid() = id);
-- 이 트리거는 사용자가 Supabase Auth를 통해 새로 가입할 때 자동으로 프로필 항목을 생성합니다.
-- 더 많은 세부사항은 https://supabase.com/docs/guides/auth/managing-user-data#using-triggers 를 참조하세요.
create function public.handle_new_user()
returns trigger as $$
begin
insert into public.profiles (id, username)
values (new.id, new.raw_user_meta_data->>'username');
return new;
end;
$$ language plpgsql security definer;
create trigger on_auth_user_created
after insert on auth.users
for each row execute procedure public.handle_new_user();
(참고: 위의 예제는 Supabase의 표준 예제와 일치하는 profiles
를 사용합니다. 이 개념은 todos
테이블이나 사용자가 만든 다른 테이블에도 동일하게 적용됩니다.)
API 자격 증명 찾기:
모든 Supabase 프로젝트는 고유한 API 자격 증명을 제공합니다:
- 프로젝트 URL: 고유한 Supabase 엔드포인트 (예:
https://<your-project-ref>.supabase.co
). - API 키: Supabase 프로젝트 대시보드의
Project Settings
>API
에서 찾을 수 있습니다.
anon
(공용) 키: 이 키는 클라이언트 측 애플리케이션 (브라우저나 모바일 앱 등)에서 사용하기에 안전합니다. Row Level Security (RLS)에 의존하여 데이터 엑세스를 제어합니다.service_role
키: 이 키는 RLS를 우회하여 전체 관리 권한이 있는 비밀 키입니다. 이 키를 클라이언트 측 코드에서 노출하지 마세요. 보안 서버 환경 (백엔드 서버나 서버리스 함수 등)에서만 사용하세요.
API와 상호작용하기 (Supabase JS 클라이언트 라이브러리 사용):
Supabase는 API 상호작용을 단순화하기 위한 클라이언트 라이브러리를 제공합니다. JavaScript 라이브러리(supabase-js
)를 사용하는 방법은 다음과 같습니다:
// 1. 클라이언트를 가져오고 초기화합니다.
import { createClient } from '@supabase/supabase-js'
const supabaseUrl = 'https://<your-project-ref>.supabase.co'
const supabaseAnonKey = '<your-anon-key>'
const supabase = createClient(supabaseUrl, supabaseAnonKey)
// 2. 데이터 가져오기 (SELECT *)
async function getProfiles() {
const { data, error } = await supabase
.from('profiles')
.select('*')
if (error) console.error('프로필 가져오기 오류:', error)
else console.log('프로필:', data)
}
// 3. 데이터 삽입 (INSERT)
async function createProfile(userId, username) {
const { data, error } = await supabase
.from('profiles')
.insert([
{ id: userId, username: username, updated_at: new Date() },
])
.select() // 삽입된 데이터 반환
if (error) console.error('프로필 생성 오류:', error)
else console.log('생성된 프로필:', data)
}
// 4. 데이터 업데이트 (UPDATE)
async function updateProfileUsername(userId, newUsername) {
const { data, error } = await supabase
.from('profiles')
.update({ username: newUsername, updated_at: new Date() })
.eq('id', userId) // id가 일치하는 경우에만 업데이트
if (error) console.error('프로필 업데이트 오류:', error)
else console.log('업데이트된 프로필:', data)
}
// 5. 데이터 삭제 (DELETE)
async function deleteProfile(userId) {
const { data, error } = await supabase
.from('profiles')
.delete()
.eq('id', userId) // id가 일치하는 경우에만 삭제
if (error) console.error('프로필 삭제 오류:', error)
// 참고: 삭제는 성공 시 최소한의 데이터를 반환하는 경우가 많습니다. 일부 버전/설정에서는 .select()를 .delete() 전에 사용해야 합니다.
else console.log('프로필이 성공적으로 삭제되었습니다.')
}
// 사용 예 (사용자 ID가 있다고 가정)
// getProfiles();
// createProfile('some-uuid-v4', 'new_user');
// updateProfileUsername('some-uuid-v4', 'updated_username');
// deleteProfile('some-uuid-v4');
이 빠른 시작 안내는 클라이언트 라이브러리를 사용하여 기본 CRUD (생성, 읽기, 업데이트, 삭제) 작업을 수행하는 방법을 보여줍니다. 이 작업은 내부에서 REST API를 호출합니다.
3. 자동 생성된 Supabase REST API
클라이언트 라이브러리는 편리하지만, PostgREST에 의해 생성된 기본 REST API를 이해하는 것은 중요합니다.
API 엔드포인트 구조:
REST API의 기본 URL은 일반적으로 다음과 같습니다: https://<your-project-ref>.supabase.co/rest/v1/
엔드포인트는 테이블에 대해 자동으로 생성됩니다:
GET /rest/v1/your_table_name
: 테이블에서 행을 검색합니다.POST /rest/v1/your_table_name
: 테이블에 새 행을 삽입합니다.PATCH /rest/v1/your_table_name
: 테이블의 기존 행을 업데이트합니다.DELETE /rest/v1/your_table_name
: 테이블에서 행을 삭제합니다.
인증:
API 요청에는 apikey
헤더에 API 키를 포함해야 하며, 보통 Authorization
헤더에 Bearer <your-api-key>
(클라이언트 측 요청을 위한 일반적인 anon
키 또는 서버 측용 service_role
키)를 포함해야 합니다.
apikey: <your-anon-or-service-role-key>
Authorization: Bearer <your-anon-or-service-role-key>
일반 작업 (일례로 curl
사용):
앞서 언급한 예제를 curl
을 사용하여 REST API에 직접 재현해 보겠습니다. 자리 표시자를 적절히 바꿉니다.
데이터 가져오기 (GET):
curl 'https://<ref>.supabase.co/rest/v1/profiles?select=*' \
-H "apikey: <anon-key>" \
-H "Authorization: Bearer <anon-key>"
데이터 삽입하기 (POST):
curl 'https://<ref>.supabase.co/rest/v1/profiles' \
-X POST \
-H "apikey: <anon-key>" \
-H "Authorization: Bearer <anon-key>" \
-H "Content-Type: application/json" \
-H "Prefer: return=representation" \# 선택 사항: 삽입된 행을 반환합니다. \
-d '{ "id": "some-uuid", "username": "rest_user" }'
데이터 업데이트하기 (PATCH): (username이 'rest_user'인 프로필 업데이트)
curl 'https://<ref>.supabase.co/rest/v1/profiles?username=eq.rest_user' \
-X PATCH \
-H "apikey: <anon-key>" \
-H "Authorization: Bearer <anon-key>" \
-H "Content-Type: application/json" \
-H "Prefer: return=representation" \
-d '{ "website": "https://example.com" }'
데이터 삭제하기 (DELETE): (username이 'rest_user'인 프로필 삭제)
curl 'https://<ref>.supabase.co/rest/v1/profiles?username=eq.rest_user' \
-X DELETE \
-H "apikey: <anon-key>" \
-H "Authorization: Bearer <anon-key>"
필터링, 선택, 정렬, 페이지네이션:
REST API는 URL 매개변수를 통한 강력한 쿼리를 지원합니다:
- 열 선택:
?select=column1,column2
- 필터링 (동등):
?column_name=eq.value
(예:?id=eq.some-uuid
) - 필터링 (기타 연산자):
gt
(크다),lt
(작다),gte
,lte
,neq
(같지 않다),like
,ilike
(대소문자 구분 없는 like),in
(예:?status=in.(active,pending)
) - 정렬:
?order=column_name.asc
또는?order=column_name.desc
(필요시.nullsfirst
또는.nullslast
추가) - 페이지네이션:
?limit=10&offset=0
(처음 10개 가져오기),?limit=10&offset=10
(다음 10개 가져오기)
자동 생성된 API 문서:
Supabase의 가장 유용한 기능 중 하나는 프로젝트 대시보드에서 직접 사용할 수 있는 자동 생성된 API 문서입니다.
- 당신의 Supabase 프로젝트로 이동하세요.
- 왼쪽 사이드바에서 API Docs 아이콘(보통
<>
처럼 보임)을 클릭하세요. - "Tables and Views" 아래에서 테이블을 선택하세요.
- 해당 테이블에 대한 REST 엔드포인트에 대한 자세한 문서를 확인할 수 있으며, 다음을 포함합니다:
- 예제 요청 (Bash/
curl
, JavaScript). - 사용 가능한 필터, 선택기 및 수정자.
- 열 및 데이터 유형의 설명.
이 상호작용 문서는 API 호출 구조를 이해하는 데 매우 유용합니다.
4. Supabase API를 사용한 향상된 개발을 위한 타입 생성
TypeScript 또는 기타 타입 언어를 사용하는 프로젝트의 경우, Supabase는 데이터베이스 스키마에서 직접 타입 정의를 생성하는 방법을 제공합니다. 이는 상당한 이점을 가져옵니다:
- 타입 안전성: 런타임이 아닌 컴파일 타임에 오류를 잡을 수 있습니다.
- 자동 완성: 코드 편집기에서 테이블 이름, 열 이름 및 함수 매개변수에 대한 지능형 제안을 받을 수 있습니다.
- 유지 관리 개선: 타입은 데이터 구조에 대한 살아있는 문서 역할을 합니다.
Supabase CLI를 사용한 타입 생성:
- Supabase CLI 설치:
https://supabase.com/docs/guides/cli
의 지침을 따르세요. - 로그인:
supabase login
- 프로젝트 연결:
supabase link --project-ref <your-project-ref>
(로컬 프로젝트 디렉토리에서 실행). 데이터베이스 비밀번호를 제공해야 할 수도 있습니다. - 타입 생성:
supabase gen types typescript --linked > src/database.types.ts
# 링크되지 않았거나 다른 컨텍스트에 있는 경우 프로젝트 ID를 지정하려면
# supabase gen types typescript --project-id <your-project-ref> > src/database.types.ts
이 명령은 연결된 Supabase 프로젝트의 데이터베이스 스키마를 검사하고 테이블, 뷰 및 함수 인수/반환 타입에 대한 인터페이스를 포함한 TypeScript 파일(database.types.ts
라는 이름의 파일)에 출력합니다.
생성된 타입 사용:
이 타입을 애플리케이션 코드에 가져올 수 있습니다:
import { createClient } from '@supabase/supabase-js'
// 생성된 타입을 가져옵니다.
import { Database } from './database.types' // 필요에 따라 경로 조정
const supabaseUrl = 'https://<your-project-ref>.supabase.co'
const supabaseAnonKey = '<your-anon-key>'
// createClient에 Database 타입 제공
const supabase = createClient<Database>(supabaseUrl, supabaseAnonKey)
// 이제 타입 안전성 및 자동 완성 기능을 제공합니다!
async function getSpecificUserProfile(username: string) {
// 테이블 이름 ('profiles') 자동 완성
const { data, error } = await supabase
.from('profiles')
// 열 이름 ('id', 'username', 'website') 자동 완성
.select('id, username, website')
// 값이 열 타입과 일치하는지 확인
.eq('username', username)
.single() // 단일 결과 또는 null을 기대합니다.
if (error) {
console.error('프로필 가져오기 오류:', error)
return null;
}
// 'data'는 이제 선택 쿼리에 따라 올바르게 타입이 지정됩니다.
if (data) {
console.log(`사용자 ID: ${data.id}, 웹사이트: ${data.website}`);
// console.log(data.non_existent_column); // <-- TypeScript 오류!
}
return data;
}
타입 생성을 통해 Supabase로 강력한 애플리케이션 개발에 꼭 필요한 작업입니다.
5. Edge Functions를 사용한 맞춤형 Supabase API 경로 생성
자동 생성된 REST API는 표준 CRUD 작업을 포함하고 있지만, 다음과 같은 맞춤형 서버 측 로직이 필요한 경우가 많습니다:
- 타사 서비스와 통합 (예: Stripe, Twilio).
- 복잡한 계산이나 데이터 집계 수행.
- 클라이언트에 키를 노출하지 않고 높은 권한(
service_role
키)을 요구하는 로직 실행. - 복잡한 비즈니스 규칙 적용.
Supabase Edge Functions는 Deno 기반 TypeScript 함수를 사용자 위치에 배포하여 사용자에게 가까이서 서비스를 제공합니다.
Edge Function 생성하기:
- 함수 초기화 (아직 하지 않았다면):
supabase functions new hello-world
(연결된 프로젝트 디렉토리에서 실행). 이는supabase/functions/hello-world/index.ts
파일을 생성합니다.
함수 코드를 작성하세요:
// supabase/functions/hello-world/index.ts
import { serve } from 'https://deno.land/std@0.177.0/http/server.ts' // 적절한 std 버전 사용
serve(async (req) => {
// 요청 헤더, 메서드, 본문 등에 접근할 수 있습니다. 'req'에서.
console.log(`받은 요청: ${req.url}`);
// 예시: 함수 내에서 Supabase DB에 접근하기
// 참고: 함수 내에서 Supabase 클라이언트를 설정해야 합니다.
// 비밀 정보를 위한 환경 변수를 사용하세요!
// import { createClient } from '@supabase/supabase-js'
// const supabaseAdmin = createClient(
// Deno.env.get('SUPABASE_URL') ?? '',
// Deno.env.get('SUPABASE_SERVICE_ROLE_KEY') ?? ''
// )
// const { data: users, error } = await supabaseAdmin.from('profiles').select('*').limit(10);
const data = {
message: `엣지에서 인사드립니다!`,
// users: users // 데이터 가져오는 예시
}
return new Response(
JSON.stringify(data),
{ headers: { 'Content-Type': 'application/json' } },
)
})
함수 배포:
supabase functions deploy hello-world --no-verify-jwt
# 공개적으로 접근 가능한 함수에 대해 --no-verify-jwt 사용
# 유효한 Supabase Auth JWT가 필요하다면 생략하거나 --verify-jwt=true 설정
함수 호출:
배포된 함수는 고유한 엔드포인트에 HTTP POST 요청 (또는 함수 로직에 따라 GET)을 통해 호출할 수 있습니다:https://<your-project-ref>.supabase.co/functions/v1/hello-world
curl
을 사용하여:
curl -X POST 'https://<ref>.supabase.co/functions/v1/hello-world' \
-H "Authorization: Bearer <user-jwt-if-required>" \
-H "Content-Type: application/json" \
-d '{"name": "Functions"}' # 선택적 요청 본문
Supabase JS 클라이언트를 사용하여:
const { data, error } = await supabase.functions.invoke('hello-world', {
method: 'POST', // 또는 'GET', 등.
body: { name: 'Functions' }
})
Edge Functions는 Supabase 백엔드 기능을 간단한 데이터베이스 작업 이상의 범위로 확장할 수 있는 강력한 도구입니다.
6. API 키 및 Supabase API 보안
API 키를 이해하고 적절한 보안 조치를 구현하는 것은 필수적입니다.
API 키 요약:
anon
(공용) 키: 클라이언트 측 사용을 위해. 데이터 보호를 위해 Row Level Security (RLS)에 전적으로 의존합니다.service_role
키: 서버 측 사용만을 위한 것입니다. RLS를 우회하여 전체 데이터베이스 접근을 허용합니다. 이 키를 주의 깊게 보호하세요.
Row Level Security (RLS)의 중요한 역할:
RLS는 anon
키를 사용할 때 Supabase 보안의 초석입니다. 사용자의 인증 상태, 사용자 ID, 역할 또는 기타 기준에 따라 사용자가 조회, 삽입, 업데이트 또는 삭제할 수 있는 행을 정의합니다.
RLS 활성화:
기본적으로, 새로운 테이블에서 RLS는 비활성화 되어 있습니다. anon
키를 사용하여 클라이언트 측에서 접근하려는 모든 테이블에 대해 RLS를 활성화해야 합니다.
-- 'profiles' 테이블에서 RLS 활성화
ALTER TABLE profiles ENABLE ROW LEVEL SECURITY;
-- 중요: RLS를 활성화한 후 정책이 정의되지 않으면,
-- 모든 작업에 대해 (테이블 소유자를 제외하고) 접근이 암묵적으로 거부됩니다.
RLS 정책 생성:
정책은 읽기 접근(예: SELECT
, UPDATE
, DELETE
)을 위한 USING
절과 쓰기 접근(예: INSERT
, UPDATE
)을 위한 WITH CHECK
절을 정의합니다.
예제 1: 로그인한 사용자에게 모든 프로필 조회 허용:
CREATE POLICY "인증된 읽기 접근 허용"
ON profiles FOR SELECT
USING ( auth.role() = 'authenticated' );
예제 2: 사용자가 자신의 프로필만 볼 수 있도록 허용:
CREATE POLICY "개별 읽기 접근 허용"
ON profiles FOR SELECT
USING ( auth.uid() = id ); -- 'id' 열이 Supabase Auth에서 사용자의 UUID와 일치한다고 가정
예제 3: 사용자가 자신의 프로필만 업데이트할 수 있도록 허용:
CREATE POLICY "개별 업데이트 접근 허용"
ON profiles FOR UPDATE
USING ( auth.uid() = id ) -- 어떤 행이 업데이트될 수 있는지를 지정
WITH CHECK ( auth.uid() = id ); -- 새로운 데이터도 여전히 조건을 충족하는지 확인
예제 4: 사용자가 자신의 프로필을 삽입할 수 있도록 허용:
CREATE POLICY "개별 삽입 접근 허용"
ON profiles FOR INSERT
WITH CHECK ( auth.uid() = id );
RLS 정책을 직접 관리하고查看할 수 있으며, Supabase 대시보드의 Authentication
> Policies
에서 확인할 수 있습니다.
핵심 보안 원칙:
- 항상 RLS를 활성화 하세요,
anon
키를 사용하여 접근하는 테이블에서. - 정확한 정책 정의:
SELECT
,INSERT
,UPDATE
,DELETE
가 필요할 때 정의하세요. 제한적인 정책으로 시작하고 접근을 신중하게 열어가세요. - 클라이언트 측 코드나 보안이 취약한 환경에
service_role
키를 노출하지 마세요. - 높은 권한이나 복잡한 서버 측 로직이 요구되는 작업에는 Edge Functions를 사용하세요. 함수의 보안 환경 변수를 통해
service_role
키를 보호하세요. - 정기적으로 RLS 정책을 검토하여 애플리케이션의 보안 요구 사항을 충족하는지 확인하세요.
7. SQL 개념을 Supabase API에 매핑하기 (SQL에서 API로)
SQL에 익숙하다면, 공통된 SQL 작업이 Supabase API(REST 및 클라이언트 라이브러리)에 어떻게 매핑되는지를 이해하는 것이 도움이 됩니다.
SELECT * FROM my_table;
- REST:
GET /rest/v1/my_table?select=*
- JS:
supabase.from('my_table').select('*')
SELECT column1, column2 FROM my_table WHERE id = 1;
- REST:
GET /rest/v1/my_table?select=column1,column2&id=eq.1
- JS:
supabase.from('my_table').select('column1, column2').eq('id', 1)
INSERT INTO my_table (column1, column2) VALUES ('value1', 'value2');
- REST:
POST /rest/v1/my_table
요청 본문에 JSON{"column1": "value1", "column2": "value2"}
포함 - JS:
supabase.from('my_table').insert({ column1: 'value1', column2: 'value2' })
UPDATE my_table SET column1 = 'new_value' WHERE id = 1;
- REST:
PATCH /rest/v1/my_table?id=eq.1
요청 본문에 JSON{"column1": "new_value"}
포함 - JS:
supabase.from('my_table').update({ column1: 'new_value' }).eq('id', 1)
DELETE FROM my_table WHERE id = 1;
- REST:
DELETE /rest/v1/my_table?id=eq.1
- JS:
supabase.from('my_table').delete().eq('id', 1)
조인: 기본 REST 호출에서 직접 SQL JOIN
구문은 사용되지 않지만, 다음과 같이 관련 데이터를 가져올 수 있습니다:
- 외래 키 관계:
?select=*,related_table(*)
외래 키로 정의된 관련 테이블에서 데이터를 가져옵니다. - JS:
supabase.from('my_table').select('*, related_table(*)')
- RPC (원격 프로시저 호출): 복잡한 조인이나 로직을 위해 PostgreSQL 함수를 생성하고 API를 통해 호출합니다.
-- 예제 SQL 함수
CREATE FUNCTION get_user_posts(user_id uuid)
RETURNS TABLE (post_id int, post_content text) AS $$
SELECT posts.id, posts.content
FROM posts
WHERE posts.author_id = user_id;
$$ LANGUAGE sql;
- REST:
POST /rest/v1/rpc/get_user_posts
요청 본문에 JSON{"user_id": "some-uuid"}
포함 - JS:
supabase.rpc('get_user_posts', { user_id: 'some-uuid' })
8. Supabase API와 함께 사용자 정의 스키마 사용하기
기본적으로 Supabase SQL Editor에서 생성한 테이블은 public
스키마에 존재합니다. 더 나은 조직관리, 네임스페이싱 또는 권한 관리를 위해 사용자 정의 PostgreSQL 스키마를 사용할 수 있습니다.
사용자 정의 스키마 생성하기:
CREATE SCHEMA private_schema;
사용자 정의 스키마에 테이블 생성하기:
CREATE TABLE private_schema.sensitive_data (
id serial primary key,
payload jsonb
);
API를 통해 사용자 정의 스키마의 테이블 접근하기:
Supabase의 PostgREST 계층은 public
이외의 스키마에서 테이블을 자동으로 감지합니다.
- REST API: API 엔드포인트는 동일하게 유지(
/rest/v1/table_name
), 하지만 PostgREST는 기본적으로 다른 스키마에서도 테이블을 노출합니다. 표준 RLS를 넘어선 세밀한 스키마 수준 접근 제어를 원할 경우 PostgreSQL에서 역할과 권한을 관리해야 할 수 있습니다. 이름 충돌 (같은 테이블 이름이public
와 다른 스키마에 있을 경우) 발생 시, 특정한 설정이 필요할 수 있습니다. 필요시 스키마 가시성 관리를 위한 PostgREST 문서를 참조하세요. - 클라이언트 라이브러리: 클라이언트 라이브러리는 원활하게 작동합니다. 단순히 테이블 이름을 평소처럼 참조하면 됩니다:
// 'private_schema'에 있는 테이블 접근하기 (RLS/권한이 허용된다고 가정)
const { data, error } = await supabase
.from('sensitive_data') // 여기서 스키마 이름을 접두사로 붙일 필요 없음
.select('*')
.eq('id', 1);
Supabase는 내부적으로 테이블 이름을 올바른 스키마에 매핑하는 작업을 처리합니다. 교차 스키마 쿼리나 함수에 관여하는 테이블을 포함하는 RLS 정책이 올바르게 테이블을 참조하도록 하는 것이 중요합니다.
사용자 정의 스키마는 PostgreSQL의 표준 관행으로, Supabase는 이를 완전히 지원하여 데이터베이스 구성을 더 구조적으로 만들 수 있습니다.
9. 결론
Supabase API는 PostgreSQL 데이터베이스에 대한 즉각적이고 안전하며 확장 가능한 접근을 제공함으로써 애플리케이션을 구축하는 효율적인 방법을 제시합니다. 자동 생성된 REST 엔드포인트와 유용한 클라이언트 라이브러리, Row Level Security에 의해 제공되는 강력한 보안 및 Edge Functions에 의해 제공되는 확장성을 통해, Supabase는 개발자들이 부가적인 백엔드 인프라구축 대신 기능 구축에 집중할 수 있도록 합니다.
API 키, RLS, REST 구조, 타입 생성 및 사용자 정의 함수를 이해함으로써 Supabase 플랫폼의 모든 기능을 효과적으로 활용할 수 있습니다. 보안을 항상 최우선으로 생각하세요.
개발 팀이 함께 협력할 수 있는 통합된 올인원 플랫폼이 필요하신가요? 최대 생산성를 위해요?
Apidog는 모든 요구를 충족시키고, Postman을 훨씬 저렴한 가격에 대체합니다!
