C.W.K.
Stream
Lesson 04 of 10 · published

UUID 와 uuidv7()

~10 min · extensions, uuid

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

First-class 식별자로서 UUID

PostgreSQL 이 내장 UUID 타입과 내장 generator: gen_random_uuid() (v4) 와 uuidv7() (PG 18+). PG 18 전엔 uuid-ossp extension 추가; PG 13+ 가 코어에 gen_random_uuid 가짐.

v4 vs v7

v4: 122 random bit. 전역 unique, 그러나 완전히 unsorted — B-tree 인덱스의 모든 insert 가 random 위치 land, 시간에 따라 인덱스 fragment. 정확한 lookup 으로 read 하는 ID 엔 OK; PK 엔 안 좋음.

v7: 48-bit 타임스탬프 + 74 random bit. 전역 unique 그리고 시간 정렬 가능. 새 행이 인덱스 끝에 land (순차 정수처럼), UUID 로 ORDER BY 가 시간순 정렬 공짜.

어느 거 쓸지

내부 PK: 정수 IDENTITY (join 싸고, 인덱스 작음). 공개 ID (URL/API 노출): 가능하면 uuidv7(), 아니면 gen_random_uuid(). 많은 테이블이 둘 다 — join 위한 내부 id, 노출 위한 외부 uuid.

Code

UUID 생성·sql
SELECT gen_random_uuid();   -- v4 random
SELECT uuidv7();             -- v7 시간 정렬 (PG 18+)

-- 컬럼 default
CREATE TABLE api_tokens (
    id          UUID PRIMARY KEY DEFAULT uuidv7(),
    user_id     INTEGER NOT NULL REFERENCES users(id),
    created_at  TIMESTAMPTZ NOT NULL DEFAULT now()
);
PG 18 전 — extension 추가·sql
-- 코어에 uuidv7 없는 설치용
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
SELECT uuid_generate_v4();
SELECT uuid_generate_v1();   -- 시간 기반이지만 MAC 주소 누출
Two-id 패턴 (내부 + 공개)·sql
CREATE TABLE invoices (
    id          INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,  -- join
    public_id   UUID NOT NULL UNIQUE DEFAULT uuidv7(),               -- URL
    user_id     INTEGER NOT NULL REFERENCES users(id),
    amount      NUMERIC(10,2) NOT NULL,
    created_at  TIMESTAMPTZ NOT NULL DEFAULT now()
);

External links

Exercise

테이블에 public_id UUID 컬럼 추가. 가능하면 uuidv7() default; 아니면 gen_random_uuid(). 1000 행 insert; public_id 인덱스 크기 비교 (v7 가 더 작고 write 빨라야).

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.