[JPA] κ³ κΈ λ§€ν : μμ κ΄κ³ 맀ν
by rlaehddnd0422κ΄κ³ν λ°μ΄ν°λ² μ΄μ€μλ μμμ΄λΌλ κ°λ μ΄ μλ λμ μμκ³Ό μ μ¬ν μνΌνμ μλΈνμ κ΄κ³λΌλ λͺ¨λΈλ§ κΈ°λ²μ΄ μμ΅λλ€.
ORMμμμ μμκ΄κ³ 맀νμ μνΌνμ μλΈνμ κ΄κ³λ₯Ό 맀νμ λ§ν©λλ€.
μνΌνμ μλΈνμ λ Όλ¦¬ λͺ¨λΈμ μ€μ 물리 λͺ¨λΈμΈ ν μ΄λΈλ‘ ꡬνν λλ 3κ°μ§ λ°©λ²μ΄ μμ΅λλ€.
1. κ°κ°μ ν μ΄λΈλ‘ λ³ν (μ‘°μΈ μ λ΅) : μνΌνμ μλΈνμ μν°ν°λ₯Ό λͺ¨λ κ°κ° ν μ΄λΈλ‘ λ§λ€κ³ μ‘°νν λ μ‘°μΈμ μ¬μ©νλ λ°©λ²
2. ν΅ν© ν μ΄λΈλ‘ λ³ν (λ¨μΌ ν μ΄λΈ μ λ΅): μλΈνμ μν°ν°μ μνΌνμ μν°ν°λ₯Ό νκ³³μ λͺ¨μ νλμ μν°ν°λ‘ κ΄λ¦¬νλ λ°©λ²μ λλ€.
3. μλΈνμ ν μ΄λΈλ‘ λ³ν (ꡬν ν΄λμ€λ§λ€ ν μ΄λΈ μ λ΅) : μλΈνμ μν°ν°λ₯Ό λͺ¨λ κ°κ° ν μ΄λΈλ‘ λ§λ€κ³ , μμ ν μ΄λΈμ΄ λΆλͺ¨ ν μ΄λΈμ κΈ°λ³Έν€λ₯Ό κ·Έλ
μ‘°μΈ μ λ΅
μνΌνμ μλΈνμ μν°ν°λ₯Ό λͺ¨λ κ°κ° ν μ΄λΈλ‘ λ§λ€κ³ , μμ ν μ΄λΈμ΄ λΆλͺ¨ ν μ΄λΈμ κΈ°λ³Έν€λ₯Ό λ°μμ κΈ°λ³Έ ν€ + μΈλν€μΈ 볡ν©ν€λ₯Ό μ¬μ©νλ μ λ΅μ λλ€.
μνΌνμ μλΈνμ κ΄κ³λ₯Ό μ‘°μΈμ λ΅μΌλ‘ 맀νν λλ Dtypeμ μ¬μ©ν©λλ€.
κ°μ²΄λ νμ μΌλ‘ ꡬλΆν μ μμ§λ§ ν μ΄λΈμλ νμ μ κ°λ μ΄ μκΈ° λλ¬Έμ Dtypeμ ꡬλΆνλ 컬λΌμ μΆκ°ν΄μΌ ν©λλ€.
μλ₯Ό λ€μ΄ Itemμ΄λΌλ λΆλͺ¨ μν°ν°, Itemμ μμλ°μ μμ μν°ν° Album, Movie, Book μν°ν°κ° μλ€κ³ ν΄λ΄ μλ€.
μ΄ μμκ΄κ³λ₯Ό μνΌνμ μλΈνμ μ‘°μΈμ λ΅μΌλ‘ 맀νν΄λ΄ μλ€.
Super Type - Item
@Entity
@Inheritance(strategy = InheritanceType.JOINED) // μ‘°μΈ μ λ΅μΌλ‘ μνΌ-μλΈνμ
맀ν
@DiscriminatorColumn(name = "DTYPE") // μμ κ΅¬λΆ μ»¬λΌμ Dtypeμ μ€μ
public abstract class Item { // μ€μ μν°ν°λ‘ μ¬μ©νμ§ μμ λ μΆμ ν΄λμ€λ‘ μ μΈ
@Id @GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name;
private int price;
...
}
- μμ 맀νμ λΆλͺ¨ ν΄λμ€μ @Inheritanceλ₯Ό μ¬μ©ν΄μΌ ν©λλ€. κ·Έλ¦¬κ³ λ§€ν μ λ΅μ μ‘°μΈ μ λ΅μ μ¬μ©νλ―λ‘ startegy μμ±μ Inheritance.JOINEDλ‘ μ€μ νμ΅λλ€.
- μΆκ°μ μΌλ‘ κ΄κ³ν λ°μ΄ν°λ² μ΄μ€μλ νμ μ κ°λ μ΄ μκΈ° λλ¬Έμ μμ κ΅¬λΆ μ»¬λΌμ @DiscriminatorColuimn μ΄λ Έν μ΄μ μ DtypeμΌλ‘ μ§μ ν΄μ€λλ€.
- λΆλͺ¨ μν°ν°λ₯Ό μ€μ λ‘ λ°μ΄ν°λ² μ΄μ€μμ ν μ΄λΈλ‘ μ¬μ©νμ§ μλ κ²½μ°μλ μΆμ ν΄λμ€λ‘ μ μΈν΄μ 맀νν΄μ€λλ€.
Sub Type - Album
@Entity
@DiscriminatorValue("A")
public class Album extends Item{
private String artist;
}
- Itemμ μμλ°μ μμ ν΄λμ€μ΄λ―λ‘ extends ν€μλλ₯Ό μ¬μ©ν©μλ€.
- μν°ν°λ₯Ό μ μ₯ν λ κ΅¬λΆ μ»¬λΌμ μ λ ₯ν κ°μ μ§μ ν©λλ€. λ§μ½ λ³λλ‘ μ§μ νμ§ μμΌλ©΄ ν΄λμ€ μ΄λ¦μΌλ‘ μλ μ§μ λ©λλ€.
λ§μ½ μμ ν μ΄λΈμ κΈ°λ³Έ ν€ μ»¬λΌλͺ (item_id)λ₯Ό λ³κ²½νκ³ μΆμ κ²½μ°
@PrimaryKeyJoinColumn(name = "μ§μ νκ³ μΆμ 컬λΌλͺ ")μΌλ‘ λ³κ²½ν μ μμ΅λλ€.
μ‘°μΈμ λ΅ μ₯-λ¨μ
μ₯μ
- ν
μ΄λΈμ΄ μ κ·ν λ©λλ€.
- μ€λ³΅ λ°μ΄ν°λ₯Ό μ΅μν ν¨μΌλ‘μ¨ μ μ₯곡κ°μ ν¨μ¨μ μΌλ‘ μ¬μ© κ°λ₯ ( κ°κ°μ μν°ν°λ₯Ό λ³λμ ν μ΄λΈλ‘ μμ±νμ§ μκ³ , νμν νλλ§μ κ°κ°μ ν μ΄λΈμ μ μ₯νμ¬ μ μ₯곡κ°μ ν¨μ¨μ μΌλ‘ μ¬μ©ν μ μμ΅λλ€. )
- μΈλ ν€ μ°Έμ‘° λ¬΄κ²°μ± μ μ½μ‘°κ±΄μ νμ© κ°λ₯ : μ°Έμ‘°νλ ν
μ΄λΈμ 무결μ±μ΄ μ μ§λμ΄ λ°μ΄ν° μΌκ΄μ± 보μ₯
- μλ₯Όλ€μ΄, μμ μν°ν°κ° λΆλͺ¨ μν°ν°λ₯Ό μ°Έμ‘°νκ³ μλ€λ©΄, μΈλν€ μ°Έμ‘° λ¬΄κ²°μ± μ μ½μ‘°κ±΄μ μ¬μ©νμ¬ λΆλͺ¨ μν°ν°μ κΈ°λ³Έν€ κ°μ΄ λ³κ²½λκ±°λ μμ λ λ μμ μν°ν°μμλ μΈλν€ κ°μ ν¨κ» μμ νκ±°λ μμ νμ¬ λ°μ΄ν° μΌκ΄μ±μ 보μ₯ν©λλ€.
λ¨μ
- μ‘°νν λ joinμ΄ λ§μ΄ μ¬μ©λλ―λ‘ μ±λ₯μ΄ μ νλ μ μλ€.
- λ±λ‘ν λ insert SQLμ nλ² μ€ν
λ¨μΌ ν μ΄λΈ μ λ΅
μ΄λ¦ κ·Έλλ‘ ν μ΄λΈμ νλλ§ μ¬μ©ν΄μ κ΅¬λΆ μ»¬λΌμΌλ‘ μ΄λ€ μμ λ°μ΄ν°κ° μ μ₯λμλμ§ κ΅¬λΆνλ μ λ΅μ λλ€. ν ν μ΄λΈ λ΄μμ μ‘°ννλ―λ‘ μΌλ°μ μΌλ‘ μ‘°νκ° κ°μ₯ λΉ λ¦ λλ€.
μμ μν°ν°κ° 맀νν 컬λΌμ λͺ¨λ nullμ νμ©νλλ‘ μ€μ ν΄μΌ ν©λλ€.
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="DTYPE")
public abstract class Item{
@Id @GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name;
private int price;
...
}
@Entity
@DiscriminatorValue("A")
public class Album extends Item {...}
@Entity
@DiscriminatorValue("M")
public class Movie extends Item {...}
@Entity
@DiscriminatorValue("B")
public class Book extends Item {...}
- @Inheritance.strategyλ₯Ό InheritanceType.SINGLE_TABLE λ‘ μ€μ νλ©΄ λ¨μΌ ν μ΄λΈ μ λ΅μ μ¬μ©ν©λλ€.
- ν
μ΄λΈ νλμ λͺ¨λ κ²μ ν΅ν©νλ―λ‘ κ΅¬λΆ μ»¬λΌμ νμλ‘ μ¬μ©ν΄μΌ ν©λλ€.
- DtypeμΌλ‘ μ΄λ€ μμ λ°μ΄ν°κ° μ μ₯λμλμ§ κ΅¬λΆνκΈ° λλ¬Έμ λ°λμ @DiscriminatorColumnμ μ€μ ν΄μ£Όμ΄μΌν©λλ€.
μ₯μ
- join νμ§ μκ³ μ‘°νν μ μμ΄μ μ‘°ν μ±λ₯μ΄ λΉ λ¦
λλ€.
- select * from item where ..
- μ‘°ν μΏΌλ¦¬κ° λ¨μν©λλ€.
λ¨μ
- μμ μν°ν°κ° 맀νν 컬λΌμ λͺ¨λ nullμ νμ©ν΄μΌ ν©λλ€.
- λ¨μΌ ν μ΄λΈμ λͺ¨λ κ²μ μ μ₯νλ―λ‘ ν μ΄λΈμ΄ μ»€μ§ μ μμ΅λλ€.
ꡬν ν΄λμ€λ§λ€ ν μ΄λΈ μ λ΅
μμ μν°ν°λ§λ€ ν μ΄λΈμ κ°κ° λ§λλ λ°©μμ λλ€.
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@DiscriminatorColumn(name="DTYPE")
public abstract class Item{
@Id @GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name;
private int price;
...
}
@Entity
public class Album extends Item {...}
@Entity
public class Movie extends Item {...}
@Entity
public class Book extends Item {...}
- @Inheritance.strategyλ₯Ό InheritanceType.TABLE_PER_CLASS λ‘ μ€μ νλ©΄ ꡬν ν΄λμ€λ§λ€ ν μ΄λΈ μ λ΅μ μ¬μ©ν©λλ€.
- μ΄ μ λ΅μ μμ μν°ν°λ§λ€ ν μ΄λΈμ λ§λλλ€.
- not null μ μ½μ‘°κ±΄μ μ¬μ©ν μ μκ³ , μλΈνμ μ ꡬλΆν΄μ μ²λ¦¬ν λ ν¨κ³Όμ μ λλ€.
μ¬λ¬ μμ ν μ΄λΈμ ν¨κ» μ‘°νν λ UNIONμ μ¬μ©ν΄μΌ νκΈ° λλ¬Έμ μ±λ₯μ΄ λλ¦¬κ³ μμ ν μ΄λΈμ ν΅ν©ν΄μ 쿼리νκΈ° μ΄λ ΅μ΅λλ€.
μ΄ μ λ΅μ μΆμ²νμ§ μλ λ°©λ²μ λλ€. μ΄λ° μ λ΅λ μꡬλ μ λλ‘λ§ μμλ‘μλ€.
'π Backend > Spring Data JPA' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[JPA] νλ‘μ(Proxy)μ μ§μ°λ‘λ©(Lazy Loading) (0) | 2023.05.04 |
---|---|
[JPA] κ³ κΈ λ§€ν : 맀ν μ λ³΄λ§ μ 곡νκΈ° using @MappedSuperClass (0) | 2023.05.03 |
[JPA] λ€λλ€ λ¨λ°©ν₯, μλ°©ν₯ μ°κ΄κ΄κ³ 맀ν (0) | 2023.05.02 |
[JPA] λ€λμΌ, μΌλλ€, μΌλμΌ (λ¨λ°©ν₯, μλ°©ν₯) μ°κ΄κ΄κ³ 맀ν (0) | 2023.05.01 |
[JPA] μ°κ΄κ΄κ³ 맀ν - μλ°©ν₯ μ°κ΄κ΄κ³ (1) | 2023.04.30 |
λΈλ‘κ·Έμ μ 보
Study Repository
rlaehddnd0422