# UUIDv7이 PostgreSQL 18에 도입됩니다

> Clean Markdown view of GeekNews topic #21036. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=21036](https://news.hada.io/topic?id=21036)
- GeekNews Markdown: [https://news.hada.io/topic/21036.md](https://news.hada.io/topic/21036.md)
- Type: news
- Author: [neo](https://news.hada.io/@neo)
- Published: 2025-05-22T10:04:01+09:00
- Updated: 2025-05-22T10:04:01+09:00
- Original source: [thenile.dev](https://www.thenile.dev/blog/uuidv7)
- Points: 15
- Comments: 4

## Summary

PostgreSQL 18은 **UUIDv7**을 도입하여 **정렬 가능한 식별자**와 **인덱스 최적화**를 지원합니다. UUIDv7은 **시간 기반 구조**와 **무작위값+카운터 결합**을 적용해 기존 UUID의 **정렬 불가, 비국소성 문제**를 해결하며, **분산 시스템 및 다중 테넌트 환경**에 더욱 적합한 선택지를 제공합니다. 새로운 **함수 및 타임스탬프 추출 기능**을 통해 개발자는 ID 관리에서 유연성과 성능을 동시에 확보할 수 있습니다.

## Topic Body

- PostgreSQL 18에서는 **UUIDv7을 기본 지원**하며, **정렬 가능하고 인덱스 친화적인 고유 식별자**를 제공  
- UUIDv7은 기존 UUID의 **분산 환경에서의 고유성과 보안성**은 유지하면서, **btree 인덱스에 유리한 시간 기반 정렬 구조**를 채택함  
- 기존 UUID 사용의 단점이었던 **정렬 불가, 인덱스 난삽, 메모리 크기** 중 앞의 두 문제를 해결하며 **시간순 정렬 및 삽입 최적화**를 실현함  
- PostgreSQL 18에서는 `uuidv7()` 함수로 UUID 생성이 가능하고, **타임스탬프 추출 및 커스텀 시간 입력 기능**도 제공함  
- 이제 UUID를 **기본 키로 사용하는 것을 주저하던 이유가 해소**되어, **분산 시스템 및 다중 테넌트 환경에서 더 적합한 선택지**가 됨  
  
---  
  
### PostgreSQL 18  
  
- PostgreSQL 18의 베타 버전이 출시되었고, 9월 정식 릴리스를 목표로 테스트가 진행 중임  
- 주요 기능:  
  * **Async I/O**: `io_uring` 기반 비동기 입출력으로 시퀀스 스캔 및 vacuum 2\~3배 속도 개선  
  * **멀티 컬럼 btree 인덱스의 Skip scan**, `OR`/`IN` 쿼리 최적화  
  * **업그레이드 간 플래너 통계 유지**  
  * **UUIDv7 함수**  
  * **가상 생성 칼럼**, OAuth 로그인, EXPLAIN에 I/O/CPU/WAL 정보 추가 등  
  
### UUID의 장점  
  
- **분산 환경에서 고유 ID 생성** 가능  
- **예측 불가능한 공개 식별자**로 보안성 강화  
- **클라이언트에서 직접 ID 생성** 가능하여 서버 통신 최소화  
  
### 기존 UUID의 단점  
  
- **정렬 불가능**  
- **인덱스 비국소성**으로 인한 삽입 성능 저하  
- **128비트 크기**로 인한 오버헤드  
  
### UUIDv7의 해결책  
  
- **RFC 9562 (2024년 5월 발표)** 에 따라 도입된 신형 UUID 버전  
- 앞의 48비트에 **Unix Epoch 기반 타임스탬프**, 나머지에는 **무작위값 + 카운터**를 조합  
- **시간 순 정렬 가능**하며, **인덱스 삽입 효율 증가**  
- UUIDv6는 하위 호환용, UUIDv8은 실험/벤더 확장용  
- **UUIDv7만이 실질적으로 의미 있는 새로운 표준**  
  
### PostgreSQL 18에서의 UUIDv7 사용  
  
- `uuidv7()` 함수로 현재 시각 기반 UUID 생성  
- `uuidv7(INTERVAL)`을 통해 원하는 시간 offset 반영 가능  
- `uuid_extract_version()`, `uuid_extract_timestamp()` 함수로 UUID 버전 및 생성 시간 추출 가능  
- 예시:  
  ```sql  
  CREATE TABLE test (  
      id uuid DEFAULT uuidv7() PRIMARY KEY,  
      name text  
  );  
  
  INSERT INTO test (name) VALUES ('foo');  
  INSERT INTO test (name) VALUES ('bar');  
  INSERT INTO test (id, name) VALUES (uuidv7(INTERVAL '-1 hour'), 'oldest');  
  
  SELECT uuid_extract_timestamp(id), name FROM test ORDER BY id;  
  ```  
- `uuidv4()`는 `gen_random_uuid()`의 별칭으로 추가됨  
  
### 결론 및 권장 사항  
  
- UUIDv7은 **기존 UUID 사용 시 성능 문제를 겪던 사용자들에게 적합**  
- **정렬성과 인덱스 성능을 확보하면서도** UUID의 장점 유지  
- PostgreSQL 18 베타에서 지금 바로 테스트 가능  
- **분산 시스템, 다중 테넌트 앱, 서버리스 환경에서의 ID 생성**에 적합한 선택지  
> “UUIDv7는 조용하지만 강력한 기능 추가로, Postgres에서 UUID를 기본 키로 사용하는 것을 다시 고려하게 만듦”

## Comments



### Comment 39146

- Author: jaylee
- Created: 2025-05-23T22:39:34+09:00
- Points: 1

저는 대신 Prisma + ULID를 사용하고 있습니다. 훨씬 짧고 좋아요.

### Comment 39049

- Author: ssssut
- Created: 2025-05-22T10:37:54+09:00
- Points: 1

uuid_generate_v7() 같은 함수 만들어서 사용하고 있었는데 반가운 소식이네요.

### Comment 39048

- Author: stomx
- Created: 2025-05-22T10:31:34+09:00
- Points: 1

오!!

### Comment 39072

- Author: halfenif
- Created: 2025-05-22T17:56:45+09:00
- Points: 1
- Parent comment: 39048
- Depth: 1

오...!
