ํ”ผ๋“œ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
Stop Using UUIDs: Why B2B SaaS Needs ULIDs in Laravel ๐Ÿ˜
Dev.toDev.to
Database

B-Tree Fragmentation ํ•ด๊ฒฐ์„ ํ†ตํ•œ ULID ๊ธฐ๋ฐ˜ O(1) ์“ฐ๊ธฐ ์„ฑ๋Šฅ ํ™•๋ณด

Stop Using UUIDs: Why B2B SaaS Needs ULIDs in Laravel ๐Ÿ˜

Prajapati Paresh2026๋…„ 5์›” 25์ผ3๋ถ„intermediate

Context

Auto-incrementing ID์˜ ID Enumeration ์ทจ์•ฝ์  ํ•ด๊ฒฐ์„ ์œ„ํ•ด UUIDv4๋ฅผ ๋„์ž…ํ–ˆ์œผ๋‚˜, ๋ฐ์ดํ„ฐ ๊ทœ๋ชจ ์ฆ๊ฐ€์— ๋”ฐ๋ฅธ B-Tree Index Fragmentation ๋ฐœ์ƒ. ์ด๋กœ ์ธํ•œ ๋ฌด์ž‘์œ„ ์‚ฝ์ž… ๊ณผ์ •์—์„œ ๋…ธ๋“œ ๋ถ„ํ•  ๋ฐ ์žฌ๊ท ํ˜• ์ž‘์—…์ด ๋นˆ๋ฒˆํ•ด์ง€๋ฉฐ CPU ๋ฐ RAM ์‚ฌ์šฉ๋Ÿ‰์ด ๊ธ‰์ฆํ•˜๋Š” ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ์ง€์  ํ™•์ธ.

Technical Solution

  • Timestamp ๊ธฐ๋ฐ˜์˜ Lexicographically Sortable ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ULID ๋„์ž…์„ ํ†ตํ•œ ์ˆœ์ฐจ์  ์‚ฝ์ž… ๊ตฌ์กฐ ์„ค๊ณ„
  • UUIDv4์˜ ๋ฌด์ž‘์œ„์„ฑ์„ ๋ฐฐ์ œํ•˜๊ณ  ์ƒ์„ฑ ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ์ •๋ ฌ ๊ฐ€๋Šฅ์„ฑ์„ ํ™•๋ณดํ•˜์—ฌ B-Tree Append-only ์“ฐ๊ธฐ ์„ฑ๋Šฅ ๊ตฌํ˜„
  • Laravel์˜ HasUlids Trait๋ฅผ ํ™œ์šฉํ•œ Eloquent ๋ชจ๋ธ์˜ Primary Key ์ƒ์„ฑ ๋กœ์ง ์ถ”์ƒํ™”
  • Database Schema์˜ Primary Key ํƒ€์ž…์„ CHAR(26)์œผ๋กœ ์ตœ์ ํ™”ํ•˜์—ฌ ์Šคํ† ๋ฆฌ์ง€ ํšจ์œจ์„ฑ ์ฆ๋Œ€
  • ID ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅ์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฌผ๋ฆฌ์  ์ €์žฅ ๊ตฌ์กฐ์˜ ํšจ์œจ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•œ ์•„ํ‚คํ…์ฒ˜ ์ „ํ™˜

1. ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ ํ™˜๊ฒฝ์—์„œ ๋ฌด์ž‘์œ„ UUIDv4 ์‚ฌ์šฉ ์‹œ B-Tree ์ธ๋ฑ์Šค ํŒŒํŽธํ™” ๊ฐ€๋Šฅ์„ฑ ๊ฒ€ํ† 

2. ๋ณด์•ˆ์„ฑ๊ณผ ์“ฐ๊ธฐ ์„ฑ๋Šฅ์„ ๋™์‹œ์— ํ™•๋ณดํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ULID ๋˜๋Š” UUIDv7 ๊ฐ™์€ ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ์‹๋ณ„์ž ๊ณ ๋ ค

3. Laravel ํ™˜๊ฒฝ์—์„œ HasUlids ์ ์šฉ ์‹œ $incrementing = false ๋ฐ $keyType = 'string' ์„ค์ • ํ•„์ˆ˜ ํ™•์ธ

4. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹œ ulid() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•œ ์ „์šฉ ์ปฌ๋Ÿผ ํƒ€์ž… ์ง€์ • ์—ฌ๋ถ€ ํ™•์ธ

์›๋ฌธ ์ฝ๊ธฐ