Home > DB > ๐Ÿ’พ[Database] Primary Key ์ƒ์„ฑ ์ „๋žต - ์œ ๋‹ˆํฌ ์ •๋ ฌ ๋ฌธ์ž์—ด

๐Ÿ’พ[Database] Primary Key ์ƒ์„ฑ ์ „๋žต - ์œ ๋‹ˆํฌ ์ •๋ ฌ ๋ฌธ์ž์—ด
Database Primary Key DBMS

โ€œ๐Ÿ’พ[Database] Primary Key ์ƒ์„ฑ ์ „๋žต - ์œ ๋‹ˆํฌ ์ •๋ ฌ ๋ฌธ์ž์—ดโ€

๐ŸŽ Intro.

  • Primary Key(PK)๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ๊ฐ ID๊ฐ€ ๊ณ ์œ ํ•˜๋ฉด์„œ๋„ ์ƒ์„ฑ๋œ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
  • ์ด ๋ฐฉ์‹์€ UUID์ฒ˜๋Ÿผ ์ถฉ๋Œ ์—†๋Š” ๊ณ ์œ ์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„, ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜์˜ ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

โœ…1๏ธโƒฃ ์œ ๋‹ˆํฌ ์ •๋ ฌ ๋ฌธ์ž์—ด ๋ฐฉ์‹์ด ํ•„์š”ํ•œ ์ด์œ .

  • ๊ธฐ์กด์˜ PK ์ƒ์„ฑ ๋ฐฉ์‹์—๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

โŒ1๏ธโƒฃ UUID์˜ ๋ฌธ์ œ์ .

  • UUID๋Š” ์ถฉ๋Œ ์—†์ด ์œ ๋‹ˆํฌํ•˜์ง€๋งŒ, ์ •๋ ฌ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ID๊ฐ€ ๋žœ๋คํ•˜๊ฒŒ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๊ทผ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
  • ๋ฌธ์ž์—ด ๊ธธ์ด๊ฐ€ ๊ธธ๊ณ  ์ธ๋ฑ์‹ฑ ์„ฑ๋Šฅ ์ €ํ•˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

โŒ2๏ธโƒฃ AUTO_INCREMENT(์ˆซ์ž ์ฆ๊ฐ€ ๋ฐฉ์‹)์˜ ๋ฌธ์ œ์ .

  • ์—ฌ๋Ÿฌ ์„œ๋ฒ„(๋ถ„์‚ฐ ํ™˜๊ฒฝ)์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ค‘๋ณต ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ID๊ฐ€ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜์—ฌ ๋ณด์•ˆ์— ์ทจ์•ฝ์ ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

โœ… ์œ ๋‹ˆํฌ ์ •๋ ฌ ๋ฌธ์ž์—ด ๋ฐฉ์‹์ด ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ.

  • UUID์ฒ˜๋Ÿผ ๊ณ ์œ ํ•˜์ง€๋งŒ, ์‹œ๊ฐ„์ˆœ์œผ๋กœ ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์—ฌ๋„ ์ค‘๋ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ๋„ ์•ˆ์ •์ ).
  • ID๊ฐ€ ์ผ์ •ํ•œ ํŒจํ„ด์„ ๊ฐ€์ง€๋ฏ€๋กœ, ์ธ๋ฑ์‹ฑ ์„ฑ๋Šฅ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

โœ…2๏ธโƒฃ ์œ ๋‹ˆํฌ ์ •๋ ฌ ๋ฌธ์ž์—ด ๋ฐฉ์‹ ์ข…๋ฅ˜

์ „๋žต ์˜ˆ์ œ ๊ธธ์ด ํŠน์ง•
KSUID 0ujsswThIGTUYm2K8FjOOfXtY1K 27์ž UUID๋ณด๋‹ค ์งง๊ณ , ์‹œ๊ฐ„ ์ •๋ ฌ ๊ฐ€๋Šฅ
ULID 01F8MECHZX3TBXYN5RRTG1X3J6 26์ž UUID๋ณด๋‹ค ์งง๊ณ , ์ƒ์„ฑ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ ๊ฐ€๋Šฅ
Sonyflake 404168231342172160 19์ž Snowflake์™€ ์œ ์‚ฌ, ๋น ๋ฅธ ์†๋„
Short UUID + Timestamp 20250131235959-8f9c7d3a ๊ฐ€๋ณ€ ๋‚ ์งœ ๊ธฐ๋ฐ˜์œผ๋กœ ์ •๋ ฌ ๊ฐ€๋Šฅ
  • ๊ฐ ๋ฐฉ์‹์€ ์‹œ๊ฐ„ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์ƒ์„ฑ๋œ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

โœ…3๏ธโƒฃ ์œ ๋‹ˆํฌ ์ •๋ ฌ ๋ฌธ์ž์—ด ๋ฐฉ์‹์˜ ์˜ˆ์ œ ์ฝ”๋“œ.

๐Ÿ› ๏ธ1๏ธโƒฃ ULID(Universally Unique Lexicographically Sortable Identifier)

  • ULID๋Š” UUID๋ณด๋‹ค ์งง๊ณ , ์ƒ์„ฑ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•œ ID ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ ULID ํŠน์ง•.

  • UUID๋ณด๋‹ค 10์ž ์ •๋„ ์งง์Œ (26์ž)
  • ์ƒ์„ฑ๋œ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ ๊ฐ€๋Šฅ (์‹œ๊ฐ„ ์ •๋ณด ํฌํ•จ)
  • URL-safe (ํŠน์ˆ˜๋ฌธ์ž๊ฐ€ ์—†์Œ)
  • ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ (Base32 ์‚ฌ์šฉ)

๐Ÿ“ Spring Boot์—์„œ ULID ์‚ฌ์šฉํ•˜๊ธฐ.

  • ULID๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ulid ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1๏ธโƒฃ Maven ๋˜๋Š” Gradle์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€.

<dependency>
    <groupId>de.huxhorn.sulky</groupId>
    <artifactId>de.huxhorn.sulky.ulid</artifactId>
    <version>8.3.0</version>
</dependency>

2๏ธโƒฃ ULID ๊ธฐ๋ฐ˜ ID ์ƒ์„ฑ.

import de.huxhorn.sulky.ulid.ULID;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@Entity
@Table(name = "article")
public class Article {
    @Id
    @Column(name = "article_id", updatable = false, nullable = false, length = 26)
    private String articleId;

    private String title;
    private String content;

    @PrePersist
    public void generateId() {
        ULID ulid = new ULID();
        this.articleId = ulid.nextULID(); // ULID ์ƒ์„ฑ
    }
}

โœ… ULID์˜ ์ฃผ์š” ์žฅ์ .

  • nextULID()๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด, ์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ๊ณ ์œ  ID๊ฐ€ ์ƒ์„ฑ๋จ.
  • ์‹œ๊ฐ„ ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•˜์—ฌ ORDER BY article_id ASC๋กœ ์ตœ๊ทผ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์กฐํšŒ ๊ฐ€๋Šฅ.

๐Ÿ› ๏ธ2๏ธโƒฃ KSUID(K-Sortable Unique ID)

  • KSUID๋Š” ULID์™€ ๋น„์Šทํ•˜์ง€๋งŒ, ๋” ๊ธด ID(27์ž)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ UUID๋ณด๋‹ค ์ •๋ ฌ์ด ์‰ฝ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ KSUID์˜ ํŠน์ง•.

  • ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ์ •๋ ฌ ๊ธฐ๋Šฅ.
  • UUID๋ณด๋‹ค ์งง๊ณ  ์ฝ๊ธฐ ์‰ฌ์›€.
  • ๊ณ ์œ ์„ฑ์ด ๋ณด์žฅ๋จ,

๐Ÿ“ Spring Boot์—์„œ KSUID ์ ์šฉ.

1๏ธโƒฃ Maven ๋˜๋Š” Gradle์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€.

<dependency>
    <groupId>com.github.ksuid</groupId>
    <artifactId>ksuid</artifactId>
    <version>1.0.0</version>
</dependency>

2๏ธโƒฃ KSUID ๊ธฐ๋ฐ˜ ID ์ƒ์„ฑ.

import com.github.ksuid.Ksuid;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@Entity
@Table(name = "article")
public class Article {
    @Id
    @Column(name = "article_id", updatable = false, nullable = false, length = 27)
    private String articleId;

    private String title;
    private String content;

    @PrePersist
    public void generateId() {
        this.articleId = Ksuid.newKsuid().toString(); // KSUID ์ƒ์„ฑ
    }
}

โœ… KSUID์˜ ์ฃผ์š” ์žฅ์ 

  • newKsuid().toString()์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด, ์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ๊ณ ์œ  ID๊ฐ€ ์ƒ์„ฑ๋จ.
  • UUID๋ณด๋‹ค ์งง๊ณ , ๋” ๋น ๋ฆ„.
  • ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•˜์—ฌ ์ตœ๊ทผ ๋ฐ์ดํ„ฐ ์กฐํšŒ๊ฐ€ ์‰ฝ๋‹ค.

๐Ÿ› ๏ธ3๏ธโƒฃ Short UUID + Timestamp (์ปค์Šคํ…€ ๋ฐฉ์‹)

  • ๋งŒ์•ฝ ์ง์ ‘ UUID๋ฅผ ์งง๊ฒŒ ๋ณ€ํ˜•ํ•˜๊ณ , ์‹œ๊ฐ„ ์ •๋ณด์™€ ์กฐํ•ฉํ•˜์—ฌ ๊ณ ์œ ํ•œ ์ •๋ ฌ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ Short UUID + Timestamp์˜ ํŠน์ง•.

  • ๋‚ ์งœ ๊ธฐ๋ฐ˜์œผ๋กœ ์ •๋ ฌ ๊ฐ€๋Šฅ
  • UUID๋ณด๋‹ค ์งง๊ณ , ๊ฐ€๋…์„ฑ์ด ์ข‹์Œ
  • ํŠน์ • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋งž๊ฒŒ ์ปค์Šคํ…€ ๊ฐ€๋Šฅ

๐Ÿ“ Java์—์„œ Short UUID + Timestamp ์ ์šฉ

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID;

public class CustomIdGenerator {

    public static String generateId() {
        String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
        String shortUUID = UUID.randomUUID().toString().replaceAll("-", "").substring(0, 8);
        return timestamp + "-" + shortUUID;
    }

    public static void main(String[] args) {
        System.out.println(generateId()); // ์˜ˆ: 20250201093045-8f9c7d3a
    }
}

โœ… ์ด ๋ฐฉ์‹์˜ ์žฅ์ 

  • ์ •๋ ฌ ๊ธฐ๋Šฅ (๋‚ ์งœ ๊ธฐ๋ฐ˜)
  • UUID๋ณด๋‹ค ์งง๊ณ  ๊ฐ€๋…์„ฑ์ด ์ข‹์Œ
  • UUID์˜ ์ถฉ๋Œ ๋ฐฉ์ง€ ๊ธฐ๋Šฅ์„ ์œ ์ง€

โœ…4๏ธโƒฃ ์œ ๋‹ˆํฌ ์ •๋ ฌ ๋ฌธ์ž์—ด ๋ฐฉ์‹์˜ ๋น„๊ต

์ „๋žต ์˜ˆ์ œ ๊ธธ์ด ํŠน์ง•
ULID 01F8MECHZX3TBXYN5RRTG1X3J6 26์ž UUID๋ณด๋‹ค ์งง๊ณ , ์ƒ์„ฑ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ ๊ฐ€๋Šฅ
KSUID 0ujsswThIGTUYm2K8FjOOfXtY1K 27์ž UUID๋ณด๋‹ค ์งง๊ณ , ์‹œ๊ฐ„ ์ •๋ ฌ ๊ฐ€๋Šฅ
Short UUID + Timestame 20250201093045-8f9c7d3a ๊ฐ€๋ณ€ ๋‚ ์งœ ๊ธฐ๋ฐ˜์œผ๋กœ ์ •๋ ฌ ๊ฐ€๋Šฅ

โœ…5๏ธโƒฃ ๊ฒฐ๋ก .

  • UUID๋Š” ์ •๋ ฌ์ด ์–ด๋ ต๊ณ  ๊ธธ๋‹ค.
  • ULID, KSUID ๊ฐ™์€ ๋ฐฉ์‹์€ ์œ ๋‹ˆํฌํ•˜๋ฉด์„œ๋„ ์ƒ์„ฑ๋œ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ ๊ฐ€๋Šฅ.
  • Short UUID + Timestamp๋Š” ์ง์ ‘ ์ปค์Šคํ…€ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Œ.