๋ํ๋ง 14๊ธฐ์์ ์ฐธ์ฌ ์ค์ธ ํ๋ก์ ํธ์์ ๋ฐฑ์๋ ๋ฆฌ๋ ๋ถ์ด ์ํฐํฐ์ id๋ฅผ UUID, ULID๋ก ์ค์ ํ ๊ฒ์ ๋ณด์๋ค. ๋ IDENTITY๋ก ์ค์ ํ์ฌ MySQL์ด AUTO_INCREMENT๋ก ๊ด๋ฆฌํ๋๋ก ์์ํ๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด ๋ฐฉ์๊ณผ ๋๋นํด์ ์ด๋ค ์ฅ์ ์ด ์๊ธธ๋ ์ฌ์ฉํ๋์ง ์์๋ณด์๋ค.
AUTO_INCREMENT ์ ๋ต์ ๋จ์
์ธ๋ถ์์ ์์ธกํ๊ธฐ ์ฌ์ด PK
PK๊ฐ ์ ํ์ ์ผ๋ก ์ฆ๊ฐํ๋ ์ ์์ด๊ธฐ ๋๋ฌธ์, ํน์ ๋ฐ์ดํฐ์ PK๋ฅผ ์์ธกํ๊ธฐ ์ฌ์์ง๋ค. ์ค์ ๋ก request๋ค์ ํ๋ผ๋ฏธํฐ๋ฅผ ํ ์คํธํ ๋ ์ข ์ข ๋๊ผ๋ ๊ฒ์ด๋ค. ํ์ฌ ์ ์ ์ id 2000์ด๋ฉด 1 ~ 1999๊น์ง์ id๋ฅผ ๊ฐ์ง ์ ์ ๊ฐ ์กด์ฌํ ํ๋ฅ ๋ ๋์ ๊ฒ์ด๋ค. ์ด๋ ๋จ์ํ ๋ ธ์ถ๋๋ค์ ๋ฌธ์ ๋ฅผ ๋์ด SQL Injection ๊ณต๊ฒฉ์๋ ์ทจ์ฝํด์ง๋ค.
DB์ ์์กด์ ์ธ PK
๊ฐ๋ฐ ํธ์์ฑ์ ์ํด PK ์์ฑ ์ฑ ์์ DB์ ์์ํ๋ ๊ฒ์ด์ง๋ง, ๋ฐ๋๋ก DB์ ์์กด์ ์ด๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ์ ์ฝ์ด ๋ฐ์ํ๋ค. ์ค์ ์ง์ค์์ผ๋ก ์๋ก์ด id ๊ฐ์ ์์ฑํ๋ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์, DB๋ฅผ 2๊ฐ ์ด์ ์ฌ์ฉํ๋ ๋ถ์ฐ ํ๊ฒฝ์์๋ id์ ์ค๋ณต์ ๋ง๊ธฐ ํ๋ค๊ณ DB๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด AUTO_INCREMENT ์ค์ ์ ๋๊ธฐํ์์ผ์ผ ํ๋ ๋ฑ ํ์ฅ๊ณผ ๋ณ๊ฒฝ์ ์ ํ์ด ๋ง๋ค.
ID ๊ณ ๊ฐ
BIGINT ์ต๋ ๊ฐ์ 42์ต์ด๊ณ , unsigned BIGINT๋ผ๋ฉด 1,844๊ฒฝ์ด๋ค. ์์ฒญ๋๊ฒ ํฐ ๊ฐ์ด๋ผ ๊ณ ๊ฐ๋ ์ผ์ด ์๋ค๊ณ ์๊ฐํ ์ ์์ง๋ง, ์๋น์ค๊ฐ ๊ธ์ฑ์ฅํ๋ค๋ฉด ๊ทธ๋ฐ ๊ฒ๋ง์ ์๋๋ค. ๋ฐฐ๋ฌ์ ๋ฏผ์กฑ์ ํ ๋ฌ์ 1์ต3์ฒ๋ง ๊ฑด์ ์ฃผ๋ฌธ์ด ๋ฐ์ํ๋ค. ๊ธ์ ์ ๊ฑฐ๋๊ฐ ๋ฐ์ํ๋ ์ฃผ๋ฌธ์ด ์ด ์ ๋์ธ๋ฐ, ๋๊ธ์ด๋ผ๋ฉด? ๋๊ธ์ ๋ฌ๋ฆฌ๋ ์ข์์๋ผ๋ฉด? ๋ก๊น ํ ์ด๋ธ์ด๋ผ๋ฉด? ์ด๋จ๊น. ์ฅ์ ๊ฐ ๋ฐ์ํ๋ฉด ํฐ ๊ธ์ ์ ์ํด๊ฐ ๋ฐ์ํ๋ ์์ฉ ์๋น์ค์์ ์ด๋ฐ ๊ฐ๋ฅ์ฑ์ ๊ฐ๊ณผํด์๋ ์๋ ๊ฒ์ด๋ค.
UUID v4 ์ ๋ต
UUID ๊ฐ ์์ : 4dfc6b14-7213-3363-8009-b23c56e3a1b1
์ซ์์ ์ํ๋ฒณ 128bit ๋ก ์ด๋ฃจ์ด์ง๋ค. (๋์๋ฌธ์ ๊ตฌ๋ณ x) ์ต๋๊ฐ์ 340,282,366,920,938,463,463,374,607,431,768,211,456 ๊ฐ์ด๊ณ , ์ถฉ๋ ํ๋ฅ ์ 0.00000000006%์ ๋ถ๊ณผํ๊ธฐ ๋๋ฌธ์, ํ ์ด๋ธ์ ์ค๋ณต ์ฌ๋ถ๋ฅผ ํ์ธํ ํ์์์ด ๊ทธ๋ฅ ์์ฑํจ์ผ๋ก์จ ์๋ฒ ๊ฐ ์กฐ์จ ์์ด ๋ ๋ฆฝ์ ์ผ๋ก ์์ฑ ๊ฐ๋ฅํด์ง๋ค. ๋ฒ์ ๋ณ๋ก UUID ์คํ์ด ๋ค์ ๋ค๋ฅด์ง๋ง, DB PK์๋ ์ฃผ๋ก v4๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํ๋ค.
๐ ์ฅ์
- ๋๊ธฐํ ์ด์ X
- ๊ท๋ชจ ํ์ฅ ์ฌ์
๐ ๋จ์
- ID ๊ฐ์ด 128bit ๋ก ๊ธธ๋ฉฐ ์ฉ๋๋ ํผ
- ๋๊ท๋ชจ ํ ์ด๋ธ์์ ๋ง์ ์ ์ฅ๊ณต๊ฐ์ ์ฐจ์ง
- ์๊ฐ์ ์ ๋ ฌ X
- InnoDB ์ธ๋ฑ์ค๋ B-Tree ๊ตฌ์กฐ์ด๋ฉฐ ๋ Clusterd index ๊ตฌ์ฑํ๊ธฐ ๋๋ฌธ์, ์์ฐจ์ฑ ์์ด ๋๋คํ๊ฒ ์์ฑ๋๋ UUID๋ ์ฑ๋ฅ ์ ํ๊ฐ ํฌ๊ฒ ๋ฐ์ (์ ๋ ฌ๋ ์ํ๋ก ์ฐจ๋ก๋ก ์ถ๊ฐํ๋ฉด ํธ๋ฆฌ ๊ตฌ์ฑ์ด ํฌ๊ฒ ๋ณํ์ง ์์ง๋ง, ๋ฌด์์๋ก ์ถ๊ฐ๋๋ฉด ๋งค๋ฒ ๊ตฌ์ฑ์ด ๋ณํจ)
- ์ซ์๊ฐ ์๋ ๊ฐ ํฌํจ
- ๋ฌธ์ ๋จ์๋ก ๋น๊ต๋๊ธฐ ๋๋ฌธ์, ์ ์ ID์ ๋น๊ตํ๋ฉด ์ฑ๋ฅ์ด ๋๋ฆผ
- ์ถฉ๋๊ฐ๋ฅ์ฑ์ด ํฌ๋ฐํ์ง๋ง ์กด์ฌ
ULID ์ ๋ต
ULID ๊ฐ ์์ : 01ARZ3NDEKTSV4RRFFQ69G5FAV
UUID์ ๋จ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋ง๋ค์ด์ก๋ค. ๋๊ฐ์ด 128bit๋ก ์ด๋ฃจ์ด์ ธ ์์ง๋ง, ์ 48bit๋ ๊ธฐ์์๊ฐ์ธ Epoch(๋ฐ๋ฆฌ์ด)๋ก ์ธ์ฝ๋ฉํด ์์ฑํ๊ณ ๋ค 80bit ๋ ๋ฌด์์๋ก ์์ฑํ๋ค. ๋ฐ๋ผ์ ๋ฐ๋ฆฌ์ด์ ์ ๋ฐ๋๋ฅผ ๊ฐ์ง๋ฉฐ ๋จ์ํ๊ฒ ์ฆ๊ฐํ๋ฉฐ, ๋ฐ๋ฆฌ์ด ๋ด์ ๋์ ์์ฑ๋๋ฉด ๋ฌด์์์ฑ์ ๋ฐ๋ผ ์์๊ฐ ๋ฌ๋ผ์ง.
๐ ์ฅ์
- UUID์ 36๋ฌธ์์ ๋ฌ๋ฆฌ ULID๋ 26๋ฌธ์๋ก ์ธ์ฝ๋ฉ
- UUID๋ Base16 + ๋์ฌ๋ฐ, ULID๋ Base32๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ULID๊ฐ ๋ ์งง์ ๋ฌธ์์ด์ ๊ฐ์ง (Base16: 16์ง์๋ก ๊ฐ ๋ฌธ์๊ฐ 4๋นํธ๋ฅผ ํํ, Base32: 32์ง์๋ก ๊ฐ ๋ฌธ์๊ฐ 5๋นํธ)
- ํน์ ๋ฌธ์๊ฐ ํฌํจ๋์ง ์์, URL๋ก ์ฌ์ฉํ๊ธฐ ์์
- UUID์ "-"(๋์ฌ๋ฐ)๊ฐ ์์
- ์๊ฐ์ ์ ๋ ฌ ๊ฐ๋ฅ
- ์ฑ๋ฅ ์ ํ๊ฐ ์ ๊ณ , ์ถฉ๋ ํ๋ฅ ์ด ๊ฑฐ์ ์์
- ํจ์จ์ฑ๊ณผ ๊ฐ๋
์ฑ์ ์ํด Crockford์ Base32 ์ฌ์ฉ
- "I", "L", "O", "U" ์ ์ธ๋จ
๐ ๋จ์
- 128bit๋ก ์ฌ์ ํ ์ฉ๋์ด ํผ
- ๊ธฐ๋ณธ์ ์ผ๋ก Java ๋ฌธ๋ฒ์์ ์ง์ํ๋ UUID์ ๋ฌ๋ฆฌ, ULID generator๋ฅผ ์ ์ํด์ผ ํจ
TSID (Time-Sorted Unique Identifier)
https://github.com/f4b6a3/tsid-creator
์๋ฐ ๋ํ์๋ ์์๋ค. twitter์ snowflake์ ULID์ ์์ด๋์ด๋ฅผ ๊ฒฐํฉํ ๊ฒ์ผ๋ก, ULID์ ์ฅ์ ์ ๋ ํฅ์์ํค๋ฉด์๋ ๋จ์ ๋ค์ ํด๊ฒฐํ๋ค. 2020-01-01 00:00:00 UTC ์ดํ์ ๋ฐ๋ฆฌ์ด 42bit์ nodeId + counter๋ก ๊ตฌ์ฑ๋ ๋๋ค๊ฐ 12~22bit๋ก ์ด๋ฃจ์ด์ง๋ค. ๋ถํธ๊ฐ ์๋ค๋ฉด 69๋ ๋์ ์ฌ์ฉ๊ฐ๋ฅํ๊ณ , ๋ถํธ๊ฐ ์๋ค๋ฉด 139๋ ๋์ ์ฌ์ฉ๊ฐ๋ฅํ๋ค. ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ 1970๋ ์ ์ ์๋์์ผ๋๊น 53๋ ์ง๋ฌ๋ค. 69๋ ์ด๋ด์ ํ๋ก์ ํธ๊ฐ ๊ฐํธ๋๊ฑฐ๋ ํ์ฌ๊ฐ ๋งํ์ง ์์๊น?
๐ ์ฅ์
- UUID/ULID๋ณด๋ค 64bit๋ก ๋ ์ ์ ์ฉ๋์ด๊ณ , 13์ ๋ฌธ์๋ก ๋ ์งง์ ๊ธธ์ด
- ํจ์จ์ฑ๊ณผ ๊ฐ๋ ์ฑ์ ์ํด Crockford์ Base32 ์ฌ์ฉ
- ํน์ ๋ฌธ์๊ฐ ํฌํจ๋์ง ์์, URL๋ก ์ฌ์ฉํ๊ธฐ ์์
- ์๊ณ์ด ์ ๋ ฌ์ด ๊ฐ๋ฅํด, ์ฑ๋ฅ ์ ํ๊ฐ ์ ๊ณ ์ถฉ๋ ํ๋ฅ ์ด ๊ฑฐ์ ์์
- JPA, Hibernate์์ ๊ตฌํ๋์ด ์์ด, ๊ฐ๋จํ ์ฌ์ฉ ๊ฐ๋ฅ
๐ ๋จ์
- 69๋ ๋๋ 139๋ ๋์๋ง ์ฌ์ฉ ๊ฐ๋ฅ
- hibernate > 6
์ ์ฉ๋ฒ
implementation 'io.hypersistence:hypersistence-utils-hibernate-60:3.5.1'
import io.hypersistence.utils.hibernate.id.Tsid;
import jakarta.persistence.Id;
public class Member {
@Id @Tsid
private Long id;
}
๊ฒฐ๋ก
- ์ฑ๋ฅ์ด ์ค์ํ๊ฑฐ๋, ์๊ท๋ชจ ํ๋ก์ ํธ์ด๊ฑฐ๋, ๋ง์ ๋ฐ์ดํฐ๊ฐ ์์ด์ง ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ผ๋ฉด, ๊ธฐ์กด์ AUTO_INCREMENT๋ฅผ ์ฌ์ฉํด๋ ๋ฌธ์ ์์.
- ์ ๋งํ๋ฉด TSID/ULID๋ฅผ ์ฌ์ฉ (๋จ, Hibernate > 6 ๋ง TSID ์ฌ์ฉ ๊ฐ๋ฅ)
- ์ถ์ธก๊ฐ๋ฅํ ID ๋ฐฉ์ง
- ๋ถ์ฐ ํ๊ฒฝ