ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #JPA-12 상속관계 매핑
    JPA 2021. 2. 19. 11:00

    [출처] 인프런 김영한 강사님 -자바 ORM 표준 JPA 프로그래밍 기본

     

    상속관계 매핑


    • 관계형 데이터베이스는 상속 관계X 

    • RDB에 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사 

    • 상속관계 매핑: 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑

    논리모델                                                                                     물리모델

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

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

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

        • 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략

     

     

    •  @Inheritance(strategy=InheritanceType.XXX)

        • JOINED: 조인 전략

        • SINGLE_TABLE: 단일 테이블 전략

        • TABLE_PER_CLASS: 구현 클래스마다 테이블 전략

    • @DiscriminatorColumn(name=“DTYPE”)

    • @DiscriminatorValue(“XXX”)

     

    조인 전략

    (데이터가 필요하면  JOIN으로 가져오는 것 insert는 두번 pk,fk로 조인해서 가져옴)

    조인 전략
    위에 객체를 설계한것처럼 매핑이된다.

    @DiscriminatorColumn을 설정해줌으로서 Dtype이 생기게 된다.

    @Entity name은 클래스명인데 DiscriminatorValue를 통해서 해당 D타입을 바꿀 수 있다                                  

     

    장점

        • 테이블 정규화 

        • 외래 키 참조 무결성 제약조건 활용가능(가격을가지고 정산하면 Item 테이블만 보면된다.)

        • 저장공간 효율화(딱 정규확 되있기 때문에)

    단점

        • 조회시 조인을 많이 사용, 성능 저하 

        • 조회 쿼리가 복잡함 

        • 데이터 저장시 INSERT SQL 2번 호출 (이건 생각보다 큰 단점이 아니다. -)

        • 단일 테이블이랑 비교했을 때는 복잡한게 단점이다. 

     

    단일 테이블 전략

    (논리 모델을 한테이블로 합치는 것)

    한테이블에 다넣고 Dtype으로 Album인지 Book인지 Movie인지 구분하는 것이다.

    위에 객체를 설계한것처럼 매핑이된다.

    SINGLE_TABLE은 JOINT 전략과 다르게 @DiscriminatorColumn를 하지않아도 DTYPE이 걸려 있다.

    왜나하면 조인 전략은 테이블이라도 분리되어 있으니 다른테이블을 보고 뭐구나 를 알수 있는데 SINGLE_TABLE은 그걸 알수 없기 때문에 DTYPE이 추가되어 DTYPE으로 구분해야한다.

     

    DTYPE은 운영상 있는게 좋다.~~

      

    • 장점 

        • 조인이 필요 없으므로 일반적으로 조회 성능이 빠름 

        • 조회 쿼리가 단순함 

        • 쿼리가 한번만 나라간다. 

    • 단점 

        • 자식 엔티티가 매핑한 컬럼은 모두 null 허용 

        • 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있다. 상 황에 따라서 조회 성능이 오히려 느려질 수 있다.

     

     

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

    (구체적인 테이블을 만들고 거기안에 속성을 다넣음, 중복은 발생함.)

    추상클래스로 만들어서 table을 만들지 않는다.

    이 전략은 데이터베이스 설계자와 ORM 전문가 둘 다 추천X

    뭔가 묶이는게 없다 .ex) 정산을 해야하는데 새로운게 추가가 될때마다 정산 테이블에 대한 정산 을 다시짜야함.

    장점

        • 서브 타입을 명확하게 구분해서 처리할 때 효과적

        • not null 제약조건 사용 가능

    단점

        • 여러 자식 테이블을 함께 조회할 때 성능이 느림(UNION SQL 필요) 데이터가 여기 있는지 없는지

          table을 다찔러봐야한다. 굉장히 비효율 적으로 동작한다.

        • 자식 테이블을 통합해서 쿼리하기 어려움

     

     TIP. 조인 전략을 기본으로 하되, 너무 단순한경우에는 단일 테이블 전략을 많이한다.

     

    @MappedSuperclass(상속관계 매핑이랑 관계가 없다.)

    • 공통 매핑 정보가 필요할 때 사용(id, name) <뭔가 속성만 상속받아서 쓰고 싶을 떄 만든다.>

    그냥 여기있는 속성을 같이 쓰고싶어~~~~~!!! 이런거다.

    BaseEntity class
    Member class

    • 상속관계 매핑X 

    • 엔티티X, 테이블과 매핑X (실제 createTable에 BaseEntity 테이블이 없다)

    • 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공 

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

        -> 아까전 상속 관계에서는 item으로 조회가 됐는데, 얘는 조회가 안된다. 

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

     

     

    • 테이블과 관계 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할 
    • 주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통 으로 적용하는 정보를 모을 때 사용 

    • 참고: @Entity 클래스는 엔티티나 @MappedSuperclass로 지 정한 클래스만 상속 가능

              @Entity, @MappedSuperclass

     

     

    요구사항 추가

    • 상품의 종류는 음반, 도서, 화가 있고 이후 더 확장될 수 있다. 

    • 모든 데이터는 등록일과 수정일이 필수다.

    도메인 모델
    도메인 모델 상세

     

    테이블 설계

     

    'JPA' 카테고리의 다른 글

    #JPA-14 즉시 로딩과 지연 로딩  (0) 2021.02.19
    #JPA-13 프록시  (0) 2021.02.19
    #JPA-11 다양한 연관관계 매핑  (0) 2021.02.18
    #JPA-10 연관관계 매핑 기초  (0) 2021.02.17
    #JPA-9 기본 키 매핑  (0) 2021.02.16

    댓글

Designed by Tistory.