티스토리 뷰
🔥 1. UUID vs SERIAL: 기본 개념
PostgreSQL에서 테이블의 기본 키(Primary Key) 를 정의할 때 가장 많이 사용하는 두 가지 데이터 타입이 있습니다.
✅ SERIAL (자동 증가 정수)
✅ UUID (Universally Unique Identifier)
그렇다면, 프로젝트에서 기본 키를 설정할 때 어떤 것을 선택해야 할까요? 🤔
각 데이터 타입의 특징, 성능 차이, 장단점을 비교해 보겠습니다! 🚀
데이터 타입설명
🔹 SERIAL | 1부터 자동 증가하는 정수형 기본 키 |
🔹 UUID | 전 세계적으로 유일한 식별자 (128비트) |
⚡ 2. SERIAL vs UUID 차이점 분석
✅ 1) 데이터 저장 방식
🔹 SERIAL (자동 증가 정수)
- 기본적으로 INTEGER 또는 BIGINT로 저장됩니다.
- PostgreSQL에서 자동 증가(Autoincrement) 를 관리하며, 순차적인 숫자로 기본 키가 생성됩니다.
- 자동 증가 값은 SEQUENCE 객체를 이용하여 관리됩니다.
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL
);
✔ 저장 예시
id | name |
1 | Alice |
2 | Bob |
3 | Charlie |
📌 특징:
- 기본 키 값이 순차적으로 증가하기 때문에 읽기 성능이 우수합니다.
- 그러나 다중 서버 환경에서는 충돌 위험이 있을 수 있습니다.
🔹 UUID (Universally Unique Identifier)
- UUID는 128비트 길이의 고유한 값을 가지며, 전 세계적으로 유일한 값이 생성됩니다.
- PostgreSQL에서는 UUID 타입을 기본적으로 지원하며, UUID 생성 함수를 제공합니다.
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE users (
id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
name TEXT NOT NULL
);
✔ 저장 예시
ID | NAME |
550e8400-e29b-41d4-a716-446655440000 | Alice |
6c2e9b42-78d2-4c17-b58c-33b047f5c725 | Bob |
f47ac10b-58cc-4372-a567-0e02b2c3d479 | Charlie |
📌 특징:
- 랜덤하게 생성되므로, 충돌 위험이 거의 없습니다.
- 다중 서버 환경에서 중복 없이 데이터 통합이 가능합니다.
- 그러나 정렬이 어렵고, 성능 저하가 발생할 가능성이 있습니다.
✅ 2) 성능 차이
🔹 SERIAL의 성능
✔ 기본적으로 정수형(4~8바이트) 을 사용하므로, 데이터베이스 크기가 작고 성능이 뛰어납니다.
✔ 인덱스 생성 및 조회 속도가 빠릅니다.
🔹 UUID의 성능
❌ UUID는 16바이트로 저장되기 때문에 SERIAL보다 저장 공간을 더 많이 차지합니다.
❌ 랜덤 값이므로 B-Tree 인덱스에서 정렬이 비효율적입니다.
💡 실제 성능 테스트 결과
EXPLAIN ANALYZE SELECT * FROM users WHERE id = 1000000;
EXPLAIN ANALYZE SELECT * FROM users WHERE id = '6c2e9b42-78d2-4c17-b58c-33b047f5c725';
🚀 결과: SERIAL이 UUID보다 쿼리 속도가 빠름!
📌 결론:
✅ 성능이 중요한 경우, SERIAL이 더 적합합니다.
✅ 대규모 분산 시스템에서는 UUID가 더 안전합니다.
✅ 3) 다중 서버 환경에서의 안정성
🔹 SERIAL의 문제점
- 다중 서버에서 데이터를 병합할 때 동일한 id 값이 충돌할 수 있습니다.
- 여러 개의 데이터베이스를 운영할 경우, 고유성을 유지하기 어렵습니다.
🔹 UUID의 장점
✅ UUID는 전 세계적으로 유일한 값이므로, 다중 서버 환경에서도 충돌 없이 사용 가능합니다.
✅ 데이터베이스 간 데이터 병합 시에도 충돌이 발생하지 않습니다.
📌 결론:
- 단일 서버에서 운영하는 경우 → SERIAL 사용
- 다중 서버(분산 환경)에서 운영하는 경우 → UUID 사용
✅ 4) 보안 및 보안 취약점
🔹 SERIAL의 보안 문제
- SERIAL 값은 순차적으로 증가하기 때문에, 데이터를 추측할 수 있습니다.
- 예를 들어, id=10이 있으면 id=11도 있을 가능성이 큽니다.
🔹 UUID의 보안 장점
✅ UUID는 랜덤 값이므로 데이터 추측이 어렵습니다.
✅ 특히, API에서 id를 노출할 경우 보안성이 더욱 뛰어납니다.
📌 결론:
- 보안이 중요한 경우, UUID를 사용하는 것이 더 안전합니다.
📌 3. SERIAL vs UUID 실무 사용 사례
✅ SERIAL 추천 사례
- 단일 데이터베이스에서 운영되는 시스템
- 쇼핑몰, 블로그, 게시판 등의 일반적인 서비스
- 트랜잭션이 많은 서비스
- 순차적으로 증가하는 키 값이 성능에 유리
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INTEGER NOT NULL,
amount DECIMAL(10,2) NOT NULL
);
✅ UUID 추천 사례
- 분산 환경에서 동작하는 시스템
- 여러 개의 서버에서 동시에 데이터가 생성될 경우
- 보안이 중요한 경우
- 외부에서 기본 키 값을 노출해야 하는 경우 (예: API 엔드포인트)
CREATE TABLE transactions (
id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
user_id UUID NOT NULL,
amount DECIMAL(10,2) NOT NULL
);
🎯 4. 최종 정리: SERIAL vs UUID, 무엇을 선택할까?
기준SERIALUUID
성능 | ✅ 빠름 | ❌ 느림 (16바이트 저장) |
다중 서버 환경 | ❌ 충돌 가능 | ✅ 충돌 없음 |
데이터 보안 | ❌ 순차적인 값 노출 | ✅ 무작위 값으로 안전 |
저장 공간 | ✅ 작음 (4~8바이트) | ❌ 큼 (16바이트) |
인덱스 성능 | ✅ 최적화됨 | ❌ 비효율적 정렬 |
🚀 5. 결론: PostgreSQL 실무에서 어떻게 사용할까?
✔ SERIAL 추천
✅ 단일 데이터베이스에서 운영하는 일반적인 서비스
✅ 빠른 조회 성능이 필요한 경우
✔ UUID 추천
✅ 다중 서버(분산 환경)에서 운영하는 서비스
✅ 보안이 중요한 경우
📌 최종 추천:
대부분의 서비스에서는 SERIAL이 성능상 유리하지만, 다중 서버 환경에서는 UUID가 더 적합합니다! 🚀
'DB' 카테고리의 다른 글
📌 [PostgreSQL] VARCHAR vs TEXT 차이점과 최적의 사용법 (0) | 2025.02.17 |
---|---|
[PostgreSQL] numeric와 integer차이점 (0) | 2020.07.14 |
[PostgreSQL] character varying 와 varchar 차이점 (0) | 2020.07.14 |
- Total
- Today
- Yesterday
- 클린코드
- db성능
- springboot최신기능
- XBOXSERIESX
- 백엔드
- springboot3
- 스프링
- 개발자
- 레코드패턴
- 코딩
- java17
- 인공지능
- uuid_vs_serial
- PostgreSQL
- db설계
- AI혁신
- 스프링부트
- springsecurity6
- GraalVM
- java
- postgresql튜닝
- 게임추천
- SQL
- virtualthreads
- Ai
- jakartaee10
- 프로그래밍
- Java21
- varchar
- pc게임
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |