π[Spring] μ μΌν μλ³μ(Primary Key).
Java λ°±μλ μ ν리μΌμ΄μ μμ userμ id μ 보λ λ³΄ν΅ μ μΌν μλ³μ (Primary Key) λ‘ μ¬μ©λλ©°, κ° μ μ λ³λ‘ κ²ΉμΉμ§ μλ κ³ μ ν κ°μ λλ€.
μ΄λ λ°μ΄ν°λ² μ΄μ€ μ€κ³μμ λ§€μ° μ€μν κ°λ μΌλ‘, μ¬μ©μμ κ°μ μν°ν°(Entity)λ₯Ό κ³ μ νκ² μλ³νκΈ° μν΄ Primary Keyλ₯Ό μ¬μ©ν©λλ€.
1οΈβ£ Primary Keyλ?
- Primary Keyλ λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈμμ κ° νμ κ³ μ νκ² μλ³νλ μ΄(Column)μ λλ€.
- Primary Keyλ ν
μ΄λΈ λ΄μμ μ€λ³΅λ μ μμΌλ©°,
null
κ°μ κ°μ§ μ μμ΅λλ€. - μ¦, κ° λ μ½λλ Primary Keyλ₯Ό ν΅ν΄ μλ³λλ―λ‘,
user
ν μ΄λΈμμ κ° μ¬μ©μλ μ μΌνid
λ₯Ό κ°μ ΈμΌ νλ©°, μ΄λ₯Ό ν΅ν΄ μ¬μ©μλ₯Ό ꡬλΆν μ μμ΅λλ€.
2οΈβ£ μΌλ°μ μΈ μ: User μν°ν°
user
μν°ν°μμ id
νλλ μ£Όλ‘ Primary Keyλ‘ μ€μ λλ©°, λ°μ΄ν°λ² μ΄μ€μμ μλμΌλ‘ μμ±λκ±°λ μ ν리μΌμ΄μ
μμ μμ±ν μλ μμ΅λλ€.
User μν°ν° μμ (JPAλ₯Ό μ¬μ©ν κ²½μ°)
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // Primary Key, μ μΌν μλ³μ.
private String name;
private String email;
// Getter, Setter, κΈ°λ³Έ μμ±μ
public User() {}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
-
@Id
-
id
νλλ Primary Keyμμ λνλ λλ€.
-
-
@GeneratedValue
-
id
κ°μ΄ μλμΌλ‘ μμ±λ¨μ μλ―Έν©λλ€. -
GenerationType.IDENTITY
λ λ°μ΄ν°λ² μ΄μ€μμ μλμΌλ‘ Primary Key κ°μ μμ±νλλ‘ μ§μ νλ λ°©μμ λλ€.
-
3οΈβ£ Primary Keyμ μν .
-
1. κ³ μ μ± λ³΄μ₯
- Primary Keyλ κ° λ μ½λλ₯Ό κ³ μ νκ² μλ³νλ―λ‘, μ¬μ©μ μ 보μμ
id
λ κ° μ μ λ³λ‘ μ μΌνκ² μ‘΄μ¬νλ©° μ λ μ€λ³΅λμ§ μμ΅λλ€.
- Primary Keyλ κ° λ μ½λλ₯Ό κ³ μ νκ² μλ³νλ―λ‘, μ¬μ©μ μ 보μμ
-
2. λΉ λ₯Έ μ‘°ν
- Primary Keyλ μΈλ±μ€κ° μλμΌλ‘ μμ±λκΈ° λλ¬Έμ λ°μ΄ν°λ² μ΄μ€μμ ν΄λΉ λ μ½λλ₯Ό λΉ λ₯΄κ² μ‘°νν μ μμ΅λλ€.
-
3. κ΄κ³ μ€μ
- Primary Keyλ λ€λ₯Έ ν μ΄λΈμμ Foreign Keyλ‘ μ¬μ©λμ΄ ν μ΄λΈ κ°μ κ΄κ³λ₯Ό μ€μ ν μ μμ΅λλ€.
- μλ₯Ό λ€μ΄,
Order
ν μ΄λΈμμuser_id
λUser
ν μ΄λΈμ Primary Keyλ₯Ό μ°Έμ‘°νμ¬ μ£Όλ¬Έκ³Ό μ¬μ©μλ₯Ό μ°κ²°ν μ μμ΅λλ€.
4οΈβ£ ID μμ± λ°©μ.
IDλ μ¬λ¬ λ°©μμΌλ‘ μμ±λ μ μμΌλ©°, κ°μ₯ λ§μ΄ μ¬μ©νλ λ κ°μ§ λ°©μμ λ€μκ³Ό κ°μ΅λλ€.
-
1. μλ μ¦κ°(Auto Increment)
- λ°μ΄ν°λ² μ΄μ€μμ
AUTO_INCREMENT
μμ±μ μ€μ νμ¬ IDκ° μλμΌλ‘ μ¦κ°ν©λλ€. - μ£Όλ‘ MySQL, PostgreSQL κ°μ λ°μ΄ν°λ² μ΄μ€μμ μ¬μ©λ©λλ€.
- λ°μ΄ν°λ² μ΄μ€μμ
-
2. UUID(Universally Unique Identifier)
- UUIDλ μ μΈκ³μ μΌλ‘ κ³ μ ν μλ³μλ₯Ό μμ±νλ λ°©μμΌλ‘, μ€λ³΅λ κ°λ₯μ±μ΄ κ±°μ μμ΅λλ€.
- JPAμμλ
UUID
λ₯Ό Primary Keyλ‘ μ¬μ©ν μλ μμ΅λλ€.- μμ
@Id @GeneratedValue(generator = "UUID") @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator") private String id;
- μμ
5οΈβ£ λ°μ΄ν°λ² μ΄μ€μμ User ν μ΄λΈ μμ
CREATE TABLE users (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
email VARCHAR(255)
);
- μ¬κΈ°μ
id
λ Primary Keyλ‘, λ°μ΄ν°λ² μ΄μ€μμ μλμΌλ‘ μ¦κ°νλ©° κ° μ¬μ©μλ κ³ μ νid
κ°μ κ°μ§λλ€.
6οΈβ£ μμ: Primary Keyλ₯Ό ν΅ν μ¬μ©μ μ‘°ν
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
User user = userRepository.findById(id)
.orElseThrow(() -> new UserNotFoundException("User not found with id " + id));
return ResponseEntity.ok(user);
}
}
- μ μ½λλ
id
κ° Primary KeyμΈUser
μν°ν°λ₯Ό λ°μ΄ν°λ² μ΄μ€μμ μ‘°ννλ μμμ λλ€. -
id
λ κ³ μ νκΈ° λλ¬Έμ μ΄ κ°μ ν΅ν΄ νΉμ μ¬μ©μλ₯Ό μ ννκ² μ‘°νν μ μμ΅λλ€.
7οΈβ£ μμ½.
- Java λ°±μλ μ ν리μΌμ΄μ
μμ
user
μid
λ λ³΄ν΅ Primary Keyλ‘ μ¬μ©λλ©°, κ° μ¬μ©μλ κ³ μ νid
κ°μ κ°μ§λλ€. - Primary Keyλ λ°μ΄ν°λ² μ΄μ€μμ κ° λ μ½λλ₯Ό κ³ μ νκ² μλ³νλ νλλ‘, μ λ μ€λ³΅λμ§ μμΌλ©°
null
κ°μ κ°μ§ μ μμ΅λλ€. - Primary Keyλ₯Ό ν΅ν΄ μ¬μ©μλ₯Ό λΉ λ₯΄κ³ μ ννκ² μ‘°νν μ μμΌλ©°, ν μ΄λΈ κ°μ κ΄κ³λ₯Ό μ€μ νλ λ° μ€μν μν μ ν©λλ€.
-
id
λ μλ μ¦κ° λ°©μμ΄λUUID
λ°©μμΌλ‘ μμ±λ μ μμΌλ©°, μ¬μ©μμ κ³ μ μ±μ 보μ₯ν©λλ€.