ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JPA] 상속관계 맀핑과 @MappedSuperclass
    Back-end/JPA 2022. 4. 27. 00:00

    πŸ“Œ 상속관계 맀핑

    μ™Όμͺ½) DB μŠˆνΌνƒ€μž… μ„œλΈŒνƒ€μž…, 였λ₯Έμͺ½) 객체의 상속

     

    상속관계 맀핑이 ν•„μš”ν•œ 이유

    • κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λŠ” 상속 관계가 μ—†λ‹€.
    • λ°μ΄ν„°λ² μ΄μŠ€μ˜ μŠˆνΌνƒ€μž… μ„œλΈŒνƒ€μž… 관계 λͺ¨λΈλ§ 기법이 객체의 상속과 μœ μ‚¬ν•˜λ‹€.
    • 객체의 상속 ꡬ쑰와 λ°μ΄ν„°λ² μ΄μŠ€μ˜ μŠˆνΌνƒ€μž… μ„œλΈŒνƒ€μž… 관계λ₯Ό λ§€ν•‘ν•˜λŠ” 것이 ν•„μš”ν•˜λ‹€.

     

    λ°μ΄ν„°λ² μ΄μŠ€μ˜ μŠˆνΌνƒ€μž… μ„œλΈŒνƒ€μž… 논리 λͺ¨λΈμ„ μ‹€μ œ 물리 λͺ¨λΈλ‘œ κ΅¬ν˜„ν•˜λŠ” 방법

    • μŠˆνΌνƒ€μž…κ³Ό μ„œλΈŒνƒ€μž…μ„ 각각의 ν…Œμ΄λΈ”λ‘œ λ³€ν™˜ → 쑰인 μ „λž΅
    • 톡합 ν…Œμ΄λΈ”(μ„œλΈŒνƒ€μž…μ— μžˆλŠ” λͺ¨λ“  μ»¬λŸΌμ„ μŠˆνΌνƒ€μž…μ— ν•˜λ‚˜λ‘œ 톡합)둜 λ³€ν™˜ → 단일 ν…Œμ΄λΈ” μ „λž΅
    • μ„œλΈŒνƒ€μž… ν…Œμ΄λΈ”λ‘œ λ³€ν™˜(μ„œλΈŒνƒ€μž… μ»¬λŸΌμ— μŠˆνΌνƒ€μž…μ— μžˆλŠ” λͺ¨λ“  속성을 ν¬ν•¨ν•˜λ„λ‘ ꡬ성) → κ΅¬ν˜„ ν΄λž˜μŠ€λ§ˆλ‹€ ν…Œμ΄λΈ” 생성 μ „λž΅

     

    πŸ“Œ κ°μ²΄ 관점 μ£Όμš” μ–΄λ…Έν…Œμ΄μ…˜

    @Inheritance(strategy = InheritanceType.XXX)

    • JOINED : 쑰인 μ „λž΅
    • SINGLE_TABLE : 단일 ν…Œμ΄λΈ” μ „λž΅
    • TABLE_PER_CLASS : κ΅¬ν˜„ ν΄λž˜μŠ€λ§ˆλ‹€ ν…Œμ΄λΈ” 생성 μ „λž΅

     

    @DiscriminatorColumn(name = "DTYPE")

    • κ΅¬λΆ„μž 컬럼λͺ… 지정
    • default 컬럼λͺ…이 "DTYPE"μž„

     

    @DiscriminatorValue("BOOK")

    • @DiscriminatorColumnμ—μ„œ μ„€μ •ν•œ μ»¬λŸΌμ— μ €μž₯될 μ—”ν‹°ν‹° ν΄λž˜μŠ€λ³„ κ°’ 지정

     

    πŸ“Œ 1) 쑰인 μ „λž΅

    μ™Όμͺ½) 객체 상속, 였λ₯Έμͺ½) DBμ—μ„œ 쑰인 μ „λž΅ μ‚¬μš©

    • μŠˆνΌνƒ€μž…(객체 κ΄€μ μ—μ„œλŠ” λΆ€λͺ¨ 클래슀)κ³Ό μ„œλΈŒνƒ€μž…(객체 κ΄€μ μ—μ„œλŠ” μžμ‹ 클래슀)이 각각 ν…Œμ΄λΈ”λ‘œ μƒμ„±λœ λ’€, 1:1 μ£Όμ‹λ³„μž κ΄€κ³„λ‘œ μ—°κ²°λœλ‹€.
    • μŠˆνΌνƒ€μž… ν…Œμ΄λΈ”μ΄ μ–΄λŠ μ„œλΈŒνƒ€μž… ν…Œμ΄λΈ”κ³Ό μ—°κ΄€λ˜λŠ”μ§€ κ΅¬λ³„ν•˜κΈ° μœ„ν•΄ μŠˆνΌνƒ€μž… ν…Œμ΄λΈ”μ—μ„œ κ΅¬λΆ„μž(μœ„μ˜ μ‚¬μ§„μ—μ„œ ITEM의 DTYPE)λ₯Ό 가지고 μžˆλ‹€.

     

    μž₯점

    • μŠˆνΌνƒ€μž… ν…Œμ΄λΈ”μ— μ†ν•œ μ •λ³΄λ§Œ μ‘°νšŒν•˜λŠ” 경우 SQL μž‘μ„±μ΄ νŽΈλ¦¬ν•˜λ‹€.
    • 컬럼의 쀑볡이 μ—†μœΌλ―€λ‘œ μ €μž₯곡간이 μƒλŒ€μ μœΌλ‘œ 적닀.
    • 관계에 μ˜ν•΄ λ°œμƒν•˜λŠ” μ™Έλž˜ ν‚€ μ°Έμ‘° 무결성 μ œμ•½μ‘°κ±΄ ν™œμš©μ΄ κ°€λŠ₯ν•˜λ‹€.

     

    단점

    • μŠˆνΌνƒ€μž…κ³Ό μ„œλΈŒνƒ€μž…μ˜ 정보λ₯Ό 같이 μ²˜λ¦¬ν•˜λ©΄ 항상 쑰인이 λ°œμƒν•΄μ•Ό ν•˜λ―€λ‘œ μ„±λŠ₯ μ €ν•˜λ₯Ό μΌμœΌν‚¬ 수 μžˆλ‹€.
    • 전체 ν…Œμ΄λΈ”(μŠˆνΌνƒ€μž…, μ„œλΈŒνƒ€μž… λͺ¨λ‘)을 μ‘°νšŒν•˜λŠ” κ²½μš°μ— 쑰인으둜 인해 쑰회 쿼리가 λ³΅μž‘ν•˜λ‹€.
    • 데이터 μ €μž₯μ‹œ INSERT SQL을 2번 ν˜ΈμΆœν•˜κ²Œ λœλ‹€. (이건 κ·Έλ ‡κ²Œ 큰 단점이 μ•„λ‹ˆλ‹€..!)

     

    πŸ“Œ 2) 단일 ν…Œμ΄λΈ” μ „λž΅

    μ™Όμͺ½) 객체 상속, 였λ₯Έμͺ½) DBμ—μ„œ 톡합 ν…Œμ΄λΈ” μ „λž΅ μ‚¬μš©

    • μ„œλΈŒνƒ€μž…μ— μžˆλŠ” λͺ¨λ“  μ»¬λŸΌμ„ μŠˆνΌνƒ€μž…μ— ν•˜λ‚˜λ‘œ ν†΅ν•©ν•˜μ—¬ ν…Œμ΄λΈ”λ‘œ λ§Œλ“ λ‹€.
    • 각각의 μ„œλΈŒνƒ€μž… 정보λ₯Ό κ΅¬λΆ„ν•˜κΈ° μœ„ν•œ ꡬ뢄 컬럼(μœ„μ˜ κ·Έλ¦Όμ—μ„œ ITEM ν…Œμ΄λΈ”μ˜ DTYPE)이 ν•„μš”ν•˜λ‹€.

     

    μž₯점

    • 쑰인이 ν•„μš”ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ 일반적으둜 쑰회 μ„±λŠ₯이 λΉ λ₯΄κ³ , 쑰회 쿼리가 λ‹¨μˆœν•˜λ‹€.
    • μ„œλΈŒνƒ€μž…μ„ κ΅¬λΆ„ν•˜μ§€ μ•Šκ³  데이터λ₯Ό μ‘°νšŒν•˜λŠ” 경우 μ²˜λ¦¬κ°€ νŽΈλ¦¬ν•˜λ‹€.

     

    단점

    • μ„œλΈŒνƒ€μž…μ˜ μ»¬λŸΌλ“€μ€ λͺ¨λ‘ null을 ν—ˆμš©ν•΄μ•Ό ν•œλ‹€.
      • 예λ₯Ό λ“€μ–΄, νŠΉμ • μ„œλΈŒνƒ€μž…μ˜ μ»¬λŸΌμ—λŠ” Not Nullμ΄λ‚˜ 기본값을 지정해야 ν•˜μ§€λ§Œ, λ‹€λ₯Έ μ„œλΈŒνƒ€μž…μ΄ ν•΄λ‹Ή μ»¬λŸΌμ„ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 경우 κ΄€λ ¨ 섀정을 ν•  수 μ—†κ²Œ λœλ‹€.

     

    • ν…Œμ΄λΈ”μ˜ 컬럼이 λ§Žμ•„μ§€λ―€λ‘œ λ””μŠ€ν¬ μ €μž₯ 곡간이 증가할 수 있고, 항상 κ΅¬λΆ„μžμ— μ˜ν•΄ 데이터 rowλ₯Ό ꡬ뢄해야 ν•œλ‹€.
    • ν…Œμ΄λΈ”μ˜ 인덱슀λ₯Ό μ‚¬μš©ν•  경우 μ„œλΈŒνƒ€μž… κ°œλ³„λ³΄λ‹€ λ§Žμ€ 수의 데이터가 μ‘΄μž¬ν•˜λ―€λ‘œ 인덱슀 크기가 컀지고 그에 따라 인덱슀의 효율이 λ–¨μ–΄μ§ˆ 수 μžˆλ‹€.
    • μ„œλΈŒνƒ€μž…μ˜ λ‚΄μš©μ„ ν’€ μŠ€μΊ”ν•  경우 데이터 κ°œμˆ˜κ°€ 더 많기 λ•Œλ¬Έμ— μ„±λŠ₯이 떨어진닀.
    • λ‹€λ₯Έ ν…Œμ΄λΈ”κ³Ό μ„œλΈŒνƒ€μž…λ³„λ‘œ μ°Έμ‘° 무결성 쑰약이 λ³΅μž‘ν•œ 경우 데이터λ₯Ό μ²˜λ¦¬ν•˜κΈ° λ³΅μž‘ν•˜λ‹€.

     

    πŸ“Œ 3) κ΅¬ν˜„ ν΄λž˜μŠ€λ§ˆλ‹€ ν…Œμ΄λΈ” 생성 μ „λž΅

    μ™Όμͺ½) 객체 상속, 였λ₯Έμͺ½) DBμ—μ„œ κ°œλ³„ ν…Œμ΄λΈ” 생성 μ „λž΅

    • μ„œλΈŒνƒ€μž… ν…Œμ΄λΈ”μ— μŠˆνΌνƒ€μž…μ— μžˆλŠ” λͺ¨λ“  속성을 ν¬ν•¨ν•˜λ„λ‘ κ΅¬μ„±ν•œλ‹€.
    • μ„œλΈŒνƒ€μž… ν…Œμ΄λΈ” 각각 PKλ₯Ό μƒμ„±ν•˜λ―€λ‘œ, μ„œλ‘œκ°„μ˜ κ΄€κ³„λŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.
    • μ„œλΈŒνƒ€μž… ꡬ별을 μœ„ν•œ κ΅¬λΆ„μžκ°€ ν•„μš”ν•˜μ§€ μ•Šλ‹€.
    • 객체 κ΄€μ μ—μ„œ λΆ€λͺ¨ ν΄λž˜μŠ€λŠ” abstract으둜 μ„€μ •ν•΄μ•Ό ν•΄λ‹Ή ν…Œμ΄λΈ”μ΄ μΆ”κ°€λ‘œ μƒμ„±λ˜μ§€ μ•ŠλŠ”λ‹€..!

     

    μž₯점

    • μ„œλΈŒνƒ€μž…λ³„λ‘œ κ΅¬λΆ„ν•˜μ—¬ μ‘°νšŒν•  경우 가져와야 ν•  μ»¬λŸΌμ„ λͺ…ν™•ν•˜κ²Œ κ΅¬λΆ„ν•˜μ—¬ μ²˜λ¦¬ν•  수 μžˆλ‹€.
    • ν…Œμ΄λΈ” ν’€ μŠ€μΊ”μ„ ν•  경우 μœ λ¦¬ν•˜λ‹€.
    • λ‹€λ₯Έ ν…Œμ΄λΈ”κ³Ό λ³΅μž‘ν•œ μ°Έμ‘° 무결성 관계λ₯Ό μœ μ§€ν•  수 μžˆλ‹€.
    • μ»¬λŸΌμ— λŒ€ν•œ Not Null, κΈ°λ³Έκ°’ 지정이 κ°€λŠ₯ν•˜λ‹€.

     

    단점

    • μ„œλΈŒνƒ€μž…λ“€μ„ ν•¨κ»˜ μ‘°νšŒν•  λ•Œ(주둜 μŠˆνΌνƒ€μž…μ˜ 속성 μ‘°νšŒμ‹œ) UNION SQL을 μ‚¬μš©ν•΄ μ„±λŠ₯이 λŠλ¦¬λ‹€.
    • μ„œλΈŒνƒ€μž…μ„ λ¬Άμ–΄μ„œ λΆ€λΆ„ 처리 ν•΄μ•Όν•˜λŠ” 경우 λ³΅μž‘ν•˜κ±°λ‚˜ λΆˆκ°€λŠ₯ν•˜λ‹€.

     

    μΆ”κ°€

    • μ„œλΈŒνƒ€μž…λ³„λ‘œ κ΅¬λΆ„ν•˜μ—¬ μ²˜λ¦¬ν•˜λŠ” κ²½μš°κ°€ λ§Žμ€ 경우 이와 같은 섀계λ₯Ό κ³ λ €ν•΄λ³Ό 수 μžˆμ§€λ§Œ, ν†΅ν•©ν•˜μ—¬ 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” κ²½μš°κ°€ λ§Žλ‹€λ©΄ ꢌμž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.

     

    πŸ“Œ 3가지 방식 쀑 선택 κΈ°μ€€

    상황에 따라 μš”κ΅¬λ˜λŠ” νŠΈλžœμž­μ…˜μ˜ 성격과 양에 따라 κ²°μ •ν•΄μ•Ό ν•œλ‹€.

     

    νŠΈλžœμž­μ…˜μ˜ 성격

    → λ°μ΄ν„°λ₯Ό μ²˜λ¦¬ν•  λ•Œ μŠˆνΌνƒ€μž…κ³Ό μ„œλΈŒνƒ€μž… 전체에 λŒ€ν•œ μ²˜λ¦¬κ°€ λ§Žμ€μ§€ or κ°œλ³„ μ²˜λ¦¬κ°€ λ§Žμ€μ§€

     

    νŠΈλžœμž­μ…˜μ˜ μ–‘

    → κ° 엔티티에 μ‘΄μž¬ν•˜λŠ” 데이터양이 λŒ€μš©λŸ‰μΈμ§€ μ•„λ‹Œμ§€

     

    πŸ“Œ λ²ˆμ™Έ) @MappedSuperclass

    μœ„μ™€ 같이 곡톡 맀핑 정보가 μ‘΄μž¬ν•  λ•Œ μ‚¬μš©ν•œλ‹€.

     

    • 상속관계와 μ—°κ΄€ X, μ—”ν‹°ν‹° X, λ‹€λ₯Έ ν…Œμ΄λΈ”κ³Ό 맀핑 X
    • ν•΄λ‹Ή 클래슀λ₯Ό 상속 λ°›λŠ” μžμ‹ ν΄λž˜μŠ€μ— 맀핑 μ •λ³΄λ§Œ 제곡
    • 쑰회, 검색 λΆˆκ°€(entityManager.find(BaseEntity) λΆˆκ°€)
    • 주둜 좔상 클래슀둜 μ„ μ–Έ
    • ν…Œμ΄λΈ”κ³Ό 관계 μ—†κ³ , λ‹¨μˆœνžˆ μ—”ν‹°ν‹°κ°€ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 맀핑 정보λ₯Ό 가지고 μžˆλŠ” μ—­ν• 
    • 주둜 등둝일, μˆ˜μ •μΌ, λ“±λ‘μž, μˆ˜μ •μž 같이 전체 μ—”ν‹°ν‹°μ—μ„œ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©λ˜λŠ” 정보λ₯Ό λͺ¨μ„ λ•Œ μ‚¬μš©

     

    μ •λ¦¬ν•˜μžλ©΄,

    • @MappedSuperclassκ°€ μ„ μ–Έλœ 클래슀의 μš©λ„λŠ” μœ„μ—μ„œλ„ μ–ΈκΈ‰λ˜μ—ˆλ“―μ΄ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©λ˜λŠ” ν•„λ“œμ™€ μ½”λ“œμ˜ μž¬μ‚¬μš©μ„ μœ„ν•œ 것이닀.
    • @MappedSuperclassκ°€ μ„ μ–Έλœ ν΄λž˜μŠ€λŠ” μ—”ν‹°ν‹° 즉, ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”μ΄ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— λ‹€λ₯Έ ν…Œμ΄λΈ”κ³Όμ˜ 맀핑이 λΆˆκ°€λŠ₯ν•˜λ‹€.
    • @Entityκ°€ μ„ μ–Έλœ 좔상 ν΄λž˜μŠ€λŠ” 이와 달리 μ—”ν‹°ν‹° 좔상화λ₯Ό μœ„ν•΄ μ‚¬μš©λ˜λŠ” μ‹€μ§ˆμ μΈ 객체 상속 κ΄€κ³„μ˜ 엔티티이닀.

     

     

    🎈참고

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

    λ°μ΄ν„°λ² μ΄μŠ€ 섀계와 ꡬ좕 μ±…

    https://stackoverflow.com/questions/16634048/jpa-hibernate-difference-mappedsuperclass-and-entity-abstract-class

    λŒ“κΈ€

Designed by Tistory.