Home > Spring > πŸƒ[Spring] JPA μ–΄λ…Έν…Œμ΄μ…˜ - `@Id`

πŸƒ[Spring] JPA μ–΄λ…Έν…Œμ΄μ…˜ - `@Id`
Spring Framework

πŸƒ[Spring] JPA μ–΄λ…Έν…Œμ΄μ…˜ - @Id

  • JPA μ–΄λ…Έν…Œμ΄μ…˜ 쀑 @IdλŠ” μ—”ν‹°ν‹°μ˜ κΈ°λ³Έ ν‚€(Primary Key)λ₯Ό μ§€μ •ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜(Annotation)μž…λ‹ˆλ‹€.
  • κΈ°λ³Έ ν‚€(Primary Key)λŠ” λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ—μ„œ 각 ν–‰(Row)을 κ³ μœ ν•˜κ²Œ μ‹λ³„ν•˜λŠ” 데 μ‚¬μš©λ˜λ©°, λͺ¨λ“  JPA(Java Persistence API) μ—”ν‹°ν‹°λŠ” λ°˜λ“œμ‹œ ν•˜λ‚˜μ˜ ν•„λ“œλ₯Ό κΈ°λ³Έ ν‚€(Primary Key)둜 지정해야 ν•©λ‹ˆλ‹€.

1️⃣ μ£Όμš” νŠΉμ§•.

1️⃣ κΈ°λ³Έ ν‚€(Primary Key) 지정.

  • @Id μ–΄λ…Έν…Œμ΄μ…˜μ„ 톡해 μ—”ν‹°ν‹°μ˜ ν•„λ“œλ‚˜ 속성을 κΈ°λ³Έ ν‚€(Primary Key)둜 μ§€μ •ν•©λ‹ˆλ‹€.
  • κΈ°λ³Έ ν‚€(Primary Key)λŠ” λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ—μ„œ 각 ν–‰(Row)을 κ³ μœ ν•˜κ²Œ μ‹λ³„ν•˜λŠ” κ°’μœΌλ‘œ, 각 μ—”ν‹°ν‹° μΈμŠ€ν„΄μŠ€λ₯Ό κ³ μœ ν•˜κ²Œ μ‹λ³„ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

2️⃣ 단일 λ˜λŠ” 볡합 ν‚€.

  • @IdλŠ” 단일 ν•„λ“œλ₯Ό κΈ°λ³Έ ν‚€(Primary Key)둜 지정할 λ•Œ μ‚¬μš©λ˜λ©°, 볡합 ν‚€(두 개 μ΄μƒμ˜ ν•„λ“œλ‘œ κ΅¬μ„±λœ κΈ°λ³Έ ν‚€(Primary Key))λ₯Ό 지정할 λ•ŒλŠ” @IdClass λ˜λŠ” @EmbeddedId μ–΄λ…Έν…Œμ΄μ…˜μ„ ν•¨κ»˜ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3️⃣ μžλ™ 생성.

  • κΈ°λ³Έ ν‚€(Primary Key)λŠ” μžλ™μœΌλ‘œ 생성될 수 있으며, 이λ₯Ό μœ„ν•΄ @GeneratedValue μ–΄λ…Έν…Œμ΄μ…˜κ³Ό ν•¨κ»˜ μ‚¬μš©ν•©λ‹ˆλ‹€.
    • @GeneratedValueλŠ” κΈ°λ³Έ ν‚€(Primary Key) 생성 μ „λž΅μ„ μ •μ˜ν•©λ‹ˆλ‹€.(예: AUTO, IDENTITY, SEQUENCE, TABLE).

2️⃣ μ˜ˆμ‹œ.

1️⃣ λ‹¨μˆœν•œ κΈ°λ³Έ ν‚€(Primary Key) 지정.

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity // μ—”ν‹°ν‹° 클래슀 μ„ μ–Έ
public class User {
    
    @Id // κΈ°λ³Έ ν‚€λ‘œ 지정
    private Long id; // 이 ν•„λ“œκ°€ κΈ°λ³Έ ν‚€κ°€ 됨
    
    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)κ°€ λ©λ‹ˆλ‹€.
    • κΈ°λ³Έ ν‚€(Primary Key)λŠ” κ³ μœ ν•˜κ²Œ μ—”ν‹°ν‹°λ₯Ό μ‹λ³„ν•˜λŠ” κ°’μž…λ‹ˆλ‹€.

2️⃣ κΈ°λ³Έ ν‚€ μžλ™ 생성.

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;

@Entity
public class Product {
    
    @Id // κΈ°λ³Έ ν‚€(Primary Key)둜 지정.
    @GeneratedValue(strategy = GenerationType.IDENTITY) // κΈ°λ³Έ ν‚€(Primary Key) μžλ™ 생성/
    private Long productId; // 이 ν•„λ“œκ°€ μžλ™ μƒμ„±λ˜λŠ” κΈ°λ³Έ ν‚€.
    
    private String name;
    private Double price;
    
    // κΈ°λ³Έ μƒμ„±μž 및 Getter and Setter
    public Product () {}
    
    public Long getProductId() {
        return productId;
    }
    
    public void setProductId(Long productId) {
        this.productId = productId;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public Double getPrice() {
        return price;
    }
    
    public void setPrice(Double price) {
        this.price = price;
    }
}
  • 이 μ˜ˆμ‹œμ—μ„œλŠ” @GeneratedValue(strategy = GenerationType.IDENTITY)λ₯Ό μ‚¬μš©ν•˜μ—¬ productIdκ°€ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μžλ™μœΌλ‘œ μƒμ„±λ©λ‹ˆλ‹€.
    • IDENTITY μ „λž΅μ€ λ°μ΄ν„°λ² μ΄μŠ€κ°€ μžλ™μœΌλ‘œ μ¦κ°€ν•˜λŠ” 값을 κΈ°λ³Έ ν‚€(Primary Key)둜 μ‚¬μš©ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.

3️⃣ κΈ°λ³Έ ν‚€(Primary Key) 생성 μ „λž΅.

  • @GeneratedValue μ–΄λ…Έν…Œμ΄μ…˜κ³Ό ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ κΈ°λ³Έ ν‚€(Primary Key)κ°€ μžλ™μœΌλ‘œ μƒμ„±λ˜λ„λ‘ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • 생성 μ „λž΅μ€ λ„€ 가지가 μžˆμŠ΅λ‹ˆλ‹€.

1️⃣ AUTO

  • JPA κ΅¬ν˜„μ²΄κ°€ μ μ ˆν•œ 생성 μ „λž΅μ„ μžλ™μœΌλ‘œ μ„ νƒν•©λ‹ˆλ‹€.

2️⃣ IDENTITY

  • κΈ°λ³Έ ν‚€(Primary Key) 값을 λ°μ΄ν„°λ² μ΄μŠ€κ°€ μžλ™μœΌλ‘œ μ¦κ°€μ‹œμΌœ μƒμ„±ν•©λ‹ˆλ‹€(주둜 MySQLμ—μ„œ μ‚¬μš©)

3️⃣ SEQUENCE

  • λ°μ΄ν„°λ² μ΄μŠ€ μ‹œν€€μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ κΈ°λ³Έ ν‚€(Primary Key) 값을 μƒμ„±ν•©λ‹ˆλ‹€.(주둜 Oracleμ—μ„œ μ‚¬μš©).

πŸ“ λ°μ΄ν„°λ² μ΄μŠ€ μ‹œν€€μŠ€(Sequence)

λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ κ³ μœ ν•œ 숫자 값을 순차적으둜 μƒμ„±ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€.
주둜 κΈ°λ³Έ ν‚€(Primary Key)λ‚˜ λ‹€λ₯Έ 고유 μ‹λ³„μžλ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•˜λŠ” μš©λ„λ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.
μ‹œν€€μŠ€(Sequence)λŠ” νŠΉμ • κ·œμΉ™μ— 따라 숫자λ₯Ό μƒμ„±ν•˜λ©°, μžλ™μœΌλ‘œ μ¦κ°€ν•˜λŠ” 숫자 값을 μ œκ³΅ν•΄ λ°μ΄ν„°λ² μ΄μŠ€μ˜ μ—¬λŸ¬ ν–‰(Row)에 κ³ μœ ν•œ 값을 ν• λ‹Ήν•  수 μžˆμŠ΅λ‹ˆλ‹€.

4️⃣ TABLE

  • ν‚€ 값을 μ €μž₯ν•˜κΈ° μœ„ν•œ λ³„λ„μ˜ ν…Œμ΄λΈ”μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

4️⃣ μš”μ•½.

  • @IdλŠ” JPAμ—μ„œ μ—”ν‹°ν‹°μ˜ κΈ°λ³Έ ν‚€(Primary Key)λ₯Ό μ§€μ •ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ, μ—”ν‹°ν‹°μ˜ 각 μΈμŠ€ν„΄μŠ€λ₯Ό κ³ μœ ν•˜κ²Œ μ‹λ³„ν•©λ‹ˆλ‹€.
  • κΈ°λ³Έ ν‚€(Primary Key)λŠ” ν•„μˆ˜μ μœΌλ‘œ μ •μ˜ν•΄μ•Ό ν•˜λ©°, ν•„μš”μ— 따라 @GeneratedValueλ₯Ό μ‚¬μš©ν•΄ μžλ™μœΌλ‘œ 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.