[김영한] 자바 ORM 표준 JPA 프로그래밍 - 섹션 7. @Inheritance, @DiscriminatorColumn, @DiscriminatorValue
고급매핑 - 상속관계 매핑
@Inheritance, @DiscriminatorColumn, @DiscriminatorValue
• @Inheritance(strategy=InheritanceType.XXX)
• JOINED: 조인 전략
=> 각 테이블로 생성해 기본키로 연관관계
==> 부모 객체의 id를 참조하는 각 테이블이 생성됨.
(정석)
• 장점
• 테이블 정규화
• 외래 키 참조 무결성 제약조건 활용가능
• 저장공간 효율화
• 단점
• 조회시 조인을 많이 사용, 성능 저하
• 조회 쿼리가 복잡함
• 데이터 저장시 INSERT SQL 2번 호출
• SINGLE_TABLE: 단일 테이블 전략
=> 한 테이블에 컬럼을 몰아넣어 생성한다.
• 장점
• 조인이 필요 없으므로 일반적으로 조회 성능이 빠름
• 조회 쿼리가 단순함
• 단점
• 자식 엔티티가 매핑한 컬럼은 모두 null 허용 (치명적 단점 - 데이터무결성)
• 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있다. 상황에 따라서 조회 성능이 오히려 느려질 수 있다.
• TABLE_PER_CLASS: 구현 클래스마다 테이블 전략
=> 각 테이블을 생성하고 각 테이블마다 컬럼을 따로 생성하기
==> 상속받는 자식엔티티의 테이블에 id, name, price가 각각 들어간것을 확인
(추가내용) 테이블로 생성해 Item을 별도로 조회하는 용이 아니라면 부모클래스는 추상클래스로 만드는것이 맞다.
추상클래스로 만들면 Item의 테이블이 생성되지 않으며 필드만 상속받고있는 테이블들에게 공유된다.
==> 부모 엔티티를 추상클래스로 만들면 테이블로 생성이 안되고, 일반클래스 Item으로 선언하면 테이블이 생성된다.
(실무 미사용 권장) 단일테이블 전략은 데이터베이스 설계자와 ORM 전문가 둘 다 추천X
• 장점
• 서브 타입을 명확하게 구분해서 처리할 때 효과적
• not null 제약조건 사용 가능
• 단점
• 여러 자식 테이블을 함께 조회할 때 성능이 느림(UNION SQL 필요)
• 자식 테이블을 통합해서 쿼리하기 어려움
===> 상속관계에 있는 모든 테이블을 UNION절로 전부 조회하여 찾게 되어 성능저하 이슈 발생
• @DiscriminatorColumn(name=“DTYPE”)
==> 부모 클래스에 선언하는 어노테이션
==> 테이블의 컬럼 '명'은 디폴트가 DTYPE으로 (name="컬럼명") 으로 변경 가능하다
• @DiscriminatorValue(“XXX”)
==> 자식 클래스에 선언하는 어노테이션
==> 상속관계의 테이블 컬럼의 '값'은 기본으로 엔티티명으로 들어간다. 값을 변경하고 싶다면 ("값명")으로 선언해준다.