# [JPA] κ³ κΈ‰ 맀핑 : 상속 관계 맀핑
Study Repository

[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을 μ‚¬μš©ν•΄μ•Ό ν•˜κΈ° 떄문에 μ„±λŠ₯이 느리고 μžμ‹ ν…Œμ΄λΈ”μ„ ν†΅ν•©ν•΄μ„œ μΏΌλ¦¬ν•˜κΈ° μ–΄λ ΅μŠ΅λ‹ˆλ‹€.

이 μ „λž΅μ„ μΆ”μ²œν•˜μ§€ μ•ŠλŠ” λ°©λ²•μž…λ‹ˆλ‹€. 이런 μ „λž΅λ„ μžˆκ΅¬λ‚˜ μ •λ„λ‘œλ§Œ μ•Œμ•„λ‘‘μ‹œλ‹€.

λΈ”λ‘œκ·Έμ˜ 정보

Study Repository

rlaehddnd0422

ν™œλ™ν•˜κΈ°