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

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

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

  • @EntityλŠ” JPA(Java Persistence API)μ—μ„œ λ°μ•„ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”κ³Ό λ§€ν•‘λ˜λŠ” μžλ°” 클래슀λ₯Ό μ •μ˜ν•  λ•Œ μ‚¬μš©ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜(Annotation)μž…λ‹ˆλ‹€.
    • 이 μ–΄λ…Έν…Œμ΄μ…˜(Annotation)을 ν΄λž˜μŠ€μ— 뢙이면 ν•΄λ‹Ή ν΄λž˜μŠ€κ°€ JPA(Java Persistence API) μ—”ν‹°ν‹°(Entity)μž„μ„ λ‚˜νƒ€λ‚΄λ©°, JPAκ°€ 이λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”κ³Ό λ§€ν•‘ν•˜μ—¬ 관리할 수 있게 λ©λ‹ˆλ‹€.

πŸ“ μ—”ν‹°ν‹°(Entity)

객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°(Object-Oriented Programming, OOP)κ³Ό λ°μ΄ν„°λ² μ΄μŠ€(Database) μ„€κ³„μ—μ„œ λͺ¨λ‘ μ‚¬μš©λ˜λŠ” κ°œλ…μœΌλ‘œ, 특히 JPA(Java Persistence API)μ—μ„œ 자주 μ–ΈκΈ‰λ©λ‹ˆλ‹€.

μ—”ν‹°ν‹°(Entity)λŠ” λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”κ³Ό λ§€ν•‘λ˜λŠ” μžλ°” 클래슀λ₯Ό μ˜λ―Έν•˜λ©°, λ°μ΄ν„°λ² μ΄μŠ€μ˜ 각 ν–‰(Row)이 μžλ°” 클래슀의 객체(Instance, μΈμŠ€ν„΄μŠ€)둜 λŒ€μ‘λ©λ‹ˆλ‹€.

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

1️⃣ μ—”ν‹°ν‹° 클래슀(Entity Class)

  • @Entityκ°€ μ„ μ–Έλœ ν΄λž˜μŠ€λŠ” μ—”ν‹°ν‹°(Entity)라고 ν•˜λ©°, μ΄λŠ” λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ— λŒ€μ‘ν•˜λŠ” μžλ°” ν΄λž˜μŠ€μž…λ‹ˆλ‹€.
  • μ—”ν‹°ν‹° 클래슀의 μΈμŠ€ν„΄μŠ€(Instance, 객체)λŠ” λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ˜ 각 ν–‰(Row)에 λŒ€μ‘λ©λ‹ˆλ‹€.
  • ν΄λž˜μŠ€λŠ” λ°˜λ“œμ‹œ κΈ°λ³Έ μƒμ„±μž(default constructor)λ₯Ό κ°€μ Έμ•Ό ν•˜κ³ , κΈ°λ³Έ ν‚€(Primary Key)λ₯Ό μ •μ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

2️⃣ ν…Œμ΄λΈ” 맀핑(Table Mapping)

  • ν΄λž˜μŠ€μ— @Entity μ–΄λ…Έν…Œμ΄μ…˜(Annotation)을 뢙이면, JPA(Java Persistence API)λŠ” ν•΄λ‹Ή 클래슀λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ˜ ν…Œμ΄λΈ”κ³Ό λ§€ν•‘ν•©λ‹ˆλ‹€.
  • ν…Œμ΄λΈ”μ˜ 이름은 기본적으둜 클래슀 이름과 λ™μΌν•˜κ²Œ λ§€ν•‘λ˜μ§€λ§Œ, @Table μ–΄λ…Έν…Œμ΄μ…˜(Annotation)을 μ‚¬μš©ν•˜μ—¬ ν…Œμ΄λΈ” 이름을 λͺ…μ‹œμ μœΌλ‘œ 지정할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

3️⃣ κΈ°λ³Έ ν‚€(Primary Key)

  • μ—”ν‹°ν‹° ν΄λž˜μŠ€λŠ” λ°˜λ“œμ‹œ ν•˜λ‚˜μ˜ ν•„λ“œλ₯Ό κΈ°λ³Έ ν‚€(Primary Key)둜 지정해야 ν•˜λ©°, 이λ₯Ό μœ„ν•΄ @Id μ–΄λ…Έν…Œμ΄μ…˜(Annotation)을 μ‚¬μš©ν•©λ‹ˆλ‹€.
  • κΈ°λ³Έ ν‚€(Primary Key)의 생성 μ „λž΅μ€ @GeneratedValue μ–΄λ…Έν…Œμ΄μ…˜(Annotation)을 톡해 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ μ‚¬μš© μ˜ˆμ‹œ.

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

@Entity // 이 ν΄λž˜μŠ€λŠ” JPA μ—”ν‹°ν‹°μž„μ„ λ‚˜νƒ€λƒ„.
@Table(name = "users") // 맀핑될 λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ” 이름을 지정.
public class User {
    
    @Id
    @GeneratedValue(strategy = GenerarionType.IDENTITY) // κΈ°λ³Έ ν‚€ 생성 μ „λž΅
    private Long id;
    
    private String name;
    private String email;
    
    // κΈ°λ³Έ μƒμ„±μž (ν•„μˆ˜)
    public User() {}
    
    // μƒμ„±μž, getter, setter λ“±
    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }
    
    // Getter and Setter
    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;
    }
}

3️⃣ μ£Όμš” μš”μ†Œ.

1️⃣ @Entity

  • 이 μ–΄λ…Έν…Œμ΄μ…˜μ€ JPA(Java Persistence API)μ—κ²Œ ν•΄λ‹Ή ν΄λž˜μŠ€κ°€ λ°μ΄ν„°λ² μ΄μŠ€μ˜ ν…Œμ΄λΈ”κ³Ό λ§€ν•‘λ˜λŠ” μ—”ν‹°ν‹°(Entity)μž„μ„ μ•Œλ¦½λ‹ˆλ‹€.

2️⃣ @Table

  • ν…Œμ΄λΈ” 이름을 λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•˜λ €λ©΄ @Table(name = "ν…Œμ΄λΈ”μ΄λ¦„")을 μ‚¬μš©ν•©λ‹ˆλ‹€.
  • @Table을 μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄ 기본적으둜 클래슀 이름이 ν…Œμ΄λΈ” μ΄λ¦„μœΌλ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.

3️⃣ @Id

  • ν•΄λ‹Ή ν•„λ“œλŠ” μ—”ν‹°ν‹°(Entity)의 κΈ°λ³Έ ν‚€(Primary Key)둜 μ‚¬μš©λ©λ‹ˆλ‹€.
    • λͺ¨λ“  μ—”ν‹°ν‹°λŠ” λ°˜λ“œμ‹œ ν•˜λ‚˜μ˜ κΈ°λ³Έ ν‚€(Primary Key)λ₯Ό κ°€μ Έμ•Ό ν•©λ‹ˆλ‹€.

4️⃣ @GeneratedValue

  • κΈ°λ³Έ ν‚€(Primary Key) κ°’μ˜ 생성 μ „λž΅μ„ μ§€μ •ν•©λ‹ˆλ‹€.
    • 예λ₯Ό 즐어, GenerationType.IDENTITYλŠ” λ°μ΄ν„°λ² μ΄μŠ€κ°€ μžλ™μœΌλ‘œ κΈ°λ³Έ ν‚€(Primary Key) 값을 μ¦κ°€μ‹œν‚€λŠ” μ „λž΅μ„ μ˜λ―Έν•©λ‹ˆλ‹€.

4️⃣ 주의 사항.

  • μ—”ν‹°ν‹° 클래슀(Entity Class)λŠ” λ°˜λ“œμ‹œ κΈ°λ³Έ μƒμ„±μž(default constructor)κ°€ μžˆμ–΄μ•Ό ν•˜λ©°, public λ˜λŠ” protected μ ‘κ·Ό μ œμ–΄μžλ₯Ό κ°€μ Έμ•Ό ν•©λ‹ˆλ‹€.
  • κΈ°λ³Έ ν‚€(Primary Key)λ₯Ό @Id μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ λ°˜λ“œμ‹œ 지정해야 ν•©λ‹ˆλ‹€.

5️⃣ μš”μ•½.

  • @EntityλŠ” JPA(Java Persistence API) μ—”ν‹°ν‹°λ₯Ό μ„ μ–Έν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ, ν•΄λ‹Ή 클래슀λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”κ³Ό λ§€ν•‘ν•©λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 JPAλŠ” μ—”ν‹°ν‹°λ₯Ό μžλ™μœΌλ‘œ κ΄€λ¦¬ν•˜κ³ , λ°μ΄ν„°λ² μ΄μŠ€μ™€ μƒν˜Έμž‘μš©ν•  수 있게 λ©λ‹ˆλ‹€.