Supabase는 PostgreSQL을 기반으로 하는 오픈소스 백엔드 플랫폼이다. 데이터를 다루는 모든 작업의 출발점은 Table이며, Table의 구조를 이해하는 것이 Supabase 활용의 첫 단계다. Row와 Column이 어떻게 구성되는지, 키 제약이 어떤 역할을 하는지 알아야 안정적인 스키마를 설계할 수 있다.
Supabase Table은 PostgreSQL의 테이블과 동일하다. Column은 데이터의 속성(타입과 제약)을 정의하고, Row는 실제 데이터 한 건을 나타낸다.
Schema: public
│
└── Table: posts
├── Column: id (uuid, PK)
├── Column: title (text, NOT NULL)
├── Column: body (text)
├── Column: user_id (uuid, FK → users.id)
└── Column: created_at (timestamptz, DEFAULT now())
Row 예시
┌──────────────────────┬────────────┬──────────┬──────────────────────┐
│ id │ title │ body │ created_at │
├──────────────────────┼────────────┼──────────┼──────────────────────┤
│ a1b2-c3d4-... │ Hello │ World │ 2026-10-10T09:00:00Z │
└──────────────────────┴────────────┴──────────┴──────────────────────┘
Schema — 테이블, 함수, 뷰 등 데이터베이스 객체를 묶는 네임스페이스. Supabase 기본 스키마는 public이다.
Primary Key(PK) 는 Row를 고유하게 식별하는 Column이다. Supabase는 기본적으로 uuid 타입의 id 컬럼을 PK로 권장한다. gen_random_uuid를 DEFAULT로 지정하면 삽입 시 자동 생성된다.
Foreign Key(FK) 는 다른 테이블의 PK를 참조해 두 테이블 사이의 관계를 강제한다. FK가 있으면 참조 무결성이 보장되어 존재하지 않는 user_id를 가진 Row를 삽입할 수 없다.
-- 기본 키와 외래 키 선언 예시
CREATE TABLE posts (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
title text NOT NULL,
body text,
user_id uuid REFERENCES users(id) ON DELETE CASCADE,
created_at timestamptz DEFAULT now()
);
ON DELETE CASCADE — 참조 대상(users Row)이 삭제되면 이를 참조하는 Row(posts)도 자동으로 삭제된다.
Supabase Dashboard의 Table Editor를 사용하면 SQL 없이 테이블을 생성하고 Row를 편집할 수 있다.
GUI는 빠른 확인에 유용하지만, 복잡한 스키마 변경은 SQL Editor를 쓰는 것이 명확하다.
Dashboard 좌측 SQL Editor 탭에서 DDL과 DML을 직접 실행할 수 있다.
-- Column 추가
ALTER TABLE posts ADD COLUMN slug text UNIQUE;
-- 데이터 조회
SELECT id, title, created_at
FROM posts
WHERE user_id = 'a1b2-c3d4-...'
ORDER BY created_at DESC;
SQL Editor는 실행 결과를 테이블 형태로 바로 표시하며, 자주 쓰는 쿼리는 Save 기능으로 저장해 재사용할 수 있다.
테이블을 생성한 뒤 반드시 확인해야 할 것이 Row Level Security(RLS) 다. Supabase는 새 테이블에 RLS를 비활성화 상태로 생성하며, 활성화하지 않으면 anon 키로도 모든 Row에 접근 가능하다.
-- RLS 활성화
ALTER TABLE posts ENABLE ROW LEVEL SECURITY;
-- 본인 Row만 조회 허용
CREATE POLICY "본인 글 조회" ON posts
FOR SELECT USING (auth.uid() = user_id);
RLS(Row Level Security) — PostgreSQL 기능으로, 사용자별로 접근 가능한 Row를 제한하는 정책을 테이블 단위로 설정한다.