-
#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