티스토리 뷰

RDBMS/SQL

bigint VS uuid

James Wetzel 2025. 4. 8. 16:39

Supabase의 UUID 값을 id BigInt @id @default(autoincrement()) 대신 사용하는 것은 일반적으로 안전하며, 많은 경우에 더 나은 선택일 수 있습니다. 각각의 장단점을 고려하여 프로젝트의 요구 사항에 맞게 결정하는 것이 중요합니다.

BigInt @id @default(autoincrement())의 특징 및 고려 사항:

  • 장점:
    • 성능: 숫자형 ID는 인덱싱 및 비교 연산에서 UUID보다 약간 더 빠를 수 있습니다. 특히 데이터베이스 규모가 매우 커지는 경우에 미미한 성능 향상을 기대할 수 있습니다.
    • 순차적인 정렬: 자동 증가하는 숫자는 생성 순서대로 정렬하기 쉽습니다.
    • 간결함: UUID보다 사람이 읽고 이해하기 쉽습니다.
  • 단점:
    • 확장성 및 병합: 여러 데이터베이스 또는 분산 시스템 환경에서 ID 충돌 가능성이 있습니다. 데이터를 병합하거나 마이그레이션할 때 ID 충돌을 방지하기 위한 추가적인 메커니즘이 필요합니다.
    • 정보 유출 가능성: ID가 순차적으로 증가하면 생성 시점이나 데이터 양에 대한 정보를 유추할 수 있습니다 (보안에 민감한 경우 단점이 될 수 있습니다).

Supabase의 UUID 값 (uuid 데이터 타입 및 uuid_generate_v4() 함수)의 특징 및 고려 사항:

  • 장점:
    • 글로벌 고유성: UUID는 전 세계적으로 고유성이 보장되므로, 분산 시스템, 데이터 병합, 마이그레이션 시 ID 충돌 가능성이 매우 낮습니다.
    • 보안: ID 생성 시점을 예측하기 어렵게 만들어 정보 유출 위험을 줄입니다.
    • 확장성: 여러 서버 또는 데이터베이스에서 독립적으로 ID를 생성해도 충돌 위험이 없습니다.
  • 단점:
    • 성능: 숫자형 ID에 비해 약간의 성능 오버헤드가 있을 수 있습니다 (저장 공간, 인덱싱, 비교 연산 등). 하지만 대부분의 애플리케이션에서는 무시할 만한 수준입니다.
    • 가독성: bigint와 같은 숫자형 ID보다 사람이 읽고 이해하기 어렵습니다.
    • 저장 공간: UUID는 일반적으로 128비트 (16바이트)로, bigint (8바이트)보다 더 많은 저장 공간을 차지합니다.

결론:

Supabase의 UUID 값을 id의 기본 키로 사용하는 것은 일반적으로 안전하며, 많은 현대적인 애플리케이션에서 선호되는 방식입니다. 특히 다음과 같은 경우에 UUID 사용이 유리합니다.

  • 확장성 및 분산 시스템: 여러 데이터베이스 또는 서비스와 데이터를 통합하거나 분산 환경에서 애플리케이션을 운영할 계획이 있는 경우.
  • 데이터 병합 및 마이그레이션: 향후 데이터를 다른 시스템과 병합하거나 데이터베이스를 마이그레이션할 가능성이 있는 경우.
  • 보안: ID 생성을 예측하기 어렵게 하여 보안을 강화해야 하는 경우.

bigint autoincrement를 사용하는 것이 더 나은 경우는 다음과 같습니다.

  • 매우 엄격한 성능 요구 사항: 극도의 성능 최적화가 필요한 특정 워크로드에서 (일반적인 웹 애플리케이션에서는 큰 차이가 없을 수 있습니다).
  • 단순한 단일 데이터베이스 환경: 확장성이나 데이터 병합을 고려할 필요가 없는 단순한 환경.
  • 순차적인 ID 기반 로직: ID의 순차적인 특성을 활용하는 특정 로직이 있는 경우.

Prisma 스키마 설정 방법 (UUID 사용):

Prisma 스키마에서 UUID를 사용하려면 데이터 타입을 String으로 설정하고, 기본값으로 Supabase의 uuid_generate_v4() 함수를 사용해야 합니다. @default(dbgenerated("uuid_generate_v4()"))를 사용하여 데이터베이스 수준에서 UUID를 생성하도록 지시합니다.

model Story {
  id          String    @id @default(dbgenerated("uuid_generate_v4()")) @db.Uuid
  title       String
  content     String    @db.Text
  category    String    // novel, essay, etc
  image_urls  String[]  // 이미지 URL 배열 (Supabase 네이밍 컨벤션에 맞춤)
  likes       Int       @default(0)
  comments    Int       @default(0)
  createdAt   DateTime  @default(now()) @map("created_at")
  updatedAt   DateTime  @updatedAt @map("updated_at")

  authorId    String    @map("author_id")
  author      User      @relation(fields: [authorId], references: [id], onDelete: Cascade)

  @@index([authorId])
  @@index([category])
  @@index([createdAt])
}

Supabase 데이터베이스 스키마 설정 (UUID 사용):

Supabase 데이터베이스의 Story 테이블에서 id 컬럼의 데이터 타입을 uuid로 설정하고, 기본값으로 uuid_generate_v4() 함수를 설정해야 합니다.

Supabase 대시보드 (Table Editor)를 사용하는 방법:

  1. Story 테이블의 id 컬럼을 편집합니다.
  2. 데이터 타입 (Type): uuid를 선택합니다.
  3. 기본값 (Default Value): uuid_generate_v4()를 입력합니다.

Supabase SQL Editor를 사용하는 방법:

-- 기존 'id' 컬럼 삭제 (데이터가 있다면 주의!)
ALTER TABLE "public"."Story" DROP COLUMN IF EXISTS "id";

-- 새로운 'id' 컬럼 추가 (uuid 타입, 기본값으로 uuid_generate_v4())
ALTER TABLE "public"."Story" ADD COLUMN "id" uuid PRIMARY KEY DEFAULT uuid_generate_v4();

-- uuid-ossp 확장 활성화 (필요한 경우)
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

결론적으로, UUID는 글로벌 고유성, 보안, 확장성 측면에서 장점이 많으므로 Supabase 환경에서 id 값으로 사용하기에 안전하고 좋은 선택입니다. 프로젝트의 특정 요구 사항을 고려하여 bigint autoincrement와 UUID 중에서 더 적합한 방식을 선택하시면 됩니다. 대부분의 현대 웹 애플리케이션에서는 UUID를 사용하는 것이 일반적인 추세입니다.

728x90
반응형