PK๋ฅผ ์ด๋ป๊ฒ ์ค์ ํ๋ ๊ฒ์ด ์ข์๊น? ๐ค
@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๋ถํฐ ์์ํ๊ฑฐ๋, ์ํ๋ ์ซ์๋ถํฐ ์์ํ์ฌ ์ฐจ๋ก๋๋ก ๋๋ ค๊ฐ๋ค.
์ฅ์
- ๋ด๋ถ์ ์ผ๋ก Id๊ฐ์ ๋ณ๊ฒฝํ์ง ์๋ ์ด์, ์ ์ผํ Id ๊ฐ์์ ๋ณด์ฅํ๋ค.
- ์ซ์๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ์ด์ ์ด ์กด์ฌํ๋ค.
- ๊ฐ๋ ์ฑ : ์ฐ๊ธฐ ์ฝ๊ณ , ๋จ์ํ์ฌ ๊ธฐ์ตํ๊ฑฐ๋ ์์ฌ์ํตํ๊ธฐ ์ฝ๋ค.
- ์์ฐจ : ์์ฑ๋๋ ์์๋๋ก id ๊ฐ์ ์์ฑํ๊ธฐ ๋๋ฌธ์, ์์ฐจ์ ์๋ฏธ๋ก๋ ์ฌ์ฉํ ์ ์๋ค.
- ์กฐํ ์๋ : ์ ์ํ์ ํฌ๊ธฐ๊ฐ ์๊ธฐ ๋๋ฌธ์, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง์์ ์กฐํํ๊ฑฐ๋ ์ ๋ ฌ ๋ฐ ๋น๊ตํ๊ธฐ์ ์ข๋ค.
ํ์ง๋ง ์ด๋ฌํ Auto Increment์ ํฐ 2๊ฐ์ง ๋จ์ ์ด ์กด์ฌํ๋ค.
๋จ์
- ๋ณด์ ๋ฌธ์
- ์ซ์๋ฅผ ์ฌ์ฉํด "๋จ์ํ๋ค" ๋ผ๋ ์ฅ์ ์ด ๋จ์ ์ผ๋ก ์์ฉํ๋ค.
- ์์ฐจ์ ์ผ๋ก ์ฆ๊ฐํ๋ค๋ณด๋, ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ๋ค๋ฅธ ํํ Id ๊ฐ๋ ์ฝ๊ฒ ์ ์ ์๋ค.
- ์ฆ, ๋ค๋ฅธ ํํ์ ์ ๋ณด๊ฐ ์ฝ๊ฒ ๋ ธ์ถ๋ ์ ์๋ค. (SQL Injection)
- ๋ถ์ฐํ ์์คํ
์์์ 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์ธ ๊ฒฝ์ฐ