Database PK ์ƒ์„ฑ ์ „๋žต (without DB, Mysql)

2024. 3. 17. 21:49ใ†Database

๊ฐ€์žฅ ์†์‰ฝ๊ฒŒ ํ…Œ์ด๋ธ”์—์„œ ์‚ฌ์šฉํ•  PK๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ๋•Œ PK๊ฐ€ ๋  ์ˆ˜์น˜ ์นผ๋Ÿผ์— AUTO_INCREMENT(MySql ๊ธฐ์ค€)๋ฅผ ๊ฑธ์–ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋ฅผ ํ†ตํ•˜๋ฉด, ๊ฐœ๋ฐœ์ž๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ PK ์นผ๋Ÿผ์„ ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ DB๊ฐ€ ์•Œ์•„์„œ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฆ๊ฐ€์‹œํ‚จ ๊ฐ’์ด ๋ ˆ์ฝ”๋“œ์— ํฌํ•จ๋˜๊ฒŒ ๋œ๋‹ค.

์ธ๋ฑ์Šค๋Š” ๊ฒฐ๊ตญ DB์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ฐœ๋…์ด๊ณ , ๊ทธ ๊ฐ’์„ DB๊ฐ€ ์ง์ ‘ ์ƒ์„ฑํ•ด์ฃผ์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด ๊ทธ๊ฑธ๋กœ ๋œ ๊ฒƒ ์•„๋‹Œ๊ฐ€? ๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์—๋„ ๊ฒฐ๊ตญ ํŠน์ • ๊ด€์ ์—์„œ๋Š” ํ•œ๊ณ„๊ฐ€ ์กด์žฌํ•œ๋‹ค.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ด ํ•œ๊ณ„๋“ค์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ  ์ด๋ฅผ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋˜๋‹ค๋ฅธ ๋ฐฉ์‹๋“ค์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๊ฒ ๋‹ค.

 

 

DB๊ฐ€ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” PK์˜ ๋ฌธ์ œ์ 

1. ๋ถ„์‚ฐ์ฒ˜๋ฆฌ ํ™˜๊ฒฝ์—์„œ PK ๊ฐ’ ์ฑ„๋ฒˆ์˜ ์–ด๋ ค์›€

์ตœ๊ทผ์—๋Š” ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ๋‹นํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„์™€ DB ์ธ์Šคํ„ด์Šค๋ฅผ ๋™์‹œ์— ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ์‹คํ–‰์‹œ์ผœ ๋ถ€ํ•˜๋ฅผ ๋ถ„๋ฐฐํ•˜๋Š” ๋ถ„์‚ฐ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด ๋Œ€๋‘๋˜๊ณ  ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ ์†์—์„œ AUTO_INCREMENT๋ฅผ ๊ฑธ์–ด๋‘” ์นผ๋Ÿผ์— ๋“ค์–ด๊ฐˆ ๊ฐ’์„ DB๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ฑ„๋ฒˆํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๋ฌผ๋ก  ๊ฐ€๋Šฅ์€ ํ•˜๋‚˜, ๊ฒฐ๊ตญ ์ด์— ๋Œ€ํ•œ ์‹ฑํฌ๋ฅผ ์œ„ํ•ด DB ๊ฐ„ ์ง€์†์ ์ธ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์ด ์š”๊ตฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฝค ํฐ ์„ฑ๋Šฅ ์ €ํ•˜ ์š”์ธ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

 

2. AUTO_INCREMENT๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€์ ์ธ ํ…Œ์ด๋ธ” ๋ฝ ์†Œ์š”

Mysql ๋‚ด๋ถ€์—์„œ AUTO_INCREMENT๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฝ์˜ ๋ชจ๋“œ ์„ค์ • ๊ฐ’์œผ๋กœ ์ค„ ์ˆ˜ ์žˆ๋Š” ์ข…๋ฅ˜๋Š” 0, 1, 2 ์ด 3๊ฐ€์ง€์ด๋‹ค. (0: traditional, 1: consecutive, 2: interleave) ์ด ๋•Œ 0์˜ ๊ฒฝ์šฐ์—” ๋งค๋ฒˆ ํ…Œ์ด๋ธ” ๋ฝ์„, 1์˜ ๊ฒฝ์šฐ์—” ๊ฐ„๋‹จํ•œ INSERT๋Š” ๋ฎคํ…์Šค๋ฅผ ํ†ตํ•œ ๊ฒฝ๋Ÿ‰๋ฝ์„ ์‚ฌ์šฉํ•˜๊ณ  Bulk INSERT์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—” ํ…Œ์ด๋ธ” ๋ฝ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ๋ฌผ๋ก  Mysql 8๋ฒ„์ „๋ถ€ํ„ฐ๋Š” ๊ธฐ๋ณธ ์„ค์ •์ด interleave๊ฐ€ ๋˜์–ด ํ…Œ์ด๋ธ” ๋ฝ์„ ํ™œ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ, ๋‹ค๋ฅธ ์š”๊ตฌ์‚ฌํ•ญ ๋•Œ๋ฌธ์— 0, 1 ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์ด๋Š” ์„ฑ๋Šฅ ์ €ํ•˜ ์š”์ธ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

 

3. (JPA ์‚ฌ์šฉ ์‹œ) ์“ฐ๊ธฐ ์ง€์—ฐ ํ™œ์šฉ๋„ ์ €ํ•˜

JPA์—๋Š” ์“ฐ๊ธฐ ์ง€์—ฐ์ด๋ผ๋Š” ๊ฐœ๋…์ด ์กด์žฌํ•œ๋‹ค. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ์˜ ์ƒํ˜ธ์ž‘์šฉ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๋ ˆ์ฝ”๋“œ์˜ ์ถ”๊ฐ€, ์ˆ˜์ • ๋“ฑ์˜ ์ž‘์—… ๊ฒฐ๊ณผ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ผ๊ณ  ํ•˜๋Š” ์ผ์ข…์˜ ์บ์‹œ์— ์ €์žฅํ•ด๋‘๊ณ  ํŠธ๋žœ์žญ์…˜์ด ๋๋‚  ๋•Œ ํ•œ๋ฒˆ ์ ์šฉํ•˜๋Š” ํ˜•ํƒœ์ธ๋ฐ, ์ด๋ฅผ ์ž˜ ํ™œ์šฉํ•  ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ DB์˜ ํ†ต์‹  ํšŸ์ˆ˜์™€ ์ฟผ๋ฆฌ ํšŸ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์–ด ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ๋„์›€์ด ๋œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ด๋Ÿฌํ•œ ์“ฐ๊ธฐ ์ง€์—ฐ์€ Mysql์˜ AUTO_INCREMENT ๋ฐฉ์‹๊ณผ๋Š” ๊ถํ•ฉ์ด ์ข‹์ง€ ๋ชปํ•˜๋‹ค. JPA์—์„œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ž„์‹œ๋กœ ์ ์žฌํ•ด๋‘๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ID(PK) ๊ฐ’์ด ํ•„์š”ํ•˜๋‹ค. (๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•จ) ๊ทธ๋Ÿฐ๋ฐ AUTO_INCREMENT๋Š” ๊ฒฐ๊ตญ DB์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ’์ด๊ณ  ์ด๋ฅผ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฒฐ๊ตญ DB ๋ ˆ๋ฒจ์—์„œ INSERT ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์‹คํ–‰์‹œ์ผœ์•ผ ํ•œ๋‹ค. ์ฆ‰, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ ์žฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์“ฐ๊ธฐ๋ฅผ ์ง€์—ฐํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ทธ ์ฆ‰์‹œ DB์— ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ ค์„œ ID ๊ฐ’์„ ๋ฐ›์•„์™€์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” Mysql์ด ์‚ฌ์šฉํ•˜๋Š” AUTO_INCREMENT ๋ฐฉ์‹ ๋ฟ ์•„๋‹ˆ๋ผ, ์˜ค๋ผํด ๋“ฑ์—์„œ ํ™œ์šฉ๋˜๋Š” SEQUENCE ๋ฐฉ์‹์—์„œ๋„ ๋‚˜ํƒ€๋‚œ๋‹ค. ๋ฌผ๋ก  ID ๊ฐ’์„ ์•Œ๊ธฐ ์œ„ํ•ด ์ง์ ‘ INSERT ์ฟผ๋ฆฌ๊นŒ์ง€ ์‹คํ–‰์‹œ์ผœ์•ผํ•ด์„œ ์“ฐ๊ธฐ ์ง€์—ฐ ์ž์ฒด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ Mysql์˜ ์ƒํ™ฉ๋ณด๋‹ค๋Š” ๋‚˜์œผ๋‚˜, ๊ทธ ๋˜ํ•œ DB์™€์˜ ์ฆ‰๊ฐ์ ์ธ ํ†ต์‹ ์ด ํ•„์š”ํ•œ ๊ฒƒ์€ ๋™์ผํ•˜๋‹ค. (์“ฐ๊ธฐ ์ง€์—ฐ์€ ํ™œ์šฉ ๊ฐ€๋Šฅ)

 

4. ๋ณด์•ˆ์ƒ์˜ ๋ฌธ์ œ

๊ทธ ์™ธ์—๋„ ์‚ฌ์šฉ์ž์—๊ฒŒ pk ๊ฐ’์ด id ๋“ฑ์˜ ํ˜•์‹์œผ๋กœ ์ „๋‹ฌ๋˜์—ˆ์„ ๋•Œ ์„œ๋น„์Šค์˜ ๊ทœ๋ชจ ๋“ฑ์„ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ณด์•ˆ ์ƒ์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๊ณ ๋ ค ํ•ด๋ณผ๋งŒํ•œ ๋Œ€์•ˆ

1. UUID

UUID V4 ์˜ˆ์‹œ

UUID๋ž€ ๋ฒ”์šฉ ๊ณ ์œ  ์‹๋ณ„์ž๋ผ๋Š” ์˜๋ฏธ๋กœ Universally Unique Identifier์˜ ์•ฝ์ž์ด๋‹ค.

ํ†ต์ƒ 128๋น„ํŠธ์˜ ํฌ๊ธฐ๋ฅผ ์ฐจ์ง€ํ•˜๋ฉฐ, ๋‹ค์–‘ํ•œ ๋ฒ„์ „์ด ์žˆ์ง€๋งŒ ์ˆœ์ˆ˜ํ•˜๊ฒŒ ๋žœ๋ค์„ฑ ๋งŒ์„ ๊ฐ–๋Š” V4๋ฅผ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

UUID์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์€ ์–ด๋–ค ์ธ์ž, ์˜์กด์„ฑ ์—†์ด๋„ ์–ธ์ œ๋“ ์ง€ ๊ณ ์œ ํ•œ ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

V4 ๊ธฐ์ค€์œผ๋กœ ์ƒ์„ฑ๋œ UUID์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 2^122(340,282,366,920,938,463,463,374,607,431,768,211,456)์ธ๋ฐ, ๋„ˆ๋ฌด ํฐ ์ˆ˜์ด๋ฏ€๋กœ ์ดํ•ด๋ฅผ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋งค ์ดˆ 10์–ต๊ฐœ์˜ UUID๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ์ด ๊ฒฝ์šฐ, 100๋…„๋™์•ˆ ํ•ด๋‹น ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ๊ฒจ์šฐ 50% ํ™•๋ฅ ๋กœ ๋‹จ ํ•˜๋‚˜์˜ ์ค‘๋ณต ๊ฐ’์ด ์ƒ์„ฑ๋˜๊ฒŒ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์ค‘๋ณต์˜ ๊ฐ€๋Šฅ์„ฑ์€ ๊ฑฐ์˜ ๋ฐฐ์ œํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์žฅ์ 

  • DB์— ์˜์กดํ•˜์ง€ ์•Š์€์ฑ„ ์‚ฌ์‹ค์ƒ ์ค‘๋ณต ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋Š” ์œ ์ผ ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ ID(PK) ๊ฐ’์„ ํ™•์ •์ง€์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— JPA์˜ ์“ฐ๊ธฐ ์ง€์—ฐ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์œ ์ €์—๊ฒŒ ๋…ธ์ถœ๋˜์–ด๋„ ์ƒ๊ด€์—†๋‹ค.
  • ๋„๋ฆฌ ์•Œ๋ ค์ง„ ๊ฐœ๋…์ด๊ณ , ๊ทธ์— ๋”ฐ๋ฅธ ๊ตฌํ˜„์ฒด๋“ค๋„ ๋งŽ๋‹ค. (Java์˜ ๊ฒฝ์šฐ์—” UUID ํƒ€์ž…๊ณผ ์ƒ์„ฑ์„ ์œ„ํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ๋นŒํŠธ์ธ util ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์กด์žฌ)

๋‹จ์ 

  • ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ˆซ์ž ์นผ๋Ÿผ์— ๋น„ํ•ด ํฌ๊ธฐ๊ฐ€ ํฌ๋‹ค. (Integer: 4๋ฐ”์ดํŠธ < 16๋ฐ”์ดํŠธ (128๋น„ํŠธ))
    • ์ด๋Š” ํŠนํžˆ Mysql ํ™˜๊ฒฝ์—์„œ PK๋กœ ์‚ฌ์šฉ๋˜๋Š” ์นผ๋Ÿผ์ด๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ์ƒ ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด Mysql์˜ ์„ธ์ปจ๋”๋ฆฌ ์ธ๋ฑ์Šค๋“ค์€ ๋ชจ๋‘ ๋ฆฌํ”„ ๋…ธ๋“œ์— PK๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต ์ €์žฅ์ด ๋งŽ์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ
  • ์™„์ „ํ•œ ๋žœ๋ค ๊ฐ’์ด ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ์˜ ์œ ์‚ฌ์„ฑ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์—†๋‹ค.
    • ์ด๋Š” ํŠนํžˆ PK๋ฅผ ์ด์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ๋ง ์ธ๋ฑ์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” Mysql์—์„œ ์„ฑ๋Šฅ ์ฒด๊ฐ์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ์œ ์‚ฌํ•œ ์„ฑ์งˆ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์‚ฌํ•œ ๋ฌผ๋ฆฌ์  ๊ณต๊ฐ„์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์–ด ์ด๋Ÿฌํ•œ ์„ฑ์งˆ์„ ์ด์šฉํ•œ ์กฐํšŒ ์‹œ ์ ์€ ํŽ˜์ด์ง€๋งŒ์„ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋ง ์ธ๋ฑ์Šค์˜ ์ด์ ์ด ํ•˜๋‚˜ ์‚ฌ๋ผ์ง€๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ(์‹ค์งˆ์ ์ธ ํด๋Ÿฌ์Šคํ„ฐ๋ง ํŒฉํ„ฐ์˜ ์ €ํ•˜๋กœ ๋ณผ ์ˆ˜ ์žˆ์Œ)
    • ์ด๋Š” ๋˜ํ•œ INSERT ์ฟผ๋ฆฌ์˜ ์„ฑ๋Šฅ ์ €ํ•˜๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

 

2. ULID

 

GitHub - ulid/spec: The canonical spec for ulid

The canonical spec for ulid. Contribute to ulid/spec development by creating an account on GitHub.

github.com

์ถœ์ฒ˜:&nbsp;https://blog.tericcabrel.com/discover-ulid-the-sortable-version-of-uuid/

ULID๋ž€ ๊ธฐ์กด UUID๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋˜ ๋ฌธ์ œ๋“ค์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฐœ๋…์ด๋‹ค. UUID์™€ ๋™์ผํ•œ 128๋น„ํŠธ์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์•ž์„  48๋น„ํŠธ๋Š” ํƒ€์ž„์Šคํƒฌํ”„(๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๊นŒ์ง€)๋ฅผ ์˜๋ฏธํ•˜๊ณ  ๋‚˜๋จธ์ง€ 80๋น„ํŠธ๋Š” ๋žœ๋ค๊ฐ’์ด ํฌํ•จ๋œ๋‹ค.

๋Œ€ํ‘œ์ ์ธ ULID์˜ ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • 128๋น„ํŠธ๋ฅผ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด UUID์™€์˜ ํ˜ธํ™˜์„ฑ ์กด์žฌ
  • ๊ฐ ms๋‹น 2^80์˜ ๊ณ ์œ ์‹๋ณ„์ž ์ƒ์„ฑ ๊ฐ€๋Šฅ
  • ULID์— ํฌํ•จ๋˜๋Š” ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์ƒ์„ฑ์‹œ๊ฐ„์œผ๋กœ ์ทจ๊ธ‰ํ•  ๊ฒฝ์šฐ UUID V4์™€ ๋‹ฌ๋ฆฌ ์ •๋ ฌ ๊ฐ€๋Šฅ

ULID์˜ ์ŠคํŽ™ ์ค‘์—์„œ๋Š” Monotonicity(๋‹จ์กฐ์„ฑ)์ด๋ผ๋Š” ์ŠคํŽ™์ด ์กด์žฌํ•˜๋Š”๋ฐ, ์ด๋Š” ๋™์ผํ•œ ms์—์„œ ์ค‘๋ณต์œผ๋กœ ULID ์ƒ์„ฑ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋Š” ๊ฒฝ์šฐ ๋’ค์— 80๋น„ํŠธ๋ฅผ ๋žœ๋คํ•˜๊ฒŒ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ง์ „ ์ƒ์„ฑํ•œ ULID์˜ 80๋น„ํŠธ์—์„œ ๋”ฑ 1์„ ์ฆ๊ฐ€์‹œํ‚จ๋งŒํผ์˜ ๊ฐ’์„ ๊ฐ–๋„๋ก ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ด๋ฅผ ํ™œ์šฉํ•  ๊ฒฝ์šฐ ํ›„์œ„ 80๋น„ํŠธ๋ฅผ ์™„์ „ ๋žœ๋คํ•˜๊ฒŒ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๋น„๊ตํ•ด์„œ ๋” ์ค‘๋ณต ๊ฐ€๋Šฅ์„ฑ์ด ์ค„์–ด๋“ค๊ณ , ์ƒ์„ฑ ์„ฑ๋Šฅ ์ƒ์˜ ์ด์ ๋„ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ๋˜ํ•œ ULID ์ƒ์„ฑ ์ˆœ์„œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์™„์ „ํ•œ ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

์žฅ์ 

  • UUID์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ค‘๋ณต์˜ ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ํฌ๋ฐ•ํ•œ ์‹๋ณ„์ž๋ฅผ DB์— ์˜์กดํ•˜์ง€ ์•Š์€ ์ฑ„ ํš๋“ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • JPA ์“ฐ๊ธฐ ์ง€์—ฐ ํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์œ ์ €์—๊ฒŒ ๋…ธ์ถœ๋˜์–ด๋„ ๊ดœ์ฐฎ๋‹ค.
  • UUID ๋งŒํผ์€ ์•„๋‹ˆ์ง€๋งŒ ULID๋„ ๊ตฌํ˜„์ฒด๊ฐ€ ๋งŽ์€ ํŽธ์ด๋‹ค.
  • (Monotonicity ์ŠคํŽ™์„ ์ฐจ์šฉํ•  ๊ฒฝ์šฐ) ์ƒ์„ฑ๋˜๋Š” ๋ชจ๋“  ULID๋ฅผ ์ƒ์„ฑ ์‹œ์ ์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. 

๋‹จ์ 

  • UUID์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๊ธฐ ์œ„ํ•ด ํฐ ํƒ€์ž…์„ ํ• ๋‹นํ•ด์•ผํ•˜๊ณ  ๊ทธ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋‹ค.

 

3. TSID

 

GitHub - f4b6a3/tsid-creator: A Java library for generating Time-Sorted Unique Identifiers (TSID).

A Java library for generating Time-Sorted Unique Identifiers (TSID). - f4b6a3/tsid-creator

github.com

TSID์˜ ๊ตฌ์กฐ

TSID๋ž€ 64๋น„ํŠธ์˜ ๊ธธ์ด๋ฅผ ๊ฐ€์ง€๋Š” ํ˜•ํƒœ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ ์ „์œ„ 42๋น„ํŠธ๋Š” ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๊ณ , ํ›„์œ„ 22๋น„ํŠธ๋Š” ๋žœ๋ค ๊ฐ’์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

TSID๊ฐ€ ๊ฐ–๋Š” ํŠน์ง•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • 64๋น„ํŠธ์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง
  • ์ƒ์„ฑ ์‹œ์  ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ ๊ฐ€๋Šฅ

์œ„ ํŠน์ง•๋“ค์„ ๋ณด๋ฉด ULID์˜ ํŠน์ง•๊ณผ ๊ต‰์žฅํžˆ ์œ ์‚ฌํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋ฉด์„œ๋„ ํฌ๊ธฐ๋Š” ๊ทธ ์ ˆ๋ฐ˜์„ ๊ฐ–๋Š”๋‹ค. ์ด๊ฒŒ ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ผ๊นŒ?

์šฐ์„  ์‹œ๊ฐ„ ๋น„ํŠธ๋ฅผ ๋ณด๋ฉด 42๋น„ํŠธ๋ฅผ ๊ฐ–๋Š”๋‹ค. ์—ฌ๊ธฐ์—์„œ ๊ธฐ์กด ULID์™€ ๋น„๊ตํ•˜์—ฌ 6๋น„ํŠธ๋ฅผ ์•„๋‚€ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์‹œ๊ฐ„ ๋น„ํŠธ๋ฅผ ์ค„์˜€๋‹ค๋Š” ๊ฒƒ์˜ ์˜๋ฏธ๋Š” ๊ฒฐ๊ตญ TSID๊ฐ€ ์ปค๋ฒ„ํ•˜๋Š” ์‹œ์ ์ด ULID์— ๋น„ํ•ด ์ ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋กœ ์ธํ•ด, TSID์˜ ์‹œ๊ฐ„ ๊ฐ’์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” Unix-time ๋‹จ์œ„์˜ 1970-01-01T00:00๋ฅผ ์‹œ์ž‘์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , 2020-01-01T00:00์„ ์‹œ์ž‘์ ์œผ๋กœ ํ•˜๋Š” ms ๊ฐ’์ด ๋œ๋‹ค. ๋˜ํ•œ 42๋น„ํŠธ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๊ฐ„์€ ๋Œ€๋žต 139๋…„ ์ •๋„์ด๋‹ค. (Unsigned Integer๋ฅผ ํ™œ์šฉํ•œ๋‹ค๋Š” ๊ฐ€์ • ํ•˜์—. Signed Integer๋ผ๋ฉด ์ ˆ๋ฐ˜ ์ˆ˜์ค€์œผ๋กœ ์ค„์–ด๋“ฆ) ์ดํ›„์— ์•Œ๊ฒŒ๋œ ๋‚ด์šฉ์ด์ง€๋งŒ, ์‹œ๊ฐ„ ์Šค์ผ€์ผ์„ 42๋น„ํŠธ๋กœ ์ค„์—ฌ์„œ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์€ Twitter์˜ Snowflakes์—์„œ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ๊ณ  ํ•œ๋‹ค.

์šฐ๋ฆฌ๋Š” ์„œ๋น„์Šค์— PK๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฅผ ๊ณ ๋ คํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ์ด์ •๋„ ๊ธฐ๊ฐ„์ด๋ผ๋ฉด ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋œ๋‹ค.

๋‚˜๋จธ์ง€ 22๋น„ํŠธ๋Š” ๋˜๋‹ค์‹œ node์™€ counter ํŒŒํŠธ๋กœ ๋‚˜๋‰˜๋Š”๋ฐ, ์ด ๋•Œ node๋Š” 0 ~ 20 ๋น„ํŠธ๊นŒ์ง€ ์กฐ์ • ๊ฐ€๋Šฅํ•œ ๊ฐ’์ด๋‹ค. ์—ฌ๊ธฐ์„œ node๋ž€, ๊ธฐ๊ธฐ๋‚˜ ์ธ์Šคํ„ด์Šค์˜ ID ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด์–ด ์ด๋ฅผ ํ†ตํ•œ ๊ทผ๋ณธ์  ์ค‘๋ณต ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์กด์žฌํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ๋งŒ์•ฝ 2๊ฐœ์˜ ์ธ์Šคํ„ด์Šค์—์„œ ์ƒ์„ฑ๋˜๋Š” Tsid ๊ฐ’์ด ์ค‘๋ณต์—์„œ ์™„์ „ํžˆ ์ž์œ ๋กœ์›Œ์•ผ ํ•œ๋‹ค๋ฉด, ์ด ๊ฐ’์„ 2๋กœ ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. 

node๋กœ ์‚ฌ์šฉ๋œ ๋น„ํŠธ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋‚˜๋ฉด ๋‚จ์€ ๋น„ํŠธ๋“ค์€ ์ „๋ถ€ counter๋กœ ์ทจ๊ธ‰๋˜๋ฉฐ ๋žœ๋ค ๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์ด์šฉ๋œ๋‹ค. ์ด ๋•Œ ๋™์ผ ms์— ์ƒ์„ฑ๋˜๋Š” ๊ฐ’๋“ค์— ๋Œ€ํ•ด์„œ๋Š” ULID์˜ Monotonicity ์ŠคํŽ™๊ณผ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.

์žฅ์ 

  • UUID ์ •๋„๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ค‘๋ณต์˜ ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋ฐ•ํ•œ ์‹๋ณ„์ž๋ฅผ DB์— ์˜์กดํ•˜์ง€ ์•Š์€ ์ฑ„ ํš๋“ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • UUID ์ŠคํŽ™์— ๋น„ํ•ด ํฌ๊ธฐ๊ฐ€ ์ ˆ๋ฐ˜ ์ˆ˜์ค€์ด๋‹ค.
  • JPA ์“ฐ๊ธฐ ์ง€์—ฐ ํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์œ ์ €์—๊ฒŒ ๋…ธ์ถœ๋˜์–ด๋„ ๊ดœ์ฐฎ๋‹ค.
  • TSID๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” Java ๊ตฌํ˜„์ฒด๊ฐ€ ์กด์žฌํ•œ๋‹ค.
  • ์ƒ์„ฑ๋˜๋Š” ๋ชจ๋“  TSID๋ฅผ ์ƒ์„ฑ ์‹œ์ ์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. 

๋‹จ์ 

  • (๊ฐœ์ธ์ ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋‚˜) ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ์‹œ์ ์˜ ๊ธฐ๊ฐ„์ด ์ƒ๋Œ€์ ์œผ๋กœ ์งง๋‹ค.
  • UUID, ULID์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ ์ค‘๋ณต ๊ฐ€๋Šฅ์„ฑ์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋†’๋‹ค.

 

 

์ฐธ์กฐ

 

MySQL :: MySQL 8.3 Reference Manual :: 17.6.1.6 AUTO_INCREMENT Handling in InnoDB

17.6.1.6 AUTO_INCREMENT Handling in InnoDB InnoDB provides a configurable locking mechanism that can significantly improve scalability and performance of SQL statements that add rows to tables with AUTO_INCREMENT columns. To use the AUTO_INCREMENT mechani

dev.mysql.com

 

 

LINE ์˜คํ”ˆ์ฑ— ์„œ๋ฒ„๊ฐ€ 100๋ฐฐ ๊ธ‰์ฆํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ์„ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•

Tech-Verse 2022์—์„œ ๊น€์ธ์ œ ๋‹˜์ด ๋ฐœํ‘œํ•œ LINE ์˜คํ”ˆ์ฑ— ์„œ๋ฒ„๊ฐ€ 100๋ฐฐ ๊ธ‰์ฆํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ์„ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ• ์„ธ์…˜ ๋‚ด์šฉ์„ ์˜ฎ๊ธด ๊ธ€์ž…๋‹ˆ๋‹ค. ์•ˆ๋…•ํ•˜์„ธ์š”. Square Dev ํŒ€ ๊น€์ธ์ œ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” LINE ์˜คํ”ˆ์ฑ—(OpenCha

engineering.linecorp.com

 

 

UUID๊ฐ€ ๊ฒน์น˜๋ฉด ์–ด์ฉŒ์ง€?

์ด ๊ธ€์€ koreanhole ๋‹˜์˜ ๊ธ€์ž…๋‹ˆ๋‹ค. Intro ์ตœ๊ทผ UOS๊ณต์ง€์‚ฌํ•ญ ์•ฑ์˜ ๋ฐฑ์—”๋“œ ์‹œ์Šคํ…œ์„ ๊ต์ฒดํ•˜๋Š” ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด Firebase์˜ Firestore๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ์ด๋ฒˆ์— ์ƒˆ๋กญ๊ฒŒ Nestjs๋กœ ์„œ๋ฒ„๋ฅผ ์ž‘์„ฑํ•˜๋Š”

kingofbackend.tistory.com