728x90
상속관계 매핑
객체의 상속 구조와 데이터베이스의 슈퍼타입 서브타입 관계를 매핑해주는 것
- 객체는 상속관계가 있다, 관계형 데이터베이스는 상속 관계가 없다.
- 슈퍼타입, 서브타입 관계라는 모델링 기법이 객체 상속과 유사하다.
슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법
- 각각 테이블로 변환 ㅡ> 슈퍼타입, 서브타입 테이블을 각각 생성하여 조회할 때 조인을 사용. 조인 전략
- 통합 테이블로 변환 ㅡ> 테이블을 하나만 사용하여 통합. 단일 테이블 전략
- 서브타입 테이블로 변환 ㅡ> 서브 타입마다 하나의 테이블을 생성. 구현 클래스마다 테이블 전략
주요 어노테이션
- @Inheritance(strategy=InheritanceType.XXX)
- JOINED: 조인 전략
- SINGLE_TABLE: 단일 테이블 전략
- TABLE_PER_CLASS: 구현 클래스마다 테이블 전략
- @DiscriminatorColumn(name="DTYPE")
부모 클래스에 구분 컬럼을 지정. - @DiscriminatorValue("XXX")
조인 전략
- 장점
- 테이블의 정규화
- 외래 키 참조 무결성 제약 조건을 활용할 수 있다.
- 저장공간을 효율적으로 사용할 수 있다.
- 단점
- 조회시 조인을 많이 사용하므로 성능이 저하될 수 있다.
- 조회 쿼리가 복잡하다.
- 데이터를 저장할 때 INSERT SQL문을 두 번 실행한다.
단일 테이블 전략
테이블을 하나만 사용한다. 구분 컬럼(DTYPE)으로 어떤 자식 데이터가 저장되었는지 구분한다.
- 장점
- 조인이 필요 없으므로 일반적으로 조회 성능이 가장 빠르다.
- 한 테이블만 보고 쿼리를 짜기 때문에 조회 쿼리가 단순하다.
- 단점
- 자식 엔티티가 매핑한 컬럼은 모두 null 허용해야 한다.(데이터 무결성 위반)
- 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있다. 상황에 따라서 조회 성능이 느려질 수 있다.
구현 클래스마다 테이블 전략
자식 엔티티마다 테이블을 만든다. 자식 테이블 각각에 필요한 컬럼이 모두 있다.
※ 이 전략은 데이터베이스 설계자와 ORM 전문가 둘 다 추천 하지 않는다.
- 장점
- 서브 타입을 명확하게 구분해서 처리할 때 효과적이다.
- not null 제약조건 사용이 가능하다.
- 단점
- 여러 자식 테이블을 함께 조회할 때 성능이 느리다.(UNION SQL을 사용하므로)
- 자식 테이블을 통합해서 쿼리하기 어렵다.
@MappedSuperclass
공통 매핑 정보가 필요할 때 사용(id, name)
테이블과 매핑하지 않고 공통 속성만 사용하고 싶을 때 부모 클래스에 두고 사용
- 상속관계 매핑과 관련이 없다.
- 엔티티가 아니다, 테이블과 매핑 하지 않는다.
(테이블과 관계가 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할) - 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공
주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용 - 조회, 검색 불가(em.find(BaseEntity) 불가)
- 직접 생성해서 사용할 일이 없으므로 추상 클래스 권장
- 참고: @Entity 클래스는 엔티티나 @MappedSuperclass로 지정한 클래스만 상속 가능
김영한님의 팁
- 테이블 설계 시, 우선적으로 조인 전략을 고려하되, 테이블이 간단하고 데이터 확장성이 낮을 경우에는 단일 테이블 전략으로 전환하는 것이 좋다.
- 초기 단계의 애플리케이션은 객체지향적 설계를 적용하여 진행하되, 장점과 단점의 트레이드오프가 명확해지는 시점이 오면 시스템을 개비(재구성)하는 것이 바람직하다.
마무리
프로젝트를 하기 전에 강의를 들었을 때는 이론적인 단어들이 크게 와닿지 않았는데, 프로젝트를 마무리하고 강의를 들으니 조인 테이블 전략을 사용하다 단일 테이블 전략으로 전환했을 때가 생각나면서 이해가 쉽게 되고 정리가 잘 되는 것을 느꼈다.
아직까진 JPA의 기본이라 그런가 MyBatis 썼을 때와 큰 차이를 못 느끼고 있지만 SQL문을 따로 작성하지 않아도 된다는 게 신기하고 더 공부하고 싶어지는 느낌...?
뒤로 갈수록 더 복잡하고 공부하기 어렵겠지만 꾸준히 하다 보면 어느 정돈 적응이 되겠지...하면서 진도를 나가고 있다.
참고 문헌 : 자바 ORM 표준 JPA 프로그래밍 / 김영한
'JPA' 카테고리의 다른 글
자바 ORM 표준 JPA 기본편 - 영속성 전이 (0) | 2024.04.24 |
---|---|
자바 ORM 표준 JPA 기본편 - 프록시와 연관관계 관리 (0) | 2024.04.17 |
자바 ORM 표준 JPA 기본편 - 다양한 연관관계 매핑 (0) | 2024.04.04 |
자바 ORM 표준 JPA 기본편 - 연관관계 매핑 기초 (4) | 2024.04.01 |
자바 ORM 표준 JPA 기본편 - 엔티티 매핑 (0) | 2024.03.29 |