Home
>
DB
>
๐พ[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๋ ์ง์ ์ปค์คํ
ํ์ฌ ์ฌ์ฉํ ์๋ ์์.