๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
MySQL

[MySQL] AUTO INCREMENT vs UUID

by ๊ฐœ๋ฐœLOG 2024. 2. 10.
๋ฐ˜์‘ํ˜•

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ๋•Œ PK ์„ค์ •์— ๋Œ€ํ•ด Auto Increment๋ฅผ ์‚ฌ์šฉํ•  ์ง€ , uuid๋ฅผ ์‚ฌ์šฉํ• ์ง€ ๊ณ ๋ฏผ์ด ๋œ๋‹ค.
๋‘ ์ฐจ์ด์ ์„ ๋ช…ํ™•ํžˆ ํŒŒ์•…ํ•˜์—ฌ PK๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •ํ•˜์ž.

AUTO INCREMENT

  • auto increment๋Š” ํ‚ค๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ ์‰ฌ์›Œ ๋ณด์•ˆ์— ์ทจ์•ฝํ•˜๋‹ค.
  • intํƒ€์ž…
  • ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค. ( ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์žˆ๋Š” ์ƒํ™ฉ์—์„œ insert๋ฅผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ž. ๋ณ„๋‹ค๋ฅธ ๋™๊ธฐํ™”๊ฐ€ ๋˜์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค A ๊ฐ€ insert๋ฅผ ๋ฐ›์œผ๋ฉด 1,2,3,4,5,6์œผ๋กœ ํ‚ค๊ฐ€ ์ฆ๊ฐ€ํ• ๊ฑฐ๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค B ๋˜ํ•œ insert ์ฟผ๋ฆฌ๋ฅผ ๋ฐ›์œผ๋ฉด 1,2,3,4,5,6์œผ๋กœ ํ‚ค๊ฐ€ ์ฆ๊ฐ€ํ• ๊ฒƒ์ด๋‹ค. ์ฆ‰ Duplicate Key๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ๊ฒƒ์ด๋‹ค. )
  • uuid๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋œ ์ฐจ์ง€ํ•˜๊ณ , insert ์‹œ๊ฐ„์ด ์ ์–ด ๋น ๋ฅด๋‹ค.
  • ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ์“ฐ์ž„

UUID

  • 128๋น„ํŠธ ๊ธธ์ด์˜ ๋ฐ์ดํ„ฐ๋กœ, 5๊ฐœ์˜ 16์ง„์ˆ˜๋กœ ๊ตฌ์„ฑ๋œ UTF-8 ๋ฌธ์ž์—ด์ด๋‹ค.
  • ๋ณด์•ˆ์— ์ข‹๋‹ค.
  • UUID๋ฅผ ์–ด๋””์„œ๋“ ์ง€ ๋งŒ๋“ค๊ณ  ๊ณ ์œ ์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์–ด ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์— ์šฉ์ดํ•˜๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ๋งŽ์ด ์ฐจ์ง€ํ•จ
  • insertํ•  ๋•Œ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฐ๋‹ค.
  • ์„ฑ๋Šฅ์˜ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚จ๋‹ค (ํด๋Ÿฌ์Šคํ„ฐ ์ธ๋ฑ์Šค์˜ ์ •๋ ฌ ๋น„์šฉ์ด ๋งŽ์ด ๋“ ๋‹ค)

๊ฒฐ๋ก 

๋‹จ์ผ DB๋ฅผ ์“ฐ๋ฉด AUTO_INCREMENT๋ฅผ ํ‚ค๋กœ ์“ฐ์ž. (์„ฑ๋Šฅ, ๋ฉ”๋ชจ๋ฆฌ ์ธก๋ฉด์—์„œ ๋” ๋‚ซ๋‹ค.)

๋‹ค์ค‘ DB๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ„์‚ฐํ˜• ํ™˜๊ฒฝ์ด๋ฉด ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด UUID๋ฅผ ํ‚ค๋กœ ์“ฐ๋Š” ๊ฑธ ๊ณ ๋ คํ•ด๋ณด์ž


< ์ถ”๊ฐ€ ๋ณด์ถฉ ์„ค๋ช… >

JPA๋ฅผ ์‹œ์šฉํ•ด auto increment๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ๋‚˜์˜จ๋‹ค.

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@GeneratedValue(strategy = GenerationType.IDENTITY)

 

์œ„์˜ ์• ๋…ธํ…Œ์ด์…˜์˜ ์˜๋ฏธ๋Š” ๊ธฐ๋ณธํ‚ค ์ƒ์„ฑ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์œ„์ž„ํ•œ๋‹ค. (= auto_increment) ๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜๊ตฌ ์ €์žฅํ•˜๋Š” ํ™˜๊ฒฝ์ธ๋ฐ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” pk๊ฐ’์ด ๋ฌด์กฐ๊ฑด ํ•„์š”ํ•˜๋‹ค.

์›๋ž˜ entityManager.persist()๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ๋ฐ”๋กœ DB์— ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅํ•œ ํ›„์— ํŠธ๋žœ์žญ์…˜์˜ ์ปค๋ฐ‹์ด ์ผ์–ด๋‚˜๋ฉด ๊ทธ ๋•Œ DB์— ์ €์žฅ๋œ๋‹ค.

 

auto_increment์˜ ๊ฒฝ์šฐ์—๋Š” entityManager.persist()๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ๋ฐ”๋กœ DB์— insert ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

์ดํ›„์— JPA ๋‚ด๋ถ€์—์„œ insert ์ฟผ๋ฆฌ ์‹คํ–‰ ํ›„ ๋ฐ”๋กœ ์ƒ์„ฑ๋œ id๊ฐ’์„ ๋ฆฌํ„ด๋ฐ›์•„์„œ id๋ฅผ pk๋กœ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅํ•œ๋‹ค.

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ธฐ๋ณธํ‚ค ์˜์†์„ฑ์„ ๊ด€๋ฆฌํ•œ๋‹ค.

 

auto increment๋Š” ํ‚ค๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ ์‰ฌ์›Œ์„œ SQL Injection๊ณผ ๊ฐ™์€ ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

 

๋ถ„์‚ฐํ™˜๊ฒฝ์—์„œ๋Š” UUID(Universally Unique ID)๋ฅผ ์ถ”์ฒœํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

128๋น„ํŠธ ๋ฐ์ดํ„ฐ๋กœ 100% uniqueํ•˜๋‹ค๊ณ  ๋ณด์žฅ์€ ๋ชปํ•˜๋Š”๋ฐ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์ด ๊ต‰์žฅํžˆ ๋‚ฎ์€ ํ‚ค๋‹ค.

UUID๋Š” ์ž๋ฐ” 5์—์„œ๋ถ€ํ„ฐ ์ง€์›ํ•˜๊ณ  ์žˆ๊ณ  java.util.UUID ํŒจํ‚ค์ง€์—์„œ ์ œ๊ณตํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

import java.util.UUID

...

@Id
@GeneratedValue(generator = "uuids")
@GenericGenerator(name= "uuid2", strategy = "uuid")
private UUID id;

์œ„์™€ ๊ฐ™์ด ์“ธ ๊ฒฝ์šฐ BINARY(16) ํ˜น์€ VARCHAR ํƒ€์ž…์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

๊ธฐ์กด intํƒ€์ž…์œผ๋กœ auto incrementํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ๋„ ๋งŽ์ด ์“ฐ๊ณ  uuid ์ƒ์„ฑ๋•Œ๋ฌธ์— insertํ•  ๋•Œ ์‹œ๊ฐ„์ด ๋” ๋งŽ์ด ๊ฑธ๋ฆฐ๋‹ค.

๋ฐ˜์‘ํ˜•