κ³ κΈ‰ 맀핑 (상속관계 맀핑)

κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ—λŠ” 상속 관계가 μ—†λ‹€. λ‹€λ§Œ λ…Όλ¦¬μ μœΌλ‘œ μŠˆνΌνƒ€μž… μ„œλΈŒνƒ€μž… κ΄€κ³„λΌλŠ” λͺ¨λΈλ§ 기법이 객체의 상속과 μœ μ‚¬ν•˜λ‹€. 상속관계 λ§€ν•‘μ΄λž€, 객체의 상속ꡬ쑰와 DB 의 μŠˆνΌνƒ€μž… μ„œλΈŒνƒ€μž… 관계λ₯Ό λ§€ν•‘ν•˜λŠ” κ²ƒμœΌλ‘œ, 3가지 μ „λž΅μœΌλ‘œ 맀핑할 수 μžˆλ‹€.

πŸ₯ μ£Όμš” μ–΄λ…Έν…Œμ΄μ…˜

μ–΄λ…Έν…Œμ΄μ…˜μ„€λͺ…μ „λž΅
@Inheritance상속관계λ₯Ό 맀핑할 λ•Œ λΆ€λͺ¨ ν΄λž˜μŠ€μ— λ‹¬μ•„μ€˜μ•Ό ν•œλ‹€.JOINED: 쑰인 μ „λž΅, SINGLE_TABLE : 단일 ν…Œμ΄λΈ” μ „λž΅, TABLE_PER_CLASS : κ΅¬ν˜„ ν΄λž˜μŠ€λ§ˆλ‹€ ν…Œμ΄λΈ”μ„ μƒμ„±ν•˜λŠ” μ „λž΅
@DiscriminatorColumn(name=”DTYPE”)λΆ€λͺ¨ ν΄λž˜μŠ€μ— 달아쀀닀. DBμ—μ„œλŠ” 상속관계가 μ—†κΈ° λ•Œλ¬Έμ— insert된 데이터가 μ–΄λ–€ μ„œλΈŒνƒ€μž…μ˜ 데이터인지 ν™•μΈν•˜κΈ°κ°€ μ–΄λ ΅λ‹€. κ·Έλž˜μ„œ DTYPE 을 λ”°λ‘œ μ„€μ •ν•˜μ—¬ μš΄μ˜μ—μ„œ ν™•μΈν•˜κΈ° νŽΈν•˜κ²Œ ν•œλ‹€.name 은 μ•„λ¬΄κ±°λ‚˜ 넣어도 μƒκ΄€μ—†μ§€λ§Œ default κ°€ DTYPE 이기도 ν•˜κ³  보톡 DTYPE 을 μ“΄λ‹€.
@DiscriminatorValue(β€œname”)μžμ‹ ν΄λž˜μŠ€μ— 달아쀀닀. μŠˆνΌνƒ€μž…μ— insert 될 DTYPE 이름을 μ„€μ •ν•  수 μžˆλ‹€. ν•„μˆ˜λŠ” μ•„λ‹˜.default λ‘œλŠ” 클래슀λͺ…이 λ“€μ–΄κ°„λ‹€.

🧩  쑰인 μ „λž΅

좜처: μžλ°” ORM ν‘œμ€€ JPA ν”„λ‘œκ·Έλž˜λ° - 기본편 (μΈν”„λŸ°)

Β 

  • μŠˆνΌνƒ€μž…μ˜ PK λ₯Ό μ„œλΈŒνƒ€μž…μ΄ FK 둜 μ°Έμ‘°ν•˜λŠ” ꡬ쑰둜 μ„€κ³„ν•œ 경우 쑰인 μ „λž΅μ„ μ‚¬μš©ν•  수 μžˆλ‹€.

  • μ™Έλž˜ ν‚€ μ°Έμ‘° 무결성 μ œμ•½μ‘°κ±΄μ„ ν™œμš©ν•  수 μžˆλ‹€λŠ” μž₯점이 μžˆλ‹€.

// 슈퍼 νƒ€μž… (λΆ€λͺ¨ 클래슀) : λΆ€λͺ¨ 클래슀λ₯Ό μ‚¬μš©ν•  일이 없을 경우 좔상 클래슀둜 μ„ μ–Έν•œλ‹€.

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn
public abstract class Item {

    @Id @GeneratedValue
    private Long id;

    private String name;
    private int price;

}

// μ„œλΈŒ νƒ€μž… (μžμ‹ 클래슀)

@Entity
public class Album extends Item {
    private String artist;
}

@Entity
public class Movie extends Item {
    private String director;
    private String actor;
}

@Entity
public class Book extends Item {
    private String author;
    private String isbn;
}

Β 

🧩  단일 ν…Œμ΄λΈ” μ „λž΅

좜처: μžλ°” ORM ν‘œμ€€ JPA ν”„λ‘œκ·Έλž˜λ° - 기본편 (μΈν”„λŸ°)

Β 

  • λͺ¨λ“  μ„œλΈŒ νƒ€μž…μ˜ μΉΌλŸΌμ„ λΆ€λͺ¨ νƒ€μž…μ— ν•©μ³μ„œ 단일 ν…Œμ΄λΈ”λ‘œ μ„€κ³„ν•œ κ²½μš°μ—λŠ” 단일 ν…Œμ΄λΈ” μ „λž΅μ„ μ‚¬μš©ν•œλ‹€.

  • 이 κ²½μš°μ—λŠ” 쑰인이 ν•„μš” μ—†μœΌλ―€λ‘œ 일반적으둜 쑰회 μ„±λŠ₯이 λΉ λ₯΄κ³ , 쿼리가 λ‹¨μˆœν•˜λ‹€.

  • λ‹€λ§Œ, μžμ‹ ν΄λž˜μŠ€κ°€ λ§€ν•‘ν•˜λŠ” μ»¬λŸΌμ€ λͺ¨λ‘ null 을 ν—ˆμš©ν•΄μ•Ό ν•œλ‹€λŠ” 단점이 μžˆλ‹€.

  • 단일 ν…Œμ΄λΈ” μ „λž΅μ˜ 경우, 식별을 μœ„ν•œ DTYPE 이 λ°˜λ“œμ‹œ ν•„μš”ν•΄μ„œ κ°œλ°œμžκ°€ μ„€μ •ν•˜μ§€ μ•Šμ•„λ„ ν•˜μ΄λ²„λ„€μ΄νŠΈκ°€ μžλ™μœΌλ‘œ μƒμ„±ν•œλ‹€.


// 슈퍼 νƒ€μž… (λΆ€λͺ¨ 클래슀)

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn
public class Item {

    @Id @GeneratedValue
    private Long id;

    private String name;
    private int price;

}

// μ„œλΈŒ νƒ€μž… (μžμ‹ 클래슀)

@Entity
public class Album extends Item {
    private String artist;
}

@Entity
public class Movie extends Item {
    private String director;
    private String actor;
}

@Entity
public class Book extends Item {
    private String author;
    private String isbn;
}

Β 

🧩 γ€€κ΅¬ν˜„ ν΄λž˜μŠ€λ§ˆλ‹€ ν…Œμ΄λΈ” 생성 μ „λž΅

좜처: μžλ°” ORM ν‘œμ€€ JPA ν”„λ‘œκ·Έλž˜λ° - 기본편 (μΈν”„λŸ°)

Β 

  • μ„œλΈŒ νƒ€μž…μ— 슈퍼 νƒ€μž…μ˜ μΉΌλŸΌμ„ μ „λΆ€ λ„£μ–΄μ„œ 각각 λ³„κ°œμ˜ ν…Œμ΄λΈ”μ„ μƒμ„±ν•˜λŠ” 경우 μ‚¬μš©ν•  수 μžˆλŠ” μ „λž΅μ΄λ‹€.

  • κ·ΈλŸ¬λ‚˜ 일반적으둜 ꢌμž₯λ˜μ§€ μ•ŠλŠ”λ‹€ …

Β 

πŸ₯ γ€€@MappedSuperclass

  • 상속 κ΄€κ³„μ—μ„œ μ‚¬μš©ν•˜λŠ” 맀핑은 μ•„λ‹˜ ❌

  • λͺ¨λ“  ν΄λž˜μŠ€μ—μ„œ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 맀핑 정보가 μžˆμ„ λ•Œ 쀑볡 μž…λ ₯이 νž˜λ“€κΈ° λ•Œλ¬Έμ— λ”°λ‘œ 클래슀λ₯Ό λ§Œλ“€μ–΄ μƒμ†λ°›λŠ” ν˜•μ‹μœΌλ‘œ μ‚¬μš©ν•˜κ²Œ λ˜λŠ”λ°, 그럴 λ•Œ λΆ™μ΄λŠ” μ–΄λ…Έν…Œμ΄μ…˜μ΄λ‹€.

  • 곡톡 맀핑 정보λ₯Ό 담은 ν΄λž˜μŠ€λŠ” 직접 μƒμ„±ν•΄μ„œ μ‚¬μš©ν•  일이 μ—†μœΌλ―€λ‘œ abstract 으둜 λ§Œλ“œλŠ” 것을 ꢌμž₯ν•œλ‹€.

  • λ§ˆμ°¬κ°€μ§€λ‘œ κ·Έμ € 곡톡 μ •λ³΄λ§Œ λ“€μ–΄μžˆλŠ” 클래슀이기 λ•Œλ¬Έμ— μ—”ν‹°ν‹°κ°€ μ•„λ‹ˆκ³ , ν…Œμ΄λΈ”κ³Ό λ§€ν•‘ν•˜λŠ”κ²Œ μ•„λ‹ˆλ‹€.


// 곡톡 정보 클래슀

@MappedSuperclass
public abstract class BaseEntity {

    private String createdBy;
    private LocalDateTime createdDate;

}

// 곡톡 정보λ₯Ό μ‚¬μš©ν•˜λŠ” ν΄λž˜μŠ€λ“€μ€ μ „λΆ€ μƒμ†λ°›μ•„μ„œ μ‚¬μš©

@Entity
@Inheritance
public class Item extends BaseEntity {

    @Id @GeneratedValue
    private Long id;

    private String name;
    private int price;

}