본문 바로가기
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

전역에서 만들 수 있는 식별자

PostgreSQL에는 UUID 자료형이 있고 PG 13부터 gen_random_uuid()가 코어에 들어왔어. 이전 방식인 uuid-ossp도 알아둘 만해. PG 18부터는 두 번째 선택지인 uuidv7()도 쓸 수 있어. 그 이전 버전에서는 uuid-ossp나 별도 확장 기능을 검토해.

v4와 v7의 차이

v4는 122개의 무작위 비트로 충돌을 피하지만 B-tree 곳곳에 흩어져 들어가. v7은 48비트짜리 밀리초 단위 타임스탬프와 74비트의 무작위 값을 담아 전역 고유성을 유지하면서 시간순으로 모여.

내부 키와 공개 키를 나눌 수 있어

내부 JOIN에는 작은 IDENTITY 정수가 싸고, URL이나 API에는 UUID가 노출에 안전해. 두 열을 함께 두거나 UUID 기본 키를 써. 가능하면 시간 지역성이 있는 UUIDv7을 먼저 검토해.

PG 18에서 무작위 값이 필요하면 gen_random_uuid(), 시간 정렬이 필요하면 uuidv7()을 고르면 돼.

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 이전에는 확장 기능 사용하기·sql
-- 코어에 uuidv7 없는 설치용
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
SELECT uuid_generate_v4();
SELECT uuid_generate_v1();   -- 시간 기반이지만 MAC 주소 누출
내부 ID와 공개 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(), 그렇지 않으면 gen_random_uuid()를 기본값으로 써. 행 1000개를 넣고 public_id 색인의 크기와 쓰기 속도를 비교해.

Progress

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

댓글 0

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

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