티스토리 뷰

🔥 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 추천 사례

  1. 단일 데이터베이스에서 운영되는 시스템
    • 쇼핑몰, 블로그, 게시판 등의 일반적인 서비스
  2. 트랜잭션이 많은 서비스
    • 순차적으로 증가하는 키 값이 성능에 유리
CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    user_id INTEGER NOT NULL,
    amount DECIMAL(10,2) NOT NULL
);

 

UUID 추천 사례

  1. 분산 환경에서 동작하는 시스템
    • 여러 개의 서버에서 동시에 데이터가 생성될 경우
  2. 보안이 중요한 경우
    • 외부에서 기본 키 값을 노출해야 하는 경우 (예: 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가 더 적합합니다! 🚀

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
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
글 보관함