-
7. 고급매핑웹개발/Hibernate(JPA) 2020. 4. 20. 20:23
안녕하세요 현우입니다. 이번 포스팅은 [ 고급매핑, 상속관계 매핑 이해 ] 입니다.
JPA 학습에 도움을 주신 김영한 개발자님과 김성인 개발자님에게 항상 감사드립니다 :)
참고서 http://acornpub.co.kr/book/jpa-programmig
1. 상속관계 매핑
객체는 상속관계가 있지만 관계형 데이터베이스는 상속 관계가 없다. 그나마 비슷한 모델링 기법은 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사하다. 상속관계 매핑이란 객체의 상속 구조와 DB의 슈퍼타입 서브타입 관계를 매핑하는 것 이다.
슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법은 세가지가 있다.
1. 각각 테이블로 변환시키는 조인전략
테이블을 나누고 필요시에 JOIN으로 값을 가져온다. 예를 들어 아이템 테이블에 ITEM_ID PK를 아티스트 정보를 앨범 테이블에 둔 후 ITEM과 ALBUM테이블에 각각의 INSERT 쿼리를 날리고 PK,FK로 JOIN을 해서 값을 가져온다. 그리고 컬럼을 구분하는 DTYPE 컬럼을 두는것이다.
장점
데이터가 정규화가 되있고 제약조건을 ITEM하나로 맞출 수 있어 외래키 참조 무결성 제약조건으로 값확인이 가능하다. 즉 외부 테이블에서 ITEM_ID 하나로 하위 테이블 값 참조가 가능하다. 또 저장공간의 효율성이 뛰어나다
단점
조회시 조인을 많이 사용하여 성능이 저하되고 쿼리문이 많이 복잡하다. 데이터 저장시 INSERT 쿼리가 2번 호출된다.
ITEM_ID가 명확하여 PK값 하나로 조회가 가능하다.
- DiscriminatorColumn(name = "FTYPE") : 타입명을 지정하여 어떤 테이블이 조인되서 컬럼 값이 변경되는지 알 수 있게 DTYPE를 지정해준다.
2. 단일 테이블 전략
논리 모델을 하나의 테이블에 뭉쳐놓고 DTYPE로 값을 구분한다.
- @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
장점
조인이 필요가 없으므로 조회 성능이 매우 빠르고 쿼리가 단순하다
단점
자식 엔티티가 매핑한 컬럼은 모두 null을 허용 해야한다. 단일테이블에 모든것을 저장하므로 테이블이 커질수 있으며 상황에 따라서 조회 성능이 오히려 느려질 수 있다.
3. 구현 클래스 별 테이블 전략
Item클래스를 추상화 하여 테이블에서 없애고 테이블 세개를 만들어 각각의 정보를 따로 담는다. 값의 중복을 허용하고 같은 PK값을 가지고 있다.
- @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
ITEM_ID가 명확하여 PK값 하나로 조회가 가능하다.
부모클래스 타입으로 조회하면 쿼리문이 매우 복잡하게 나간다. 모든데이터를 전부 확인해야 한다
장점
서브 타입을 명확하게 구분해서 처리할 때 효과적 이며 not null 제약조건 사용이 가능하다
단점
여러 자식 테이블을 함께 조회할때 성능이 UNION SQL 로인해 느려지고 자식 테이블을 통합해서 쿼리 하기가 어렵다.
특히 시스템이 새로운 타입이 추가가 될때 유지보수하기가 힘들어 진다.
@MappedSuperClass
공통매핑 정보가 필요할때 사용한다.
객체 입장에서 id, name라는 필드가 계속나올때, 클래스 만들 때 마다 부모클래스에다 엔티티를 두고 속성만 사용한다. DB도 분리 되어 있다. 누가 등록했고 몇시에 수정했는지 항상 있어야 한다.
상속관계가 안되고 엔티티가 아니다. 테이블과 매핑이 되지않고 오직 자식클래스는 매핑 정보만 제공한다. em.find(~~) 상속이 되지 않으므로 부모타입으로 불가능하다.
직접 생성해서 사용할 일이 없으므로 추상클래스로 생성하여 사용한다.
코드 자세히 보기
https://github.com/HyeonWuJeon/KimYoungHan-JPA
'웹개발 > Hibernate(JPA)' 카테고리의 다른 글
10. 즉시 로딩과 지연 로딩 (0) 2020.04.28 9. 프록시와 연관관계 (0) 2020.04.25 6. [JPA] 다양한 연관 관계매핑 방법 (0) 2020.04.10 5. [JPA] 양방향 연관관계와 연관관계 주인 (0) 2020.04.01 4. [JPA] 연관관계 매핑 (0) 2020.04.01