ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA(6) - 상속관계매핑,MappedSuperclass
    카테고리 없음 2024. 1. 11. 15:22

     

    - 관계형 데이터베이스는 상속 관계 없음

    - 슈퍼타입, 서브타입 관계라는 모델링 기법이 객체 상속과 유사하다.

       -> 상속관계 매핑은 객체의 상속구조와 DB의 슈퍼타입 서브타입 관계를 매핑하는 것 

     

    1. 상속관계 매핑

     

    - 슈퍼타입 서브타입 논리모델을 실제 물리 모델로 구현하는 방법

     

    - > 각각 테이블로 변환 : 조인전략

    - > 통합 테이블로 변환 : 단일 테이블 전략

    - > 서브타입 테이블로 변환 : 구현 클래스별 테이블 전략 

     

     

    @Inheritance(stratrgy=inheritanceType.XXX)
    
    // JOINED : 조인전략
    // SINFLE_TABLE : 단일 테이블 
    // TABLE_PER_CLASS : 구현 클래스별 테이블 전략
    
    @DiscriminatorColumn(name="DTYPE") //부모에 넣어주면 자동으로 자식 엔티티명 넣은 DTYPE컬럼 만들어준다.
    @DiscriminatorValue("XXX") // 자식 엔티티에서 테이블 저장시 엔티티명 말고 다른거 사용하고 싶을 때

     

    2. 조인전략 사용

     

    출처: JPA기본편(김영한) - 인프런

     

    - ITEM 테이블을 만들고 속성을 상속

    - 상속받은 ALBUM, MOVIE, BOOK 테이블은 ITEM의 기본키를 FK이자 PK로 사용 

    - 각자 필요한 필드 선언 

     

    * ALBUM을 업데이트하면, INSERT를 두번 날리고, 조회는 한번에 가능 

    @Entity
    @Inheritance(strategy=InheritanceType.JOINED)
    @DiscriminatorColumn(name="DTYPE")
    public class Item{
    	
        @Id @GeneratedValue
        @Column(name="ITEM_ID")
        private Long id;
        
        private String name;
        private int Price;
        
    }
    
    @Entity
    public class ALBUM extends Item{
    
    	private String artist
    }
    
    //..

     

     

    장점 : 테이블 정규화, 외래키 참조 무결성 조건 활용가능, 저장공간 효율적 

    단점: 조회시 조인이 많이들어감, 조회쿼리 복잡, 데이터 저장시 SQL 2번 호출 

     

     

    3. 단일 테이블 전략 

     

     

    출처: JPA기본편(김영한) - 인프런

     

     

    @Entity
    @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(name="DTYPE")
    public class Item{
    	
        @Id @GeneratedValue
        @Column(name="ITEM_ID")
        private Long id;
        
        private String name;
        private int Price;
        
    }
    
    @Entity
    @DiscriminatorValue(name="A")
    public class ALBUM extends Item{
    
    	private String artist
    }
    
    //..

     

    장점: 조인이 필요없어서 조회성능이 좋고, 쿼리가 단순

    단점: 자식엔티티가 매핑한 컬럼은 모두 null허용, 테이블이 커져서 조회성능이 떨어질 수도 있다.

     

    *조인전략에서 단일테이블로 넘어가는건 손쉽게 가능 

     

    - 구현 클래스마다 테이블 전략 

     

    > ORM 전문가, DB 설계자 둘 다 추천 X

     

    장점: 서브 타입을 명확하게 구분해서 처리할 때 효과적, not null 제약조건 사용가능

    단점 : 여러 자식 테이블을 함께 조회할 때 성능이 느림 (UNION SQL 필요), 자식 테이블 통합 쿼리 어려움

     

    * Item item = em.find(item.class,1L) -> 자식테이블 모두 UNION해서 찾아야함

      정산 쿼리를 미리 짜두었는데, 추후에 item이 추가되면 다시 짜야함...

     

     

    4. MappedSuperclass

     

    출처: JPA기본편(김영한) - 인프런

     

    > 공통 매핑 정보가 필요할 때 사용한다.

    > 상속관계와는 전~혀 상관없음 그냥 id나 name처럼 모두에게 포함될 정보같은거 한번에 넣기 위해 사용

    > 엔티티X, 테이블과 매핑X, 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공 

    > 조회 검색 불가 (em.find(BaseEntity) 불가) 

    > 직접 생성해서 사용할 일이 없음으로 추상 클래스 권장 

     

     

    @MappedSuperclass
    public abstract class BaseEntity {
    
    private String createdBy;
    
    private LocalDateTime createdDate;
    
    private String lastModifiedBy;
    
    private LocalDateTime lastModifiedDate;
    
    }
    
    @Entity
    public class Member extends BaseEntity {    ...}

     

    @MappedSuperclass는 

    테이블과 관계 없고 단순히 엔티티가 공통으로 사용하는 매핑 정보 모으는 역할 

    주로 등록일, 수정일, 등록자, 수정자와 같은 전체 엔티티에서 공통으로 적용하는 정보 모을 때 사용

     

    *엔티티는 같은 엔티티나 MappedSuperclass로 정한 클래스만 상속가능함! 

    *실무에서는 너무 복잡한 상속관계는 그냥 포기! 하는 경우도 있다함 단일테이블로 만들면되긴하니깐..

Designed by Tistory.