1. 상속 관계 매핑
RDBMS에는 상속 관계 없지만, 슈퍼타입, 서브타입 관계 모델링 기법이 객체 상속과 유사
객체는 상속 관계의 형태가 유일하지만,
DB설계는 아래와 같이 3가지 방식이 있다. 어떤 방법을 구현하더라도 JPA는 매핑을 지원해준다.
- JOIN 전략 : 상속 관계처럼 각각의 테이블로 변환
- 기본적, 정석적인 전략. 객체와 잘맞고, 정규화 잘 되어있고, 설계 입장에서도 좋음.
- 장점 : 테이블 정규화, 저장 공간 효율화
외래 키 참조 무결성 제약 조건 활용 가능 (Item만 보면 album, movie, book 조회 가능) - 단점 : 조회 시 JOIN을 많이 사용, 성능 저하
조회 쿼리가 복잡함, 데이터 저장 시 INSERT 2번 호출
- 단일 테이블 전략 : 논리 모델을 한 테이블로 합치는 것 (성능 때문에)
- DTYPE을 놓고 구분하는 것
- 장점 : JOIN이 필요 없음. 조회 쿼리가 단순해 조회 성능이 빠르다
- 단점 : 자식 column은 null을 허용해줘야 한다.(무결성입장에서 애매)
오히려 테이블이 커질 수 있고, 성능이 느려질 수 있다.(임계점을 넘어야 함)
- 구현 클래스마다 테이블 전략
- 공통된 것 따로 빼지 말고 각각 다 갖는 것.
- 쓰면 안되는 전략 (DBA, ORM 전문가 둘 다 추천하지 않는 전략)
- 장점 : 서브 타입을 명확하게 구분해서 처리 할 때 효과적
not null 제약조건 사용 가능 - 단점 : 부모 타입으로 조회 시(여러 자식 테이블을 조회하는 상황), 이 데이터가 있는지 없는지 UNION을 통해서 전부 다 뒤짐 (비효율적) => 자식 테이블
2. 주요 Annotation
- @Inheritance : 상속 전략을 선택하는 것
- strategy 속성 : InheritanceType.JOINED, SINGLE_TABLE, TABLE_PER_CLASS
- @DiscriminatorColumn : DTYPE, Entity명을 넣어주는 것. 넣어주는 게 좋다.
- JOIN 전략에서는 그렇게 필요없을 수 있지만,
- 단일 테이블 전략에서는 매우 중요하다
- 그렇기 때문에 단일 테이블 전략에서는 필수로 생성됨
- @DiscriminatorValue : 자식 클래스의 DTYPE 이름값을 설정 가능.
3. 구현 시 주의 사항
- 단일 테이블 전략에서는 dtype 구분을 위해 @DiscriminatorColumn 붙이는 게 필수다.
- 구현 클래스마다 테이블 전략 사용시 부모 class는 Abstract로 만들어 두는 게 좋다.
- 왜냐하면 무조건 type이 정해질 것이기 때문에 부모가 단일로 생성되어서는 안된다.
- @DiscriminatorColumn 은 불필요
- 어떤 전략을 선택할까?
- 단순해보이면 단일 테이블 전략
- 비즈니스적으로 중요하고 복잡할 경우 JOIN 전략
4. @MappedSuperclass
- 테이블과 관계 없고, 단순히 엔티티가 공통으로 사용하는 매핑정보를 모으는 역할
- 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용
- 위의 구현클래스마다 테이블 사용 전략때처럼,
엔티티가 아닌 단일 사용시 불가능하도록 추상 클래스 사용 권장 (단일로는 사용되면 안되니) - @MappedSuperclass 또는 @Entity 선택 (Table화가 필요하다면 후자, 그게 아니라면 전)
- BaseEntity 같은 거 만들어 두면 요긴하게 쓰인다. (나중에 JPA에서 자동으로 지정할 수도 있음.)
5. 실전에서 상속관계의 사용 고민
데이터가 충분히 작으면 상속관계가 잘 되지만, 데이터가 충분히 크면 잘 안되는 경우도 있을 수 있다.
처음에는 객체지향적으로 설계하다가
데이터가 커져서 Trade-off를 생각해야 할 경우가 온다면,
JSON을 말아 넣던지 하는 방식으로 진행하는 것을 생각해보기.
'정보 > Database' 카테고리의 다른 글
JPA와 데이터 타입 (2) | 2024.11.17 |
---|---|
프록시, JPA 최적화 (0) | 2024.11.17 |
연관 관계 Mapping (2) (1) | 2024.11.15 |
연관 관계 Mapping (1) (0) | 2024.11.15 |
Entity Mapping (3) | 2024.11.15 |