๊ฐœ๋ฐœ/BACKEND

PK๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ? ๐Ÿค”

H_JU_0527 2024. 7. 10. 12:12
@Entity
@Table(name = "users")
public class User implements UserDetails {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(name = "email", length = 100)
    private String email;
    ...
}

 

์Šคํ”„๋ง์„ ์ฒ˜์Œ ๊ณต๋ถ€ํ•œ ์ดํ›„๋กœ ์–ด๋–ค ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๋˜ ๊ฐ„์— PK์€ ํ•ญ์ƒ Auto Increament๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

๊ทธ๋Ÿฌ๋˜ ์ค‘, ํ”ผ๋“œ๋ฐฑ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ›์•˜๋‹ค.

"User ํ…Œ์ด๋ธ”์€ Auto Increament๋ณด๋‹ค๋Š” Email์„ PK๋กœ ํ•˜๋Š”๊ฒŒ ๋” ์ข‹์•„๋ณด์—ฌ์š”."

์ด์œ ๊ฐ€ ๊ถ๊ธˆํ–ˆ์ง€๋งŒ, ๊ทธ์ „์— "์™œ ๋‚˜๋Š” Auto Increament๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋Š”๊ฐ€"์— ๋Œ€ํ•œ ๋‹ต๋ณ€๋„ ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ๐Ÿซ  

์˜ํ•œ๋‹˜์ด ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ผ๋Š”๋ฐ์š”?

๋ฉด์ ‘์—์„œ ์งˆ๋ฌธ์„ ๋ฐ›์•˜์„๋•Œ ์œ„์™€ ๊ฐ™์ด ๋Œ€๋‹ตํ•  ์ˆœ ์—†์œผ๋‹ˆ, PK ์ „๋žต์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.


1๏ธโƒฃ Auto Increment

`@GeneratedValue(strategy = GenerationType.IDENTITY)`์„ ์ด์šฉํ•˜์—ฌ ๊ฐ€์žฅ ํ”ํžˆ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

  • ๊ธฐ๋ณธ ํ‚ค ์ƒ์„ฑ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์œ„์ž„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ, INSERT Query๊ฐ€ ๋ฐœ์ƒ์‹œ ์ž๋™์œผ๋กœ  id ๊ฐ’์„ ์„ธํŒ…ํ•ด์ค€๋‹ค.
  • ์ˆซ์ž๋Š” 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜, ์›ํ•˜๋Š” ์ˆซ์ž๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ์ฐจ๋ก€๋Œ€๋กœ ๋Š˜๋ ค๊ฐ„๋‹ค.

์žฅ์ 

  1. ๋‚ด๋ถ€์ ์œผ๋กœ Id๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ์ด์ƒ, ์œ ์ผํ•œ Id ๊ฐ’์ž„์„ ๋ณด์žฅํ•œ๋‹ค.
  2. ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ์ด์ ์ด ์กด์žฌํ•œ๋‹ค.
    • ๊ฐ€๋…์„ฑ : ์“ฐ๊ธฐ ์‰ฝ๊ณ , ๋‹จ์ˆœํ•˜์—ฌ ๊ธฐ์–ตํ•˜๊ฑฐ๋‚˜ ์˜์‚ฌ์†Œํ†ตํ•˜๊ธฐ ์‰ฝ๋‹ค.
    • ์ˆœ์ฐจ : ์ƒ์„ฑ๋˜๋Š” ์ˆœ์„œ๋Œ€๋กœ id ๊ฐ’์„ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ˆœ์ฐจ์˜ ์˜๋ฏธ๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์กฐํšŒ ์†๋„ : ์ •์ˆ˜ํ˜•์€ ํฌ๊ธฐ๊ฐ€ ์ž‘๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”์ง„์—์„œ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ์ •๋ ฌ ๋ฐ ๋น„๊ตํ•˜๊ธฐ์— ์ข‹๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ Auto Increment์— ํฐ 2๊ฐ€์ง€ ๋‹จ์ ์ด ์กด์žฌํ•œ๋‹ค.

๋‹จ์ 

  1. ๋ณด์•ˆ ๋ฌธ์ œ
    • ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•ด "๋‹จ์ˆœํ•˜๋‹ค" ๋ผ๋Š” ์žฅ์ ์ด ๋‹จ์ ์œผ๋กœ ์ž‘์šฉํ–ˆ๋‹ค.
    • ์ˆœ์ฐจ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋‹ค๋ณด๋‹ˆ, ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์˜ ๋‹ค๋ฅธ ํŠœํ”Œ Id ๊ฐ’๋„ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
    • ์ฆ‰, ๋‹ค๋ฅธ ํŠœํ”Œ์˜ ์ •๋ณด๊ฐ€ ์‰ฝ๊ฒŒ ๋…ธ์ถœ๋  ์ˆ˜ ์ž‡๋‹ค. (SQL Injection)
  2. ๋ถ„์‚ฐํ˜• ์‹œ์Šคํ…œ์—์„œ์˜ PK ์ค‘๋ณต (Duplicate Key)
    • ํฐ ์‹œ์Šคํ…œ์—์„œ๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๊ตฌ์„ ๋œ ๋ถ„์‚ฐํ˜• ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•œ๋‹ค.
    • ์ฆ‰, ์•„๋ž˜์™€ ๊ฐ™์€ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.
๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค A : 1, 2, 3, 4, 5 ...
๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค B : 1, 2, 3, 4, 5 ... ( ์ค‘๋ณต ๋ฐœ์ƒ )

 

๋ถ„์‚ฐํ˜• ์‹œ์Šคํ…œ ์˜ˆ์‹œ

2๏ธโƒฃ Uniqueํ•œ Entity์˜ ํ•„๋“œ๊ฐ’

ํ”ผ๋“œ๋ฐฑ ๋ฐ›์€ ๋ฐฉ์‹์œผ๋กœ, Entity์˜ ํ•„๋“œ๊ฐ’ ์ค‘ Uniqueํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋˜๋Š” ๊ฒƒ์œผ๋กœ PK๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค๋ฉด User์˜ Email ๊ฐ’๊ณผ ๊ฐ™์€ ํ•„๋“œ์ด๋‹ค.

์ง€๊ธˆ ์ง„ํ–‰ ์ค‘์ธ ํ”„๋กœ์ ํŠธ์—์„œ Email์€ Google OAuth๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜ค๋Š” ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์—, Unique๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

@Entity
@Table(name = "users")
public class User implements UserDetails {
    @Id
    @Column(name = "email", length = 100)
    private String email;
}

 

๐Ÿ“Œ ๋‹จ, ํ•ด๋‹น ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด @PathVariable์•”ํ˜ธํ™”๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

Ex. ํŠน์ • ํšŒ์›์˜ ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๋Š” API
@RestController
public class TestController {
  @GetMapping("api/member/{memberId}")
  public final ResponseEntity<?> getUserDetails(@PathVariable("memberId") Long id) { ... }
}

Uniqueํ•œ Entity์˜ ํ•„๋“œ๊ฐ’์œผ๋กœ PK๋ฅผ ์„ค์ •ํ•˜๋ฉด ํ•„๋“œ ์ •๋ณด๊ฐ€ Url์— ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

Url : api / member / example@gmail.com  (๋…ธ์ถœ)

@RestController
public class TestController {
  @GetMapping("api/member/{memberEmail}")
  public final ResponseEntity<?> getUserDetails(@PathVariable("memberEmail") Long id) { ... }
}

๊ทธ๋ž˜์„œ ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด FE์—์„œ๋Š” ํ•ด๋‹น ์ •๋ณด๋ฅผ ์•”ํ˜ธํ™”ํ•˜๊ณ , BE์—์„œ๋Š” ๋‹ค์‹œ ๋ณตํ˜ธํ™” ํ•˜๋Š” ์ž‘์—…์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

์•”ํ˜ธํ™” / ๋ณตํ˜ธํ™” ๋ฐฉ์‹์€ ์•„๋ž˜ ๋ธ”๋กœ๊ทธ ๊ธ€์„ ์ฐธ๊ณ ํ•˜์ž.
https://mangkyu.tistory.com/310

 

์žฅ์ 

  • PK๊ฐ’์„ ์˜ˆ์ธกํ•˜๊ธฐ ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ถ„์‚ฐํ˜• ์‹œ์Šคํ…œ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ผ๋ฆฌ ์ค‘๋ณต๋œ PK ๊ฐ’์ด ๋ฐœ์ƒํ•  ์ผ์ด ์—†๋‹ค.

ํ•˜์ง€๋งŒ ๋‹จ์  ๋˜ํ•œ ์กด์žฌํ•œ๋‹ค.

 

๋‹จ์ 

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

๐Ÿง‘‍๐Ÿ’ป ์ •๋ฆฌ

Auto Increment์™€ Uniqueํ•œ Entity ํ•„๋“œ๊ฐ’์€ ์žฅ๋‹จ์ ์ด ์„œ๋กœ ์Šค์œ„์น˜ ๋˜๋Š” ๋Š๋‚Œ์ด๋‹ค.

 

๊ทธ๋ž˜์„œ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์•Œ๋งž์€ PK ์ „๋žต์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์˜ณ์€ ๋ฐฉ์‹์ธ ๊ฒƒ ๊ฐ™๋‹ค.

PK๋กœ Auto Increment๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ

  • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” Key ์ด๊ฑฐ๋‚˜, ์ˆœ์ฐจ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ

PK๋กœ Uniqueํ•œ Entity ํ•„๋“œ๊ฐ’์„ ์‚ฌ์šฉํ•  ๋•Œ

  • ์™ธ๋ถ€์— ๊ณต๊ฐœํ•ด์•ผํ•˜๋Š” Key์ธ ๊ฒฝ์šฐ

 

๐Ÿ“š Reference