개인의 기록
  • 소개
  • 프로젝트
  • 글
  • 링크

© 2026 newgirok

← 글 목록

Supabase Table — 데이터를 저장하는 기본 구조

2025년 4월 1일
SupabaseTableRowColumnSchema

Supabase는 PostgreSQL을 기반으로 하는 오픈소스 백엔드 플랫폼이다. 데이터를 다루는 모든 작업의 출발점은 Table이며, Table의 구조를 이해하는 것이 Supabase 활용의 첫 단계다. Row와 Column이 어떻게 구성되는지, 키 제약이 어떤 역할을 하는지 알아야 안정적인 스키마를 설계할 수 있다.

Table 구조

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)도 자동으로 삭제된다.

Dashboard에서 테이블 관리

Supabase Dashboard의 Table Editor를 사용하면 SQL 없이 테이블을 생성하고 Row를 편집할 수 있다.

  • New Table 버튼 → 이름·Column 타입·제약 설정
  • Column 옆 아이콘으로 PK, Unique, NOT NULL, Default 값 지정
  • Insert Row 버튼으로 직접 데이터 입력 가능

GUI는 빠른 확인에 유용하지만, 복잡한 스키마 변경은 SQL Editor를 쓰는 것이 명확하다.

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 기능으로 저장해 재사용할 수 있다.

RLS와 테이블 보안

테이블을 생성한 뒤 반드시 확인해야 할 것이 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를 제한하는 정책을 테이블 단위로 설정한다.

← 이전 글Supabase PostgreSQL — 관계형 데이터베이스 기반
다음 글 →Row Level Security — 행 단위 접근 권한 제어