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